| 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);
|
| }
|
|
|