Index: third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.cpp |
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.cpp b/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.cpp |
index 97bbd28d76a140207b1dda0f5af4b72fa6f187de..fe3bdc469af4961c83b696dd70ed268674f2a9c5 100644 |
--- a/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.cpp |
+++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsMediaEventListener.cpp |
@@ -8,6 +8,9 @@ |
#include "core/html/HTMLMediaElement.h" |
#include "core/html/track/TextTrackList.h" |
#include "modules/media_controls/MediaControlsImpl.h" |
+#include "modules/remoteplayback/AvailabilityCallbackWrapper.h" |
+#include "modules/remoteplayback/HTMLMediaElementRemotePlayback.h" |
+#include "modules/remoteplayback/RemotePlayback.h" |
namespace blink { |
@@ -51,6 +54,23 @@ void MediaControlsMediaEventListener::Attach() { |
media_controls_->PanelElement()->addEventListener(EventTypeNames::keypress, |
this, false); |
} |
+ |
+ RemotePlayback* remote = GetRemotePlayback(); |
+ if (remote) { |
+ remote->addEventListener(EventTypeNames::connect, this); |
+ remote->addEventListener(EventTypeNames::connecting, this); |
+ remote->addEventListener(EventTypeNames::disconnect, this); |
+ |
+ // TODO(avayvod, mlamouri): Attach can be called twice. See |
+ // https://crbug.com/713275. |
+ if (remote_playback_availability_callback_id_ == -1) { |
+ remote_playback_availability_callback_id_ = |
+ remote->WatchAvailabilityInternal(new AvailabilityCallbackWrapper( |
+ WTF::Bind(&MediaControlsMediaEventListener:: |
+ OnRemotePlaybackAvailabilityChanged, |
+ WrapPersistent(this)))); |
+ } |
+ } |
} |
void MediaControlsMediaEventListener::Detach() { |
@@ -68,6 +88,21 @@ void MediaControlsMediaEventListener::Detach() { |
media_controls_->PanelElement()->removeEventListener( |
EventTypeNames::keypress, this, false); |
} |
+ |
+ RemotePlayback* remote = GetRemotePlayback(); |
+ if (remote) { |
+ remote->removeEventListener(EventTypeNames::connect, this); |
+ remote->removeEventListener(EventTypeNames::connecting, this); |
+ remote->removeEventListener(EventTypeNames::disconnect, this); |
+ |
+ // TODO(avayvod): apparently Detach() can be called without a previous |
+ // Attach() call. See https://crbug.com/713275 for more details. |
+ if (remote_playback_availability_callback_id_ != -1) { |
+ remote->CancelWatchAvailabilityInternal( |
+ remote_playback_availability_callback_id_); |
+ remote_playback_availability_callback_id_ = -1; |
+ } |
+ } |
} |
bool MediaControlsMediaEventListener::operator==( |
@@ -79,6 +114,10 @@ HTMLMediaElement& MediaControlsMediaEventListener::GetMediaElement() { |
return media_controls_->MediaElement(); |
} |
+RemotePlayback* MediaControlsMediaEventListener::GetRemotePlayback() { |
+ return HTMLMediaElementRemotePlayback::remote(GetMediaElement()); |
+} |
+ |
void MediaControlsMediaEventListener::handleEvent( |
ExecutionContext* execution_context, |
Event* event) { |
@@ -147,9 +186,21 @@ void MediaControlsMediaEventListener::handleEvent( |
return; |
} |
+ // RemotePlayback state change events. |
+ if (event->type() == EventTypeNames::connect || |
+ event->type() == EventTypeNames::connecting || |
+ event->type() == EventTypeNames::disconnect) { |
+ media_controls_->RemotePlaybackStateChanged(); |
+ return; |
+ } |
+ |
NOTREACHED(); |
} |
+void MediaControlsMediaEventListener::OnRemotePlaybackAvailabilityChanged() { |
+ media_controls_->RefreshCastButtonVisibility(); |
+} |
+ |
DEFINE_TRACE(MediaControlsMediaEventListener) { |
EventListener::Trace(visitor); |
visitor->Trace(media_controls_); |