Chromium Code Reviews| Index: Source/core/html/shadow/MediaControls.cpp |
| diff --git a/Source/core/html/shadow/MediaControls.cpp b/Source/core/html/shadow/MediaControls.cpp |
| index 357fea5dc236a61567265ad378edc17958dd7426..88dac54ea1be6a2f8febf96b8a2d0972a0fd3ed1 100644 |
| --- a/Source/core/html/shadow/MediaControls.cpp |
| +++ b/Source/core/html/shadow/MediaControls.cpp |
| @@ -28,6 +28,7 @@ |
| #include "core/html/shadow/MediaControls.h" |
| #include "bindings/v8/ExceptionStatePlaceholder.h" |
| +#include "core/html/shadow/MediaControlsChromiumAndroid.h" |
|
acolwell GONE FROM CHROMIUM
2014/02/10 20:32:09
nit: Surround with #if OS(ANDROID)?
philipj_slow
2014/02/11 03:00:07
Done.
|
| namespace WebCore { |
| @@ -48,9 +49,101 @@ MediaControls::MediaControls(Document& document) |
| , m_hideFullscreenControlsTimer(this, &MediaControls::hideFullscreenControlsTimerFired) |
| , m_isFullscreen(false) |
| , m_isMouseOverControls(false) |
| + , m_durationDisplay(0) |
| + , m_enclosure(0) |
| { |
| } |
| +PassRefPtr<MediaControls> MediaControls::create(Document& document) |
| +{ |
| + if (!document.page()) |
| + return 0; |
| + |
| + RefPtr<MediaControls> controls; |
| +#if OS(ANDROID) |
| + controls = adoptRef(new MediaControlsChromiumAndroid(document)); |
| +#else |
| + controls = adoptRef(new MediaControls(document)); |
| +#endif |
| + |
| + if (controls->initializeControls(document)) |
| + return controls.release(); |
| + |
| + return 0; |
| +} |
| + |
| +bool MediaControls::initializeControls(Document& document) |
| +{ |
| + // Create an enclosing element for the panel so we can visually offset the controls correctly. |
| + RefPtr<MediaControlPanelEnclosureElement> enclosure = MediaControlPanelEnclosureElement::create(document); |
| + |
| + RefPtr<MediaControlPanelElement> panel = MediaControlPanelElement::create(document); |
| + |
| + TrackExceptionState exceptionState; |
| + |
| + RefPtr<MediaControlPlayButtonElement> playButton = MediaControlPlayButtonElement::create(document); |
| + m_playButton = playButton.get(); |
| + panel->appendChild(playButton.release(), exceptionState); |
| + if (exceptionState.hadException()) |
| + return false; |
| + |
| + RefPtr<MediaControlTimelineElement> timeline = MediaControlTimelineElement::create(document, this); |
| + m_timeline = timeline.get(); |
| + panel->appendChild(timeline.release(), exceptionState); |
| + if (exceptionState.hadException()) |
| + return false; |
| + |
| + RefPtr<MediaControlCurrentTimeDisplayElement> currentTimeDisplay = MediaControlCurrentTimeDisplayElement::create(document); |
| + m_currentTimeDisplay = currentTimeDisplay.get(); |
| + m_currentTimeDisplay->hide(); |
| + panel->appendChild(currentTimeDisplay.release(), exceptionState); |
| + if (exceptionState.hadException()) |
| + return false; |
| + |
| + RefPtr<MediaControlTimeRemainingDisplayElement> durationDisplay = MediaControlTimeRemainingDisplayElement::create(document); |
| + m_durationDisplay = durationDisplay.get(); |
| + panel->appendChild(durationDisplay.release(), exceptionState); |
| + if (exceptionState.hadException()) |
| + return false; |
| + |
| + RefPtr<MediaControlPanelMuteButtonElement> panelMuteButton = MediaControlPanelMuteButtonElement::create(document, this); |
| + m_panelMuteButton = panelMuteButton.get(); |
| + panel->appendChild(panelMuteButton.release(), exceptionState); |
| + if (exceptionState.hadException()) |
| + return false; |
| + |
| + RefPtr<MediaControlPanelVolumeSliderElement> slider = MediaControlPanelVolumeSliderElement::create(document); |
| + m_volumeSlider = slider.get(); |
| + m_volumeSlider->setClearMutedOnUserInteraction(true); |
| + panel->appendChild(slider.release(), exceptionState); |
| + if (exceptionState.hadException()) |
| + return false; |
| + |
| + RefPtr<MediaControlToggleClosedCaptionsButtonElement> toggleClosedCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(document, this); |
| + m_toggleClosedCaptionsButton = toggleClosedCaptionsButton.get(); |
| + panel->appendChild(toggleClosedCaptionsButton.release(), exceptionState); |
| + if (exceptionState.hadException()) |
| + return false; |
| + |
| + RefPtr<MediaControlFullscreenButtonElement> fullscreenButton = MediaControlFullscreenButtonElement::create(document); |
| + m_fullScreenButton = fullscreenButton.get(); |
| + panel->appendChild(fullscreenButton.release(), exceptionState); |
| + if (exceptionState.hadException()) |
| + return false; |
| + |
| + m_panel = panel.get(); |
| + enclosure->appendChild(panel.release(), exceptionState); |
| + if (exceptionState.hadException()) |
| + return false; |
| + |
| + m_enclosure = enclosure.get(); |
| + appendChild(enclosure.release(), exceptionState); |
| + if (exceptionState.hadException()) |
| + return false; |
| + |
| + return true; |
| +} |
| + |
| void MediaControls::setMediaController(MediaControllerInterface* controller) |
| { |
| if (m_mediaController == controller) |
| @@ -75,6 +168,10 @@ void MediaControls::setMediaController(MediaControllerInterface* controller) |
| m_toggleClosedCaptionsButton->setMediaController(controller); |
| if (m_fullScreenButton) |
| m_fullScreenButton->setMediaController(controller); |
| + if (m_durationDisplay) |
| + m_durationDisplay->setMediaController(controller); |
| + if (m_enclosure) |
| + m_enclosure->setMediaController(controller); |
| } |
| void MediaControls::reset() |
| @@ -83,6 +180,10 @@ void MediaControls::reset() |
| if (!page) |
| return; |
| + double duration = m_mediaController->duration(); |
| + m_durationDisplay->setInnerText(RenderTheme::theme().formatMediaControlsTime(duration), ASSERT_NO_EXCEPTION); |
| + m_durationDisplay->setCurrentValue(duration); |
| + |
| m_playButton->updateDisplayType(); |
| updateCurrentTimeDisplay(); |
| @@ -151,6 +252,9 @@ void MediaControls::bufferingProgressed() |
| void MediaControls::playbackStarted() |
| { |
| + m_currentTimeDisplay->show(); |
| + m_durationDisplay->hide(); |
| + |
| m_playButton->updateDisplayType(); |
| m_timeline->setPosition(m_mediaController->currentTime()); |
| updateCurrentTimeDisplay(); |
| @@ -178,6 +282,26 @@ void MediaControls::playbackStopped() |
| stopHideFullscreenControlsTimer(); |
| } |
| +void MediaControls::updateCurrentTimeDisplay() |
| +{ |
| + double now = m_mediaController->currentTime(); |
| + double duration = m_mediaController->duration(); |
| + |
| + Page* page = document().page(); |
| + if (!page) |
| + return; |
| + |
| + // After seek, hide duration display and show current time. |
| + if (now > 0) { |
| + m_currentTimeDisplay->show(); |
| + m_durationDisplay->hide(); |
| + } |
| + |
| + // Allow the theme to format the time. |
| + m_currentTimeDisplay->setInnerText(RenderTheme::theme().formatMediaControlsCurrentTime(now, duration), IGNORE_EXCEPTION); |
| + m_currentTimeDisplay->setCurrentValue(now); |
| +} |
| + |
| void MediaControls::showVolumeSlider() |
| { |
| if (!m_mediaController->hasAudio()) |
| @@ -189,6 +313,11 @@ void MediaControls::showVolumeSlider() |
| void MediaControls::changedMute() |
| { |
| m_panelMuteButton->changedMute(); |
| + |
| + if (m_mediaController->muted()) |
| + m_volumeSlider->setVolume(0); |
| + else |
| + m_volumeSlider->setVolume(m_mediaController->volume()); |
| } |
| void MediaControls::changedVolume() |
| @@ -329,8 +458,7 @@ void MediaControls::createTextTrackDisplay() |
| if (m_mediaController) |
| m_textDisplayContainer->setMediaController(m_mediaController); |
| - // Insert it before the first controller element so it always displays behind the controls. |
| - insertBefore(textDisplayContainer.release(), m_panel, IGNORE_EXCEPTION); |
| + insertTextTrackContainer(textDisplayContainer.release()); |
| } |
| void MediaControls::showTextTrackDisplay() |
| @@ -355,4 +483,10 @@ void MediaControls::updateTextTrackDisplay() |
| m_textDisplayContainer->updateDisplay(); |
| } |
| +void MediaControls::insertTextTrackContainer(PassRefPtr<MediaControlTextTrackContainerElement> textTrackContainer) |
| +{ |
| + // Insert it before the first controller element so it always displays behind the controls. |
| + insertBefore(textTrackContainer, m_enclosure); |
| +} |
| + |
| } |