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

Side by Side 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, 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "config.h"
6 #include "modules/webmidi/MIDIAccessInitializer.h"
7
8 #include "bindings/v8/ScriptFunction.h"
9 #include "bindings/v8/ScriptPromise.h"
10 #include "bindings/v8/ScriptPromiseResolverWithContext.h"
11 #include "core/dom/DOMError.h"
12 #include "core/dom/Document.h"
13 #include "modules/webmidi/MIDIAccess.h"
14 #include "modules/webmidi/MIDIController.h"
15 #include "modules/webmidi/MIDIOptions.h"
16
17 namespace WebCore {
18
19 class MIDIAccessInitializer::PostAction : public ScriptFunction {
20 public:
21 static PassOwnPtr<MIDIAccessInitializer::PostAction> create(v8::Isolate* iso late, WeakPtr<MIDIAccessInitializer> owner, State state) { return adoptPtr(new P ostAction(isolate, owner, state)); }
22
23 private:
24 PostAction(v8::Isolate* isolate, WeakPtr<MIDIAccessInitializer> owner, State state): ScriptFunction(isolate), m_owner(owner), m_state(state) { }
25 virtual ScriptValue call(ScriptValue value) OVERRIDE
26 {
27 if (!m_owner.get())
28 return value;
29 m_owner->doPostAction(m_state);
30 return value;
31 }
32
33 WeakPtr<MIDIAccessInitializer> m_owner;
34 State m_state;
35 };
36
37 MIDIAccessInitializer::~MIDIAccessInitializer()
38 {
39 ASSERT(m_state != Requesting);
40 }
41
42 MIDIAccessInitializer::MIDIAccessInitializer(const MIDIOptions& options, MIDIAcc ess* access)
43 : m_state(Requesting)
44 , m_weakPtrFactory(this)
45 , m_options(options)
46 , m_sysexEnabled(false)
47 , m_access(access)
48 {
49 m_accessor = MIDIAccessor::create(this);
50 }
51
52 void MIDIAccessInitializer::didAddInputPort(const String& id, const String& manu facturer, const String& name, const String& version)
53 {
54 m_access->didAddInputPort(id, manufacturer, name, version);
55 }
56
57 void MIDIAccessInitializer::didAddOutputPort(const String& id, const String& man ufacturer, const String& name, const String& version)
58 {
59 m_access->didAddOutputPort(id, manufacturer, name, version);
60 }
61
62 void MIDIAccessInitializer::didStartSession(bool success, const String& error, c onst String& message)
63 {
64 if (success)
65 m_resolver->resolve(m_access);
66 else
67 m_resolver->reject(DOMError::create(error, message));
68 }
69
70 void MIDIAccessInitializer::setSysexEnabled(bool enable)
71 {
72 m_sysexEnabled = enable;
73 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.
74 m_accessor->startSession();
75 } else {
76 m_resolver->reject(DOMError::create("SecurityError"));
77 }
78 }
79
80 SecurityOrigin* MIDIAccessInitializer::securityOrigin() const
81 {
82 return m_access->executionContext()->securityOrigin();
83 }
84
85 void MIDIAccessInitializer::cancel()
86 {
87 if (m_state != Requesting)
88 return;
89 m_accessor.clear();
90 m_weakPtrFactory.revokeAll();
91 Document* document = toDocument(executionContext());
92 ASSERT(document);
93 MIDIController* controller = MIDIController::from(document->page());
94 ASSERT(controller);
95 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
96 m_state = Stopped;
97 }
98
99 ExecutionContext* MIDIAccessInitializer::executionContext() const
100 {
101 return m_access->executionContext();
102 }
103
104 void MIDIAccessInitializer::permissionDenied()
105 {
106 ASSERT(isMainThread());
107 m_resolver->reject(DOMError::create("SecurityError"));
108 }
109
110 ScriptPromise MIDIAccessInitializer::initialize(ScriptState* scriptState)
111 {
112 m_resolver = ScriptPromiseResolverWithContext::create(scriptState);
113 ScriptPromise promise = m_resolver->promise();
114 promise.then(PostAction::create(scriptState->isolate(), m_weakPtrFactory.cre ateWeakPtr(), Resolved),
115 PostAction::create(scriptState->isolate(), m_weakPtrFactory.createWeakPt r(), Stopped));
116
117 if (!m_options.sysex) {
118 m_accessor->startSession();
119 return promise;
120 }
121 Document* document = toDocument(executionContext());
122 ASSERT(document);
123 MIDIController* controller = MIDIController::from(document->page());
124 if (controller) {
125 controller->requestSysexPermission(this);
126 } else {
127 m_resolver->reject(DOMError::create("SecurityError"));
128 }
129 return promise;
130 }
131
132 void MIDIAccessInitializer::doPostAction(State state)
133 {
134 ASSERT(m_state == Requesting);
135 ASSERT(state == Resolved || state == Stopped);
136 if (state == Resolved) {
137 m_access->initialize(m_accessor.release(), m_sysexEnabled);
138 }
139 m_accessor.clear();
140 m_weakPtrFactory.revokeAll();
141 m_state = state;
142 }
143
144 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698