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

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

Issue 311733004: 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
Index: Source/modules/webmidi/MIDIAccessInitializer.cpp
diff --git a/Source/modules/webmidi/MIDIAccessInitializer.cpp b/Source/modules/webmidi/MIDIAccessInitializer.cpp
index 8e75f96b64c3603d984b1c9cd61342d55109c5ed..9195d1bea2e8cdae7d8c880ec689b928bc407364 100644
--- a/Source/modules/webmidi/MIDIAccessInitializer.cpp
+++ b/Source/modules/webmidi/MIDIAccessInitializer.cpp
@@ -5,66 +5,74 @@
#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 {
-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(ScriptState* scriptState, const MIDIOptions& options, Navigator* navigator, Client* client)
+ : m_resolver(ScriptPromiseResolverWithContext::create(scriptState))
+ , m_options(options)
+ , m_sysexEnabled(false)
+ , m_client(client)
+{
+ m_resolver->keepObjectWhilePending(navigator);
+}
MIDIAccessInitializer::~MIDIAccessInitializer()
{
- ASSERT(m_state != Requesting);
+ // It is safe to cancel a request which is already finished or canceld.
+ Document* document = toDocument(executionContext());
+ ASSERT(document);
+ MIDIController* controller = MIDIController::from(document->frame());
+ ASSERT(controller);
+ controller->cancelSysexPermissionRequest(this);
}
-MIDIAccessInitializer::MIDIAccessInitializer(const MIDIOptions& options, MIDIAccess* access)
- : m_state(Requesting)
- , m_weakPtrFactory(this)
- , m_options(options)
- , m_sysexEnabled(false)
- , m_access(access)
+ScriptPromise MIDIAccessInitializer::start()
{
+ ScriptPromise promise = m_resolver->promise();
m_accessor = MIDIAccessor::create(this);
+
+ if (!m_options.sysex) {
+ m_accessor->startSession();
+ return promise;
+ }
+ Document* document = toDocument(executionContext());
+ ASSERT(document);
+ MIDIController* controller = MIDIController::from(document->frame());
+ if (controller) {
+ controller->requestSysexPermission(this);
+ } else {
+ reject(DOMError::create("SecurityError"));
+ }
+ return promise;
}
void MIDIAccessInitializer::didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version)
{
- m_access->didAddInputPort(id, manufacturer, name, version);
+ 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)
{
- m_access->didAddOutputPort(id, manufacturer, name, version);
+ m_portDescriptors.append(PortDescriptor(id, manufacturer, name, MIDIPort::MIDIPortTypeOutput, 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));
+ if (success) {
+ resolve(MIDIAccess::create(m_accessor.release(), m_sysexEnabled, m_portDescriptors, executionContext()));
+ } else {
+ reject(DOMError::create(error, message));
+ }
}
void MIDIAccessInitializer::setSysexEnabled(bool enable)
@@ -73,71 +81,31 @@ void MIDIAccessInitializer::setSysexEnabled(bool enable)
if (enable)
m_accessor->startSession();
else
- m_resolver->reject(DOMError::create("SecurityError"));
+ reject(DOMError::create("SecurityError"));
}
SecurityOrigin* MIDIAccessInitializer::securityOrigin() const
{
- return m_access->executionContext()->securityOrigin();
+ return executionContext()->securityOrigin();
}
-void MIDIAccessInitializer::cancel()
+void MIDIAccessInitializer::resolve(PassRefPtrWillBeRawPtr<MIDIAccess> access)
{
- if (m_state != Requesting)
- return;
- m_accessor.clear();
- m_weakPtrFactory.revokeAll();
- Document* document = toDocument(executionContext());
- ASSERT(document);
- MIDIController* controller = MIDIController::from(document->frame());
- ASSERT(controller);
- controller->cancelSysexPermissionRequest(this);
- m_state = Stopped;
+ m_resolver->resolve(access);
+ m_client->didFinishMIDIAccessInitialization(this);
+ // |this| may be deleted here.
}
-ExecutionContext* MIDIAccessInitializer::executionContext() const
+void MIDIAccessInitializer::reject(PassRefPtrWillBeRawPtr<DOMError> error)
{
- return m_access->executionContext();
+ m_resolver->reject(error);
+ m_client->didFailMIDIAccessInitialization(this);
+ // |this| may be deleted here.
}
-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();
- return promise;
- }
- Document* document = toDocument(executionContext());
- ASSERT(document);
- MIDIController* controller = MIDIController::from(document->frame());
- if (controller) {
- controller->requestSysexPermission(this);
- } else {
- m_resolver->reject(DOMError::create("SecurityError"));
- }
- return promise;
-}
-
-void MIDIAccessInitializer::doPostAction(State state)
+ExecutionContext* MIDIAccessInitializer::executionContext() const
{
- ASSERT(m_state == Requesting);
- ASSERT(state == Resolved || state == Stopped);
- if (state == Resolved) {
- m_access->initialize(m_accessor.release(), m_sysexEnabled);
- }
- m_accessor.clear();
- m_weakPtrFactory.revokeAll();
- m_state = state;
+ return m_resolver->scriptState()->executionContext();
}
} // namespace WebCore

Powered by Google App Engine
This is Rietveld 408576698