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

Side by Side Diff: third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp

Issue 2484973005: [Blink, RemotePlaybackAPI] Create WebRemotePlaybackClient in HTMLMediaElement ctor to avoid lazy in… (Closed)
Patch Set: Removed <v8.h> from HTMLMediaElement.cpp Created 4 years, 1 month 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
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/remoteplayback/RemotePlayback.h" 5 #include "modules/remoteplayback/RemotePlayback.h"
6 6
7 #include "bindings/core/v8/ScriptPromiseResolver.h" 7 #include "bindings/core/v8/ScriptPromiseResolver.h"
8 #include "bindings/modules/v8/RemotePlaybackAvailabilityCallback.h" 8 #include "bindings/modules/v8/RemotePlaybackAvailabilityCallback.h"
9 #include "core/HTMLNames.h" 9 #include "core/HTMLNames.h"
10 #include "core/dom/DOMException.h" 10 #include "core/dom/DOMException.h"
(...skipping 22 matching lines...) Expand all
33 return disconnectedValue; 33 return disconnectedValue;
34 } 34 }
35 35
36 ASSERT_NOT_REACHED(); 36 ASSERT_NOT_REACHED();
37 return disconnectedValue; 37 return disconnectedValue;
38 } 38 }
39 39
40 } // anonymous namespace 40 } // anonymous namespace
41 41
42 // static 42 // static
43 RemotePlayback* RemotePlayback::create(ScriptState* scriptState, 43 RemotePlayback* RemotePlayback::create(HTMLMediaElement& element) {
44 HTMLMediaElement& element) { 44 return new RemotePlayback(element);
45 DCHECK(element.document().frame());
46 DCHECK(scriptState);
47
48 RemotePlayback* remotePlayback = new RemotePlayback(scriptState, element);
49 element.setRemotePlaybackClient(remotePlayback);
50
51 return remotePlayback;
52 } 45 }
53 46
54 RemotePlayback::RemotePlayback(ScriptState* scriptState, 47 RemotePlayback::RemotePlayback(HTMLMediaElement& element)
55 HTMLMediaElement& element)
56 : ActiveScriptWrappable(this), 48 : ActiveScriptWrappable(this),
57 m_scriptState(scriptState),
58 m_state(element.isPlayingRemotely() 49 m_state(element.isPlayingRemotely()
59 ? WebRemotePlaybackState::Connected 50 ? WebRemotePlaybackState::Connected
60 : WebRemotePlaybackState::Disconnected), 51 : WebRemotePlaybackState::Disconnected),
61 m_availability(element.hasRemoteRoutes()), 52 m_availability(element.hasRemoteRoutes()),
62 m_mediaElement(&element) {} 53 m_mediaElement(&element) {}
63 54
64 const AtomicString& RemotePlayback::interfaceName() const { 55 const AtomicString& RemotePlayback::interfaceName() const {
65 return EventTargetNames::RemotePlayback; 56 return EventTargetNames::RemotePlayback;
66 } 57 }
67 58
68 ExecutionContext* RemotePlayback::getExecutionContext() const { 59 ExecutionContext* RemotePlayback::getExecutionContext() const {
69 return &m_mediaElement->document(); 60 return &m_mediaElement->document();
70 } 61 }
71 62
72 ScriptPromise RemotePlayback::watchAvailability( 63 ScriptPromise RemotePlayback::watchAvailability(
64 ScriptState* scriptState,
73 RemotePlaybackAvailabilityCallback* callback) { 65 RemotePlaybackAvailabilityCallback* callback) {
74 ScriptPromiseResolver* resolver = 66 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
75 ScriptPromiseResolver::create(m_scriptState.get());
76 ScriptPromise promise = resolver->promise(); 67 ScriptPromise promise = resolver->promise();
77 68
78 if (m_mediaElement->fastHasAttribute(HTMLNames::disableremoteplaybackAttr)) { 69 if (m_mediaElement->fastHasAttribute(HTMLNames::disableremoteplaybackAttr)) {
79 resolver->reject(DOMException::create( 70 resolver->reject(DOMException::create(
80 InvalidStateError, "disableRemotePlayback attribute is present.")); 71 InvalidStateError, "disableRemotePlayback attribute is present."));
81 return promise; 72 return promise;
82 } 73 }
83 74
84 // TODO(avayvod): implement steps 4 and 5 of the algorithm. 75 // TODO(avayvod): implement steps 4 and 5 of the algorithm.
85 // https://crbug.com/655233 76 // https://crbug.com/655233
(...skipping 15 matching lines...) Expand all
101 // TODO(avayvod): Currently the availability is tracked for each media element 92 // TODO(avayvod): Currently the availability is tracked for each media element
102 // as soon as it's created, we probably want to limit that to when the 93 // as soon as it's created, we probably want to limit that to when the
103 // page/element is visible (see https://crbug.com/597281) and has default 94 // page/element is visible (see https://crbug.com/597281) and has default
104 // controls. If there are no default controls, we should also start tracking 95 // controls. If there are no default controls, we should also start tracking
105 // availability on demand meaning the Promise returned by watchAvailability() 96 // availability on demand meaning the Promise returned by watchAvailability()
106 // will be resolved asynchronously. 97 // will be resolved asynchronously.
107 resolver->resolve(id); 98 resolver->resolve(id);
108 return promise; 99 return promise;
109 } 100 }
110 101
111 ScriptPromise RemotePlayback::cancelWatchAvailability(int id) { 102 ScriptPromise RemotePlayback::cancelWatchAvailability(ScriptState* scriptState,
112 ScriptPromiseResolver* resolver = 103 int id) {
113 ScriptPromiseResolver::create(m_scriptState.get()); 104 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
114 ScriptPromise promise = resolver->promise(); 105 ScriptPromise promise = resolver->promise();
115 106
116 if (m_mediaElement->fastHasAttribute(HTMLNames::disableremoteplaybackAttr)) { 107 if (m_mediaElement->fastHasAttribute(HTMLNames::disableremoteplaybackAttr)) {
117 resolver->reject(DOMException::create( 108 resolver->reject(DOMException::create(
118 InvalidStateError, "disableRemotePlayback attribute is present.")); 109 InvalidStateError, "disableRemotePlayback attribute is present."));
119 return promise; 110 return promise;
120 } 111 }
121 112
122 auto iter = m_availabilityCallbacks.find(id); 113 auto iter = m_availabilityCallbacks.find(id);
123 if (iter == m_availabilityCallbacks.end()) { 114 if (iter == m_availabilityCallbacks.end()) {
124 resolver->reject(DOMException::create( 115 resolver->reject(DOMException::create(
125 NotFoundError, "A callback with the given id is not found.")); 116 NotFoundError, "A callback with the given id is not found."));
126 return promise; 117 return promise;
127 } 118 }
128 119
129 m_availabilityCallbacks.remove(iter); 120 m_availabilityCallbacks.remove(iter);
130 121
131 resolver->resolve(); 122 resolver->resolve();
132 return promise; 123 return promise;
133 } 124 }
134 125
135 ScriptPromise RemotePlayback::cancelWatchAvailability() { 126 ScriptPromise RemotePlayback::cancelWatchAvailability(
136 ScriptPromiseResolver* resolver = 127 ScriptState* scriptState) {
137 ScriptPromiseResolver::create(m_scriptState.get()); 128 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
138 ScriptPromise promise = resolver->promise(); 129 ScriptPromise promise = resolver->promise();
139 130
140 if (m_mediaElement->fastHasAttribute(HTMLNames::disableremoteplaybackAttr)) { 131 if (m_mediaElement->fastHasAttribute(HTMLNames::disableremoteplaybackAttr)) {
141 resolver->reject(DOMException::create( 132 resolver->reject(DOMException::create(
142 InvalidStateError, "disableRemotePlayback attribute is present.")); 133 InvalidStateError, "disableRemotePlayback attribute is present."));
143 return promise; 134 return promise;
144 } 135 }
145 136
146 m_availabilityCallbacks.clear(); 137 m_availabilityCallbacks.clear();
147 138
148 resolver->resolve(); 139 resolver->resolve();
149 return promise; 140 return promise;
150 } 141 }
151 142
152 ScriptPromise RemotePlayback::prompt() { 143 ScriptPromise RemotePlayback::prompt(ScriptState* scriptState) {
153 // TODO(avayvod): implement steps 5, 8, 9 of the algorithm. 144 // TODO(avayvod): implement steps 5, 8, 9 of the algorithm.
154 // https://crbug.com/647441 145 // https://crbug.com/647441
155 ScriptPromiseResolver* resolver = 146 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
156 ScriptPromiseResolver::create(m_scriptState.get());
157 ScriptPromise promise = resolver->promise(); 147 ScriptPromise promise = resolver->promise();
158 148
159 if (m_mediaElement->fastHasAttribute(HTMLNames::disableremoteplaybackAttr)) { 149 if (m_mediaElement->fastHasAttribute(HTMLNames::disableremoteplaybackAttr)) {
160 resolver->reject(DOMException::create( 150 resolver->reject(DOMException::create(
161 InvalidStateError, "disableRemotePlayback attribute is present.")); 151 InvalidStateError, "disableRemotePlayback attribute is present."));
162 return promise; 152 return promise;
163 } 153 }
164 154
165 if (m_promptPromiseResolver) { 155 if (m_promptPromiseResolver) {
166 resolver->reject(DOMException::create( 156 resolver->reject(DOMException::create(
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 } 277 }
288 278
289 DEFINE_TRACE_WRAPPERS(RemotePlayback) { 279 DEFINE_TRACE_WRAPPERS(RemotePlayback) {
290 for (auto callback : m_availabilityCallbacks.values()) { 280 for (auto callback : m_availabilityCallbacks.values()) {
291 visitor->traceWrappers(callback); 281 visitor->traceWrappers(callback);
292 } 282 }
293 EventTargetWithInlineData::traceWrappers(visitor); 283 EventTargetWithInlineData::traceWrappers(visitor);
294 } 284 }
295 285
296 } // namespace blink 286 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698