Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(163)

Unified Diff: Source/modules/webmidi/MIDIAccessInitializer.cpp

Issue 339443004: Revert of Introduce KeepAliveWhilePending to ScriptPromiseResolverWithContext. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@refactor-webmidi-initialization
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/modules/webmidi/MIDIAccessInitializer.h ('k') | Source/modules/webmidi/NavigatorWebMIDI.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « Source/modules/webmidi/MIDIAccessInitializer.h ('k') | Source/modules/webmidi/NavigatorWebMIDI.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698