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.
6 #include "modules/webmidi/MIDIAccessInitializer.h"
8 #include "bindings/core/v8/ScriptPromise.h"
9 #include "bindings/core/v8/ScriptPromiseResolver.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"
20 MIDIAccessInitializer::MIDIAccessInitializer(ScriptState* scriptState, const MIDIOptions& options)
21 : ScriptPromiseResolver(scriptState)
22 , m_requestSysex(false)
24 if (options.hasSysex())
25 m_requestSysex = options.sysex();
28 MIDIAccessInitializer::~MIDIAccessInitializer()
30 // It is safe to cancel a request which is already finished or canceld.
31 Document* document = toDocument(executionContext());
33 MIDIController* controller = MIDIController::from(document->frame());
35 controller->cancelSysexPermissionRequest(this);
38 ScriptPromise MIDIAccessInitializer::start()
40 ScriptPromise promise = this->promise();
41 m_accessor = MIDIAccessor::create(this);
43 if (!m_requestSysex) {
44 m_accessor->startSession();
47 Document* document = toDocument(executionContext());
49 MIDIController* controller = MIDIController::from(document->frame());
51 controller->requestSysexPermission(this);
53 reject(DOMError::create("SecurityError"));
58 void MIDIAccessInitializer::didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version)
61 m_portDescriptors.append(PortDescriptor(id, manufacturer, name, MIDIPort::MIDIPortTypeInput, version));
64 void MIDIAccessInitializer::didAddOutputPort(const String& id, const String& manufacturer, const String& name, const String& version)
67 m_portDescriptors.append(PortDescriptor(id, manufacturer, name, MIDIPort::MIDIPortTypeOutput, version));
70 void MIDIAccessInitializer::didStartSession(bool success, const String& error, const String& message)
74 resolve(MIDIAccess::create(m_accessor.release(), m_requestSysex, m_portDescriptors, executionContext()));
76 reject(DOMError::create(error, message));
80 void MIDIAccessInitializer::resolveSysexPermission(bool allowed)
83 m_accessor->startSession();
85 reject(DOMError::create("SecurityError"));
88 SecurityOrigin* MIDIAccessInitializer::securityOrigin() const
90 return executionContext()->securityOrigin();
93 ExecutionContext* MIDIAccessInitializer::executionContext() const
95 return scriptState()->executionContext();