Chromium Code Reviews| 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 b7f027dc9633f11a389f76155b2e94d484b07471..e5d8a085cc365e197f05c0eb1d9d181db4a7604b 100644 |
| --- a/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp |
| +++ b/third_party/WebKit/Source/modules/remoteplayback/RemotePlayback.cpp |
| @@ -10,6 +10,7 @@ |
| #include "core/html/HTMLMediaElement.h" |
| #include "modules/EventTargetModules.h" |
| #include "modules/remoteplayback/RemotePlaybackAvailability.h" |
| +#include "platform/UserGestureIndicator.h" |
| namespace blink { |
| @@ -38,22 +39,33 @@ RemotePlayback* RemotePlayback::create(HTMLMediaElement& element) |
| { |
| ASSERT(element.document().frame()); |
| - RemotePlayback* remotePlayback = new RemotePlayback( |
| - element.document().frame(), |
| - element.isPlayingRemotely() ? WebRemotePlaybackState::Connected : WebRemotePlaybackState::Disconnected, |
| - element.hasRemoteRoutes()); |
| + RemotePlayback* remotePlayback = new RemotePlayback(element); |
| element.setRemotePlaybackClient(remotePlayback); |
| return remotePlayback; |
| } |
| -RemotePlayback::RemotePlayback(LocalFrame* frame, WebRemotePlaybackState state, bool availability) |
| - : DOMWindowProperty(frame) |
| - , m_state(state) |
| - , m_availability(availability) |
| +RemotePlayback::RemotePlayback(HTMLMediaElement& element) |
| + : DOMWindowProperty(element.document().frame()) |
| + , m_state(element.isPlayingRemotely() ? WebRemotePlaybackState::Connected : WebRemotePlaybackState::Disconnected) |
| + , m_availability(element.hasRemoteRoutes()) |
| +#if !ENABLE(OILPAN) |
| + , m_mediaElement(element.createWeakPtr()) |
| +#else |
| + , m_mediaElement(&element) |
| +#endif |
| { |
| } |
| +#if ENABLE(OILPAN) |
| +RemotePlayback::~RemotePlayback() = default; |
| +#else |
| +RemotePlayback::~RemotePlayback() |
| +{ |
| + m_mediaElement->setRemotePlaybackClient(nullptr); |
| +} |
| +#endif |
| + |
| const AtomicString& RemotePlayback::interfaceName() const |
| { |
| return EventTargetNames::RemotePlayback; |
| @@ -82,6 +94,29 @@ ScriptPromise RemotePlayback::getAvailability(ScriptState* scriptState) |
| return promise; |
| } |
| +ScriptPromise RemotePlayback::connect(ScriptState* scriptState) |
| +{ |
| + ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
| + ScriptPromise promise = resolver->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::processingUserGesture()) { |
| + resolver->reject(DOMException::create(InvalidAccessError, "RemotePlayback::connect() requires user gesture.")); |
| + return promise; |
| + } |
| + |
| + if (m_state == WebRemotePlaybackState::Disconnected) { |
| + m_connectPromiseResolvers.append(resolver); |
| + m_mediaElement->requestRemotePlayback(); |
| + } else { |
| + m_mediaElement->requestRemotePlaybackControl(); |
| + resolver->resolve(false); |
| + } |
| + |
| + return promise; |
| +} |
| + |
| String RemotePlayback::state() const |
| { |
| return remotePlaybackStateToString(m_state); |
| @@ -92,6 +127,15 @@ void RemotePlayback::stateChanged(WebRemotePlaybackState state) |
| if (m_state == state) |
| return; |
| + if (state != WebRemotePlaybackState::Disconnected) { |
| + for (auto& resolver : m_connectPromiseResolvers) |
| + resolver->resolve(true); |
| + } else { |
| + for (auto& resolver : m_connectPromiseResolvers) |
| + resolver->reject(DOMException::create(AbortError, "Failed to connect to the remote device.")); |
|
mlamouri (slow - plz ping)
2016/03/31 10:15:39
That sounds like dead code. I'm not sure how you c
whywhat
2016/03/31 10:57:09
Good catch. I actually prefer resolving the pendin
|
| + } |
| + m_connectPromiseResolvers.clear(); |
| + |
| m_state = state; |
| dispatchEvent(Event::create(EventTypeNames::statechange)); |
| } |
| @@ -109,6 +153,8 @@ void RemotePlayback::availabilityChanged(bool available) |
| DEFINE_TRACE(RemotePlayback) |
| { |
| visitor->trace(m_availabilityObjects); |
| + visitor->trace(m_mediaElement); |
| + visitor->trace(m_connectPromiseResolvers); |
| RefCountedGarbageCollectedEventTargetWithInlineData<RemotePlayback>::trace(visitor); |
| DOMWindowProperty::trace(visitor); |
| } |