Index: Source/core/html/HTMLMediaElement.cpp |
diff --git a/Source/core/html/HTMLMediaElement.cpp b/Source/core/html/HTMLMediaElement.cpp |
index a30572a306341a3de4278b7a0354a2bc2a3752da..8aebbbd607b57af025ebdc337e7cb77471aa40b2 100644 |
--- a/Source/core/html/HTMLMediaElement.cpp |
+++ b/Source/core/html/HTMLMediaElement.cpp |
@@ -352,6 +352,8 @@ HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName, Document& docum |
, m_tracksAreReady(true) |
, m_haveVisibleTextTrack(false) |
, m_processingPreferenceChange(false) |
+ , m_remoteRoutesAvailable(false) |
+ , m_playingRemotely(false) |
#if ENABLE(OILPAN) |
, m_isFinalizing(false) |
, m_closeMediaSourceWhenFinalizing(false) |
@@ -2276,6 +2278,18 @@ void HTMLMediaElement::pause() |
updatePlayState(); |
} |
+void HTMLMediaElement::requestRemotePlayback() |
+{ |
+ ASSERT(m_remoteRoutesAvailable); |
+ webMediaPlayer()->requestRemotePlayback(); |
+} |
+ |
+void HTMLMediaElement::requestRemotePlaybackControl() |
+{ |
+ ASSERT(m_remoteRoutesAvailable); |
+ webMediaPlayer()->requestRemotePlaybackControl(); |
+} |
+ |
void HTMLMediaElement::closeMediaSource() |
{ |
if (!m_mediaSource) |
@@ -3180,6 +3194,27 @@ void HTMLMediaElement::mediaPlayerRequestSeek(double time) |
setCurrentTime(time, ASSERT_NO_EXCEPTION); |
} |
+void HTMLMediaElement::remoteRouteAvailabilityChanged(bool routesAvailable) |
+{ |
+ m_remoteRoutesAvailable = routesAvailable; |
+ if (hasMediaControls()) |
+ mediaControls()->refreshCastButtonVisibility(); |
+} |
+ |
+void HTMLMediaElement::connectedToRemoteDevice() |
+{ |
+ m_playingRemotely = true; |
+ if (hasMediaControls()) |
+ mediaControls()->startedCasting(); |
+} |
+ |
+void HTMLMediaElement::disconnectedFromRemoteDevice() |
+{ |
+ m_playingRemotely = false; |
+ if (hasMediaControls()) |
+ mediaControls()->stoppedCasting(); |
+} |
+ |
// MediaPlayerPresentation methods |
void HTMLMediaElement::mediaPlayerRepaint() |
{ |
@@ -3435,6 +3470,13 @@ void HTMLMediaElement::clearMediaPlayer(int flags) |
m_pendingActionFlags &= ~flags; |
m_loadState = WaitingForSource; |
+ // We can't cast if we don't have a media player. |
+ m_remoteRoutesAvailable = false; |
+ m_playingRemotely = false; |
+ if (hasMediaControls()) { |
+ mediaControls()->refreshCastButtonVisibility(); |
+ } |
+ |
if (m_textTracks) |
configureTextTrackDisplay(AssumeNoVisibleChange); |
} |
@@ -3635,7 +3677,7 @@ bool HTMLMediaElement::createMediaControls() |
void HTMLMediaElement::configureMediaControls() |
{ |
- if (!shouldShowControls() || !inDocument()) { |
+ if (!inDocument()) { |
if (hasMediaControls()) |
mediaControls()->hide(); |
return; |
@@ -3645,7 +3687,10 @@ void HTMLMediaElement::configureMediaControls() |
return; |
mediaControls()->reset(); |
- mediaControls()->show(); |
+ if (shouldShowControls()) |
+ mediaControls()->show(); |
+ else |
+ mediaControls()->hide(); |
} |
void HTMLMediaElement::configureTextTrackDisplay(VisibilityChangeAssumption assumption) |
@@ -3718,6 +3763,10 @@ void HTMLMediaElement::createMediaPlayer() |
m_player = MediaPlayer::create(this); |
+ // We haven't yet found out if any remote routes are available. |
+ m_remoteRoutesAvailable = false; |
+ m_playingRemotely = false; |
+ |
#if ENABLE(WEB_AUDIO) |
if (m_audioSourceNode && audioSourceProvider()) { |
// When creating the player, make sure its AudioSourceProvider knows about the client. |
@@ -3754,7 +3803,7 @@ void HTMLMediaElement::setMediaGroup(const AtomicString& group) |
{ |
// When a media element is created with a mediagroup attribute, and when a media element's mediagroup |
// attribute is set, changed, or removed, the user agent must run the following steps: |
- // 1. Let m [this] be the media element in question. |
+ // 1. Let _R [this] be the media element in question. |
// 2. Let m have no current media controller, if it currently has one. |
setControllerInternal(nullptr); |