| Index: Source/modules/webmidi/MIDIAccessInitializer.cpp
|
| diff --git a/Source/modules/webmidi/MIDIAccessInitializer.cpp b/Source/modules/webmidi/MIDIAccessInitializer.cpp
|
| index 036649b2a45a66a5daf8c1554b41735ca80742c2..8e75f96b64c3603d984b1c9cd61342d55109c5ed 100644
|
| --- a/Source/modules/webmidi/MIDIAccessInitializer.cpp
|
| +++ b/Source/modules/webmidi/MIDIAccessInitializer.cpp
|
| @@ -5,39 +5,113 @@
|
| #include "config.h"
|
| #include "modules/webmidi/MIDIAccessInitializer.h"
|
|
|
| +#include "bindings/v8/ScriptFunction.h"
|
| #include "bindings/v8/ScriptPromise.h"
|
| #include "bindings/v8/ScriptPromiseResolverWithContext.h"
|
| #include "core/dom/DOMError.h"
|
| #include "core/dom/Document.h"
|
| -#include "core/frame/Navigator.h"
|
| #include "modules/webmidi/MIDIAccess.h"
|
| #include "modules/webmidi/MIDIController.h"
|
| #include "modules/webmidi/MIDIOptions.h"
|
| -#include "modules/webmidi/MIDIPort.h"
|
|
|
| namespace WebCore {
|
|
|
| -MIDIAccessInitializer::MIDIAccessInitializer(ScriptState* scriptState, const MIDIOptions& options)
|
| - : ScriptPromiseResolverWithContext(scriptState, ScriptPromiseResolverWithContext::KeepAliveWhilePending)
|
| - , m_options(options)
|
| - , m_sysexEnabled(false)
|
| -{
|
| -}
|
| +class MIDIAccessInitializer::PostAction : public ScriptFunction {
|
| +public:
|
| + static PassOwnPtr<MIDIAccessInitializer::PostAction> create(v8::Isolate* isolate, WeakPtr<MIDIAccessInitializer> owner, State state) { return adoptPtr(new PostAction(isolate, owner, state)); }
|
| +
|
| +private:
|
| + PostAction(v8::Isolate* isolate, WeakPtr<MIDIAccessInitializer> owner, State state): ScriptFunction(isolate), m_owner(owner), m_state(state) { }
|
| + virtual ScriptValue call(ScriptValue value) OVERRIDE
|
| + {
|
| + if (!m_owner.get())
|
| + return value;
|
| + m_owner->doPostAction(m_state);
|
| + return value;
|
| + }
|
| +
|
| + WeakPtr<MIDIAccessInitializer> m_owner;
|
| + State m_state;
|
| +};
|
|
|
| MIDIAccessInitializer::~MIDIAccessInitializer()
|
| {
|
| - // It is safe to cancel a request which is already finished or canceld.
|
| + ASSERT(m_state != Requesting);
|
| +}
|
| +
|
| +MIDIAccessInitializer::MIDIAccessInitializer(const MIDIOptions& options, MIDIAccess* access)
|
| + : m_state(Requesting)
|
| + , m_weakPtrFactory(this)
|
| + , m_options(options)
|
| + , m_sysexEnabled(false)
|
| + , m_access(access)
|
| +{
|
| + m_accessor = MIDIAccessor::create(this);
|
| +}
|
| +
|
| +void MIDIAccessInitializer::didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version)
|
| +{
|
| + m_access->didAddInputPort(id, manufacturer, name, version);
|
| +}
|
| +
|
| +void MIDIAccessInitializer::didAddOutputPort(const String& id, const String& manufacturer, const String& name, const String& version)
|
| +{
|
| + m_access->didAddOutputPort(id, manufacturer, name, version);
|
| +}
|
| +
|
| +void MIDIAccessInitializer::didStartSession(bool success, const String& error, const String& message)
|
| +{
|
| + if (success)
|
| + m_resolver->resolve(m_access);
|
| + else
|
| + m_resolver->reject(DOMError::create(error, message));
|
| +}
|
| +
|
| +void MIDIAccessInitializer::setSysexEnabled(bool enable)
|
| +{
|
| + m_sysexEnabled = enable;
|
| + if (enable)
|
| + m_accessor->startSession();
|
| + else
|
| + m_resolver->reject(DOMError::create("SecurityError"));
|
| +}
|
| +
|
| +SecurityOrigin* MIDIAccessInitializer::securityOrigin() const
|
| +{
|
| + return m_access->executionContext()->securityOrigin();
|
| +}
|
| +
|
| +void MIDIAccessInitializer::cancel()
|
| +{
|
| + if (m_state != Requesting)
|
| + return;
|
| + m_accessor.clear();
|
| + m_weakPtrFactory.revokeAll();
|
| Document* document = toDocument(executionContext());
|
| ASSERT(document);
|
| MIDIController* controller = MIDIController::from(document->frame());
|
| - if (controller)
|
| - controller->cancelSysexPermissionRequest(this);
|
| + ASSERT(controller);
|
| + controller->cancelSysexPermissionRequest(this);
|
| + m_state = Stopped;
|
| }
|
|
|
| -ScriptPromise MIDIAccessInitializer::start()
|
| +ExecutionContext* MIDIAccessInitializer::executionContext() const
|
| {
|
| - ScriptPromise promise = this->promise();
|
| - m_accessor = MIDIAccessor::create(this);
|
| + return m_access->executionContext();
|
| +}
|
| +
|
| +void MIDIAccessInitializer::permissionDenied()
|
| +{
|
| + ASSERT(isMainThread());
|
| + m_resolver->reject(DOMError::create("SecurityError"));
|
| +}
|
| +
|
| +ScriptPromise MIDIAccessInitializer::initialize(ScriptState* scriptState)
|
| +{
|
| + m_resolver = ScriptPromiseResolverWithContext::create(scriptState);
|
| + ScriptPromise promise = m_resolver->promise();
|
| + promise.then(PostAction::create(scriptState->isolate(), m_weakPtrFactory.createWeakPtr(), Resolved),
|
| + PostAction::create(scriptState->isolate(), m_weakPtrFactory.createWeakPtr(), Stopped));
|
|
|
| if (!m_options.sysex) {
|
| m_accessor->startSession();
|
| @@ -49,50 +123,21 @@
|
| if (controller) {
|
| controller->requestSysexPermission(this);
|
| } else {
|
| - reject(DOMError::create("SecurityError"));
|
| + m_resolver->reject(DOMError::create("SecurityError"));
|
| }
|
| return promise;
|
| }
|
|
|
| -void MIDIAccessInitializer::didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version)
|
| +void MIDIAccessInitializer::doPostAction(State state)
|
| {
|
| - ASSERT(m_accessor);
|
| - m_portDescriptors.append(PortDescriptor(id, manufacturer, name, MIDIPort::MIDIPortTypeInput, version));
|
| -}
|
| -
|
| -void MIDIAccessInitializer::didAddOutputPort(const String& id, const String& manufacturer, const String& name, const String& version)
|
| -{
|
| - ASSERT(m_accessor);
|
| - m_portDescriptors.append(PortDescriptor(id, manufacturer, name, MIDIPort::MIDIPortTypeOutput, version));
|
| -}
|
| -
|
| -void MIDIAccessInitializer::didStartSession(bool success, const String& error, const String& message)
|
| -{
|
| - ASSERT(m_accessor);
|
| - if (success) {
|
| - resolve(MIDIAccess::create(m_accessor.release(), m_sysexEnabled, m_portDescriptors, executionContext()));
|
| - } else {
|
| - reject(DOMError::create(error, message));
|
| + ASSERT(m_state == Requesting);
|
| + ASSERT(state == Resolved || state == Stopped);
|
| + if (state == Resolved) {
|
| + m_access->initialize(m_accessor.release(), m_sysexEnabled);
|
| }
|
| -}
|
| -
|
| -void MIDIAccessInitializer::setSysexEnabled(bool enable)
|
| -{
|
| - m_sysexEnabled = enable;
|
| - if (enable)
|
| - m_accessor->startSession();
|
| - else
|
| - reject(DOMError::create("SecurityError"));
|
| -}
|
| -
|
| -SecurityOrigin* MIDIAccessInitializer::securityOrigin() const
|
| -{
|
| - return executionContext()->securityOrigin();
|
| -}
|
| -
|
| -ExecutionContext* MIDIAccessInitializer::executionContext() const
|
| -{
|
| - return scriptState()->executionContext();
|
| + m_accessor.clear();
|
| + m_weakPtrFactory.revokeAll();
|
| + m_state = state;
|
| }
|
|
|
| } // namespace WebCore
|
|
|