Index: Source/core/html/shadow/MediaControls.cpp |
diff --git a/Source/core/html/shadow/MediaControls.cpp b/Source/core/html/shadow/MediaControls.cpp |
index 96a6062a30494d1a8c3ab46fa5a37bf7bc650edf..6ed2e284431aa61af0049b68af49a6263ac45341 100644 |
--- a/Source/core/html/shadow/MediaControls.cpp |
+++ b/Source/core/html/shadow/MediaControls.cpp |
@@ -59,6 +59,8 @@ MediaControls::MediaControls(HTMLMediaElement& mediaElement) |
, m_volumeSlider(nullptr) |
, m_toggleClosedCaptionsButton(nullptr) |
, m_fullScreenButton(nullptr) |
+ , m_castButton(nullptr) |
+ , m_overlayCastButton(nullptr) |
, m_durationDisplay(nullptr) |
, m_enclosure(nullptr) |
, m_hideMediaControlsTimer(this, &MediaControls::hideMediaControlsTimerFired) |
@@ -82,20 +84,27 @@ bool MediaControls::initializeControls() |
{ |
TrackExceptionState exceptionState; |
+ RefPtrWillBeRawPtr<MediaControlOverlayEnclosureElement> overlayEnclosure = MediaControlOverlayEnclosureElement::create(*this); |
+ |
if (document().settings() && document().settings()->mediaControlsOverlayPlayButtonEnabled()) { |
- RefPtrWillBeRawPtr<MediaControlOverlayEnclosureElement> overlayEnclosure = MediaControlOverlayEnclosureElement::create(*this); |
RefPtrWillBeRawPtr<MediaControlOverlayPlayButtonElement> overlayPlayButton = MediaControlOverlayPlayButtonElement::create(*this); |
m_overlayPlayButton = overlayPlayButton.get(); |
overlayEnclosure->appendChild(overlayPlayButton.release(), exceptionState); |
if (exceptionState.hadException()) |
return false; |
- |
- m_overlayEnclosure = overlayEnclosure.get(); |
- appendChild(overlayEnclosure.release(), exceptionState); |
- if (exceptionState.hadException()) |
- return false; |
} |
+ RefPtrWillBeRawPtr<MediaControlCastButtonElement> overlayCastButton = MediaControlCastButtonElement::create(*this, true); |
+ m_overlayCastButton = overlayCastButton.get(); |
+ overlayEnclosure->appendChild(overlayCastButton.release(), exceptionState); |
+ if (exceptionState.hadException()) |
+ return false; |
+ |
+ m_overlayEnclosure = overlayEnclosure.get(); |
+ appendChild(overlayEnclosure.release(), exceptionState); |
+ if (exceptionState.hadException()) |
+ return false; |
+ |
// Create an enclosing element for the panel so we can visually offset the controls correctly. |
RefPtrWillBeRawPtr<MediaControlPanelEnclosureElement> enclosure = MediaControlPanelEnclosureElement::create(*this); |
@@ -144,6 +153,12 @@ bool MediaControls::initializeControls() |
if (exceptionState.hadException()) |
return false; |
+ RefPtrWillBeRawPtr<MediaControlCastButtonElement> castButton = MediaControlCastButtonElement::create(*this, false); |
+ m_castButton = castButton.get(); |
+ panel->appendChild(castButton.release(), exceptionState); |
+ if (exceptionState.hadException()) |
+ return false; |
+ |
RefPtrWillBeRawPtr<MediaControlFullscreenButtonElement> fullscreenButton = MediaControlFullscreenButtonElement::create(*this); |
m_fullScreenButton = fullscreenButton.get(); |
panel->appendChild(fullscreenButton.release(), exceptionState); |
@@ -189,6 +204,7 @@ void MediaControls::reset() |
else |
m_fullScreenButton->hide(); |
+ refreshCastButtonVisibility(); |
makeOpaque(); |
} |
@@ -204,7 +220,7 @@ void MediaControls::show() |
void MediaControls::mediaElementFocused() |
{ |
show(); |
- stopHideMediaControlsTimer(); |
+ resetHideMediaControlsTimer(); |
} |
void MediaControls::hide() |
@@ -351,6 +367,32 @@ void MediaControls::textTracksChanged() |
refreshClosedCaptionsButtonVisibility(); |
} |
+void MediaControls::refreshCastButtonVisibility() |
+{ |
+ if (mediaElement().hasRemoteRoutes()) { |
+ // The reason for the autoplay test is that some pages (e.g. vimeo.com) have an autoplay background video, which |
+ // doesn't autoplay on Chrome for Android (we prevent it) so starts paused. In such cases we don't want to automatically |
+ // show the cast button, since it looks strange and is unlikely to correspond with anything the user wants to do. |
+ // If a user does want to cast a paused autoplay video then they can still do so by touching or clicking on the |
+ // video, which will cause the cast button to appear. |
+ if (!mediaElement().shouldShowControls() && !mediaElement().autoplay() && mediaElement().paused()) { |
+ showOverlayCastButton(); |
+ } else if (mediaElement().shouldShowControls()) { |
+ m_overlayCastButton->hide(); |
+ m_castButton->show(); |
+ } |
+ } else { |
+ m_castButton->hide(); |
+ m_overlayCastButton->hide(); |
+ } |
+} |
+ |
+void MediaControls::showOverlayCastButton() |
+{ |
+ m_overlayCastButton->show(); |
+ resetHideMediaControlsTimer(); |
+} |
+ |
void MediaControls::enteredFullscreen() |
{ |
m_fullScreenButton->setIsFullscreen(true); |
@@ -365,6 +407,18 @@ void MediaControls::exitedFullscreen() |
startHideMediaControlsTimer(); |
} |
+void MediaControls::startedCasting() |
+{ |
+ m_castButton->setIsPlayingRemotely(true); |
+ m_overlayCastButton->setIsPlayingRemotely(true); |
+} |
+ |
+void MediaControls::stoppedCasting() |
+{ |
+ m_castButton->setIsPlayingRemotely(false); |
+ m_overlayCastButton->setIsPlayingRemotely(false); |
+} |
+ |
void MediaControls::defaultEventHandler(Event* event) |
{ |
HTMLDivElement::defaultEventHandler(event); |
@@ -414,6 +468,7 @@ void MediaControls::hideMediaControlsTimerFired(Timer<MediaControls>*) |
return; |
makeTransparent(); |
+ m_overlayCastButton->hide(); |
} |
void MediaControls::startHideMediaControlsTimer() |
@@ -426,6 +481,14 @@ void MediaControls::stopHideMediaControlsTimer() |
m_hideMediaControlsTimer.stop(); |
} |
+void MediaControls::resetHideMediaControlsTimer() |
+{ |
+ stopHideMediaControlsTimer(); |
+ if (!mediaElement().paused()) |
+ startHideMediaControlsTimer(); |
+} |
+ |
+ |
const AtomicString& MediaControls::shadowPseudoId() const |
{ |
DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls")); |
@@ -451,10 +514,7 @@ void MediaControls::createTextTrackDisplay() |
m_textDisplayContainer = textDisplayContainer.get(); |
// Insert it before (behind) all other control elements. |
- if (m_overlayEnclosure && m_overlayPlayButton) |
- m_overlayEnclosure->insertBefore(textDisplayContainer.release(), m_overlayPlayButton); |
- else |
- insertBefore(textDisplayContainer.release(), m_enclosure); |
+ m_overlayEnclosure -> insertBefore(textDisplayContainer.release(), m_overlayCastButton); |
Peter Beverloo
2014/09/15 12:59:38
Are you sure that this is right? Previously it wou
aberent
2014/09/16 09:44:18
No, I am not. Will fix.
|
} |
void MediaControls::showTextTrackDisplay() |