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 |