Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1054)

Unified Diff: Source/core/html/shadow/MediaControls.cpp

Issue 291163004: Implement media cast buttons (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Reenable previously crashing tests - now fixed Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/html/shadow/MediaControls.h ('k') | Source/core/rendering/RenderMediaControls.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..97ed161e97433da35dd5e1cd77f8b4b86c2cc31f 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,10 @@ void MediaControls::createTextTrackDisplay()
m_textDisplayContainer = textDisplayContainer.get();
// Insert it before (behind) all other control elements.
- if (m_overlayEnclosure && m_overlayPlayButton)
+ if (m_overlayPlayButton)
m_overlayEnclosure->insertBefore(textDisplayContainer.release(), m_overlayPlayButton);
else
- insertBefore(textDisplayContainer.release(), m_enclosure);
+ m_overlayEnclosure->insertBefore(textDisplayContainer.release(), m_overlayCastButton);
}
void MediaControls::showTextTrackDisplay()
@@ -495,6 +558,8 @@ void MediaControls::trace(Visitor* visitor)
visitor->trace(m_fullScreenButton);
visitor->trace(m_durationDisplay);
visitor->trace(m_enclosure);
+ visitor->trace(m_castButton);
+ visitor->trace(m_overlayCastButton);
HTMLDivElement::trace(visitor);
}
« no previous file with comments | « Source/core/html/shadow/MediaControls.h ('k') | Source/core/rendering/RenderMediaControls.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698