1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "config.h" 6 #include "modules/webmidi/MIDIAccessInitializer.h" 7 8 #include "bindings/v8/ScriptPromise.h" 9 #include "bindings/v8/ScriptPromiseResolverWithContext.h" 10 #include "core/dom/DOMError.h" 11 #include "core/dom/Document.h" 12 #include "core/frame/Navigator.h" 13 #include "modules/webmidi/MIDIAccess.h" 14 #include "modules/webmidi/MIDIController.h" 15 #include "modules/webmidi/MIDIOptions.h" 16 #include "modules/webmidi/MIDIPort.h" 17 18 namespace WebCore { 19 20 MIDIAccessInitializer::MIDIAccessInitializer(ScriptState* scriptState, const MIDIOptions& options) 21 : ScriptPromiseResolverWithContext(scriptState) 22 , m_options(options) 23 , m_sysexEnabled(false) 24 { 25 } 26 27 MIDIAccessInitializer::~MIDIAccessInitializer() 28 { 29 // It is safe to cancel a request which is already finished or canceld. 30 Document* document = toDocument(executionContext()); 31 ASSERT(document); 32 MIDIController* controller = MIDIController::from(document->frame()); 33 if (controller) 34 controller->cancelSysexPermissionRequest(this); 35 } 36 37 ScriptPromise MIDIAccessInitializer::start() 38 { 39 ScriptPromise promise = this->promise(); 40 m_accessor = MIDIAccessor::create(this); 41 42 if (!m_options.sysex) { 43 m_accessor->startSession(); 44 return promise; 45 } 46 Document* document = toDocument(executionContext()); 47 ASSERT(document); 48 MIDIController* controller = MIDIController::from(document->frame()); 49 if (controller) { 50 controller->requestSysexPermission(this); 51 } else { 52 reject(DOMError::create("SecurityError")); 53 } 54 return promise; 55 } 56 57 void MIDIAccessInitializer::didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version) 58 { 59 ASSERT(m_accessor); 60 m_portDescriptors.append(PortDescriptor(id, manufacturer, name, MIDIPort::MIDIPortTypeInput, version)); 61 } 62 63 void MIDIAccessInitializer::didAddOutputPort(const String& id, const String& manufacturer, const String& name, const String& version) 64 { 65 ASSERT(m_accessor); 66 m_portDescriptors.append(PortDescriptor(id, manufacturer, name, MIDIPort::MIDIPortTypeOutput, version)); 67 } 68 69 void MIDIAccessInitializer::didStartSession(bool success, const String& error, const String& message) 70 { 71 ASSERT(m_accessor); 72 if (success) { 73 resolve(MIDIAccess::create(m_accessor.release(), m_sysexEnabled, m_portDescriptors, executionContext())); 74 } else { 75 reject(DOMError::create(error, message)); 76 } 77 } 78 79 void MIDIAccessInitializer::setSysexEnabled(bool enable) 80 { 81 m_sysexEnabled = enable; 82 if (enable) 83 m_accessor->startSession(); 84 else 85 reject(DOMError::create("SecurityError")); 86 } 87 88 SecurityOrigin* MIDIAccessInitializer::securityOrigin() const 89 { 90 return executionContext()->securityOrigin(); 91 } 92 93 ExecutionContext* MIDIAccessInitializer::executionContext() const 94 { 95 return scriptState()->executionContext(); 96 } 97 98 } // namespace WebCore 99