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

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: Added UserGesture flag for tests, removed some checks in HTMLMediaElement, added layout test Created 4 years, 3 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 063d01b780ae362caac540c498ff23a6f15f231a..7125cc79c0dfd5a95f6f9c5e8d8a46140604bc48 100644
--- a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp
+++ b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp
@@ -9,6 +9,7 @@
#include "core/dom/DOMException.h"
#include "core/dom/Document.h"
#include "core/events/Event.h"
+#include "core/frame/Settings.h"
#include "core/html/HTMLMediaElement.h"
#include "modules/EventTargetModules.h"
#include "modules/remoteplayback/RemotePlaybackAvailability.h"
@@ -93,15 +94,20 @@ 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 (!UserGestureIndicator::utilizeUserGesture()) {
+ if (m_promptPromiseResolver) {
+ resolver->reject(DOMException::create(OperationError, "A prompt is already being shown for this media element."));
+ return promise;
+ }
+
+ Settings* contextSettings = m_mediaElement->document().settings();
+ bool isUserGestureRequired = !contextSettings || contextSettings->remotePlaybackRequiresUserGesture();
+ if (isUserGestureRequired && !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 +130,7 @@ bool RemotePlayback::hasPendingActivity() const
{
return hasEventListeners()
|| !m_availabilityObjects.isEmpty()
- || !m_promptPromiseResolvers.isEmpty();
+ || m_promptPromiseResolver;
}
void RemotePlayback::stateChanged(WebRemotePlaybackState state)
@@ -134,14 +140,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 +167,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);
}

Powered by Google App Engine
This is Rietveld 408576698