Index: Source/core/html/shadow/MediaControls.cpp |
diff --git a/Source/core/html/shadow/MediaControls.cpp b/Source/core/html/shadow/MediaControls.cpp |
index 8e65d275d32aae675e97f5050b16f13c429948fc..db7f1c8cbeb73cc53f2a4cf84cb9cf291df62885 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) |
@@ -81,20 +83,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); |
@@ -143,6 +152,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); |
@@ -188,6 +203,7 @@ void MediaControls::reset() |
else |
m_fullScreenButton->hide(); |
+ refreshCastButtonVisibility(); |
makeOpaque(); |
} |
@@ -203,7 +219,7 @@ void MediaControls::show() |
void MediaControls::mediaElementFocused() |
{ |
show(); |
- stopHideMediaControlsTimer(); |
+ resetHideMediaControlsTimer(); |
} |
void MediaControls::hide() |
@@ -346,6 +362,27 @@ void MediaControls::closedCaptionTracksChanged() |
refreshClosedCaptionsButtonVisibility(); |
} |
+void MediaControls::refreshCastButtonVisibility() |
+{ |
+ if (mediaElement().hasRemoteRoutes()) { |
+ 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); |
@@ -360,6 +397,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); |
@@ -403,6 +452,7 @@ void MediaControls::hideMediaControlsTimerFired(Timer<MediaControls>*) |
return; |
makeTransparent(); |
+ m_overlayCastButton->hide(); |
} |
void MediaControls::startHideMediaControlsTimer() |
@@ -415,6 +465,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")); |