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

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

Issue 2347763002: [Blink, RemotePlayback] Reject the prompt() with OperationError if there's a pending promise for th… (Closed)
Patch Set: Fixed the test Created 4 years, 2 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
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 "core/HTMLNames.h" 8 #include "core/HTMLNames.h"
9 #include "core/dom/DOMException.h" 9 #include "core/dom/DOMException.h"
10 #include "core/dom/Document.h" 10 #include "core/dom/Document.h"
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 // https://crbug.com/647441 82 // https://crbug.com/647441
83 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); 83 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
84 ScriptPromise promise = resolver->promise(); 84 ScriptPromise promise = resolver->promise();
85 85
86 if (m_mediaElement->fastHasAttribute(HTMLNames::disableremoteplaybackAttr)) { 86 if (m_mediaElement->fastHasAttribute(HTMLNames::disableremoteplaybackAttr)) {
87 resolver->reject(DOMException::create( 87 resolver->reject(DOMException::create(
88 InvalidStateError, "disableRemotePlayback attribute is present.")); 88 InvalidStateError, "disableRemotePlayback attribute is present."));
89 return promise; 89 return promise;
90 } 90 }
91 91
92 // TODO(avayvod): should we have a separate flag to disable the user gesture 92 if (m_promptPromiseResolver) {
93 // requirement (for tests) or reuse the one for the PresentationRequest::start ()? 93 resolver->reject(DOMException::create(
94 OperationError,
95 "A prompt is already being shown for this media element."));
96 return promise;
97 }
98
94 if (!UserGestureIndicator::utilizeUserGesture()) { 99 if (!UserGestureIndicator::utilizeUserGesture()) {
95 resolver->reject(DOMException::create( 100 resolver->reject(DOMException::create(
96 InvalidAccessError, "RemotePlayback::prompt() requires user gesture.")); 101 InvalidAccessError, "RemotePlayback::prompt() requires user gesture."));
97 return promise; 102 return promise;
98 } 103 }
99 104
100 if (m_state == WebRemotePlaybackState::Disconnected) { 105 if (m_state == WebRemotePlaybackState::Disconnected) {
101 m_promptPromiseResolvers.append(resolver); 106 m_promptPromiseResolver = resolver;
102 m_mediaElement->requestRemotePlayback(); 107 m_mediaElement->requestRemotePlayback();
103 } else { 108 } else {
104 m_mediaElement->requestRemotePlaybackControl(); 109 m_mediaElement->requestRemotePlaybackControl();
105 // TODO(avayvod): Need to keep the resolver until user chooses to stop 110 // TODO(avayvod): Need to keep the resolver until user chooses to stop
106 // the remote playback (resolve) or dismisses the UI (reject). 111 // the remote playback (resolve) or dismisses the UI (reject).
107 // Steps 11 and 12 of the prompt() algorithm. 112 // Steps 11 and 12 of the prompt() algorithm.
108 // https://crbug.com/647441 113 // https://crbug.com/647441
109 resolver->resolve(); 114 resolver->resolve();
110 } 115 }
111 116
112 return promise; 117 return promise;
113 } 118 }
114 119
115 String RemotePlayback::state() const { 120 String RemotePlayback::state() const {
116 return remotePlaybackStateToString(m_state); 121 return remotePlaybackStateToString(m_state);
117 } 122 }
118 123
119 bool RemotePlayback::hasPendingActivity() const { 124 bool RemotePlayback::hasPendingActivity() const {
120 return hasEventListeners() || !m_availabilityObjects.isEmpty() || 125 return hasEventListeners() || !m_availabilityObjects.isEmpty() ||
121 !m_promptPromiseResolvers.isEmpty(); 126 m_promptPromiseResolver;
122 } 127 }
123 128
124 void RemotePlayback::stateChanged(WebRemotePlaybackState state) { 129 void RemotePlayback::stateChanged(WebRemotePlaybackState state) {
125 // We may get a "disconnected" state change while in the "disconnected" 130 // We may get a "disconnected" state change while in the "disconnected"
126 // state if initiated connection fails. So cleanup the promise resolvers 131 // state if initiated connection fails. So cleanup the promise resolvers
127 // before checking if anything changed. 132 // before checking if anything changed.
128 // TODO(avayvod): cleanup this logic when we implementing the "connecting" 133 // TODO(avayvod): cleanup this logic when we implementing the "connecting"
129 // state. 134 // state.
130 if (state != WebRemotePlaybackState::Disconnected) { 135 if (m_promptPromiseResolver) {
131 for (auto& resolver : m_promptPromiseResolvers) 136 if (state != WebRemotePlaybackState::Disconnected)
132 resolver->resolve(); 137 m_promptPromiseResolver->resolve();
133 } else { 138 else
134 for (auto& resolver : m_promptPromiseResolvers) 139 m_promptPromiseResolver->reject(DOMException::create(
135 resolver->reject(DOMException::create(
136 AbortError, "Failed to connect to the remote device.")); 140 AbortError, "Failed to connect to the remote device."));
141 m_promptPromiseResolver = nullptr;
137 } 142 }
138 m_promptPromiseResolvers.clear();
139 143
140 if (m_state == state) 144 if (m_state == state)
141 return; 145 return;
142 146
143 m_state = state; 147 m_state = state;
144 dispatchEvent(Event::create(EventTypeNames::statechange)); 148 dispatchEvent(Event::create(EventTypeNames::statechange));
145 } 149 }
146 150
147 void RemotePlayback::availabilityChanged(bool available) { 151 void RemotePlayback::availabilityChanged(bool available) {
148 if (m_availability == available) 152 if (m_availability == available)
149 return; 153 return;
150 154
151 m_availability = available; 155 m_availability = available;
152 for (auto& availabilityObject : m_availabilityObjects) 156 for (auto& availabilityObject : m_availabilityObjects)
153 availabilityObject->availabilityChanged(available); 157 availabilityObject->availabilityChanged(available);
154 } 158 }
155 159
156 void RemotePlayback::promptCancelled() { 160 void RemotePlayback::promptCancelled() {
157 for (auto& resolver : m_promptPromiseResolvers) 161 if (!m_promptPromiseResolver)
158 resolver->resolve(); 162 return;
159 m_promptPromiseResolvers.clear(); 163
164 m_promptPromiseResolver->resolve();
165 m_promptPromiseResolver = nullptr;
160 } 166 }
161 167
162 DEFINE_TRACE(RemotePlayback) { 168 DEFINE_TRACE(RemotePlayback) {
163 visitor->trace(m_availabilityObjects); 169 visitor->trace(m_availabilityObjects);
164 visitor->trace(m_promptPromiseResolvers); 170 visitor->trace(m_promptPromiseResolver);
165 visitor->trace(m_mediaElement); 171 visitor->trace(m_mediaElement);
166 EventTargetWithInlineData::trace(visitor); 172 EventTargetWithInlineData::trace(visitor);
167 } 173 }
168 174
169 } // namespace blink 175 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698