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

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

Issue 311773003: Decouple MIDIAccess initialization from MIDIAccess class. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 7 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
new file mode 100644
index 0000000000000000000000000000000000000000..da77e7b3e2d4d25c9f82b817daaf81de9555e4d9
--- /dev/null
+++ b/Source/modules/webmidi/MIDIAccessInitializer.cpp
@@ -0,0 +1,144 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#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 "modules/webmidi/MIDIAccess.h"
+#include "modules/webmidi/MIDIController.h"
+#include "modules/webmidi/MIDIOptions.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()
+{
+ 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) {
Takashi Toyoshima 2014/06/04 22:03:53 It is not changed from the original, but parenthes
yhirano 2014/06/05 11:35:25 Done.
+ 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->page());
+ ASSERT(controller);
+ controller->cancelSysexPermissionRequest(this);
Takashi Toyoshima 2014/06/04 22:03:53 Related to a comment on WebMIDIPermissionRequest.h
yhirano 2014/06/05 11:35:25 Yes, request must not outlive the initializer and
+ m_state = Stopped;
+}
+
+ExecutionContext* MIDIAccessInitializer::executionContext() const
+{
+ 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();
+ 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)
+{
+ 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;
+}
+
+} // namespace WebCore

Powered by Google App Engine
This is Rietveld 408576698