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 063d01b780ae362caac540c498ff23a6f15f231a..14ffac95c1cb9e8a5262c6c3bd1440ce529e2752 100644 |
--- a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp |
+++ b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp |
@@ -93,15 +93,18 @@ 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.")); |
return promise; |
} |
if (m_state == WebRemotePlaybackState::Disconnected) { |
- m_promptPromiseResolvers.append(resolver); |
+ m_promptPromiseResolver = resolver; |
m_mediaElement->requestRemotePlayback(); |
} else { |
m_mediaElement->requestRemotePlaybackControl(); |
@@ -124,7 +127,7 @@ bool RemotePlayback::hasPendingActivity() const |
{ |
return hasEventListeners() |
|| !m_availabilityObjects.isEmpty() |
- || !m_promptPromiseResolvers.isEmpty(); |
+ || m_promptPromiseResolver; |
} |
void RemotePlayback::stateChanged(WebRemotePlaybackState state) |
@@ -134,14 +137,13 @@ 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(AbortError, "Failed to connect to the remote device.")); |
+ 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; |
@@ -162,15 +164,17 @@ 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); |
} |