Chromium Code Reviews| 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 |