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