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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp
diff --git a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp
index e30e8e4e4d32dd1ef3a9af31c151a7653fe0beba..254970a103d39f9cdb172443ca67a38a4bbf04e7 100644
--- a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp
+++ b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp
@@ -89,8 +89,13 @@ ScriptPromise RemotePlayback::prompt(ScriptState* scriptState) {
return promise;
}
- // TODO(avayvod): should we have a separate flag to disable the user gesture
- // requirement (for tests) or reuse the one for the PresentationRequest::start()?
+ if (m_promptPromiseResolver) {
+ resolver->reject(DOMException::create(
+ OperationError,
+ "A prompt is already being shown for this media element."));
+ return promise;
+ }
+
if (!UserGestureIndicator::utilizeUserGesture()) {
resolver->reject(DOMException::create(
InvalidAccessError, "RemotePlayback::prompt() requires user gesture."));
@@ -98,7 +103,7 @@ ScriptPromise RemotePlayback::prompt(ScriptState* scriptState) {
}
if (m_state == WebRemotePlaybackState::Disconnected) {
- m_promptPromiseResolvers.append(resolver);
+ m_promptPromiseResolver = resolver;
m_mediaElement->requestRemotePlayback();
} else {
m_mediaElement->requestRemotePlaybackControl();
@@ -118,7 +123,7 @@ String RemotePlayback::state() const {
bool RemotePlayback::hasPendingActivity() const {
return hasEventListeners() || !m_availabilityObjects.isEmpty() ||
- !m_promptPromiseResolvers.isEmpty();
+ m_promptPromiseResolver;
}
void RemotePlayback::stateChanged(WebRemotePlaybackState state) {
@@ -127,15 +132,14 @@ void RemotePlayback::stateChanged(WebRemotePlaybackState state) {
// before checking if anything changed.
// TODO(avayvod): cleanup this logic when we implementing the "connecting"
// state.
- if (state != WebRemotePlaybackState::Disconnected) {
- for (auto& resolver : m_promptPromiseResolvers)
- resolver->resolve();
- } else {
- for (auto& resolver : m_promptPromiseResolvers)
- resolver->reject(DOMException::create(
+ if (m_promptPromiseResolver) {
+ if (state != WebRemotePlaybackState::Disconnected)
+ m_promptPromiseResolver->resolve();
+ else
+ m_promptPromiseResolver->reject(DOMException::create(
AbortError, "Failed to connect to the remote device."));
+ m_promptPromiseResolver = nullptr;
}
- m_promptPromiseResolvers.clear();
if (m_state == state)
return;
@@ -154,14 +158,16 @@ void RemotePlayback::availabilityChanged(bool available) {
}
void RemotePlayback::promptCancelled() {
- for (auto& resolver : m_promptPromiseResolvers)
- resolver->resolve();
- m_promptPromiseResolvers.clear();
+ if (!m_promptPromiseResolver)
+ return;
+
+ m_promptPromiseResolver->resolve();
+ m_promptPromiseResolver = nullptr;
}
DEFINE_TRACE(RemotePlayback) {
visitor->trace(m_availabilityObjects);
- visitor->trace(m_promptPromiseResolvers);
+ visitor->trace(m_promptPromiseResolver);
visitor->trace(m_mediaElement);
EventTargetWithInlineData::trace(visitor);
}

Powered by Google App Engine
This is Rietveld 408576698