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

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 b9d8c7f09402b5c6c58bf18fc0c75bfc74a4ae1b..a711d9c7aa1d186aa549b671b1cec4ff1ab23ad6 100644
--- a/Source/modules/webmidi/MIDIAccessInitializer.cpp
+++ b/Source/modules/webmidi/MIDIAccessInitializer.cpp
@@ -13,58 +13,58 @@
#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(const MIDIOptions& options)
+ : m_resolver(nullptr)
+ , m_options(options)
+ , m_sysexEnabled(false)
+{
+}
MIDIAccessInitializer::~MIDIAccessInitializer()
{
- ASSERT(m_state != Requesting);
+ cancel();
}
-MIDIAccessInitializer::MIDIAccessInitializer(const MIDIOptions& options, MIDIAccess* access)
- : m_state(Requesting)
- , m_weakPtrFactory(this)
- , m_options(options)
- , m_sysexEnabled(false)
- , m_access(access)
+void MIDIAccessInitializer::start(AsyncInitializerResolver<MIDIAccessInitializer>* resolver)
{
+ m_resolver = resolver;
m_accessor = MIDIAccessor::create(this);
+
+ if (!m_options.sysex) {
+ m_accessor->startSession();
+ return;
+ }
+ Document* document = toDocument(executionContext());
+ ASSERT(document);
+ MIDIController* controller = MIDIController::from(document->page());
+ if (controller) {
+ controller->requestSysexPermission(this);
+ } else {
+ m_resolver->reject(DOMError::create("SecurityError"));
+ }
}
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
+ if (success) {
+ m_resolver->resolve(MIDIAccess::create(m_accessor.release(), m_sysexEnabled, m_portDescriptors, executionContext()));
+ } else {
m_resolver->reject(DOMError::create(error, message));
+ }
}
void MIDIAccessInitializer::setSysexEnabled(bool enable)
@@ -78,26 +78,17 @@ void MIDIAccessInitializer::setSysexEnabled(bool enable)
SecurityOrigin* MIDIAccessInitializer::securityOrigin() const
{
- return m_access->executionContext()->securityOrigin();
+ return 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->page());
ASSERT(controller);
controller->cancelSysexPermissionRequest(this);
- m_state = Stopped;
-}
-
-ExecutionContext* MIDIAccessInitializer::executionContext() const
-{
- return m_access->executionContext();
}
void MIDIAccessInitializer::permissionDenied()
@@ -106,38 +97,10 @@ void MIDIAccessInitializer::permissionDenied()
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->page());
- 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;
+ ASSERT(m_resolver);
+ return m_resolver->scriptState()->executionContext();
}
} // namespace WebCore

Powered by Google App Engine
This is Rietveld 408576698