diff options
Diffstat (limited to 'Source/WebCore/html/shadow/MediaControls.cpp')
| -rw-r--r-- | Source/WebCore/html/shadow/MediaControls.cpp | 346 |
1 files changed, 149 insertions, 197 deletions
diff --git a/Source/WebCore/html/shadow/MediaControls.cpp b/Source/WebCore/html/shadow/MediaControls.cpp index 61a3684..04bdce4 100644 --- a/Source/WebCore/html/shadow/MediaControls.cpp +++ b/Source/WebCore/html/shadow/MediaControls.cpp @@ -52,12 +52,10 @@ namespace WebCore { using namespace HTMLNames; -static const double cTimeUpdateRepeatDelay = 0.2; static const double cOpacityAnimationRepeatDelay = 0.05; MediaControls::MediaControls(HTMLMediaElement* mediaElement) : m_mediaElement(mediaElement) - , m_timeUpdateTimer(this, &MediaControls::timeUpdateTimerFired) , m_opacityAnimationTimer(this, &MediaControls::opacityAnimationTimerFired) , m_opacityAnimationStartTime(0) , m_opacityAnimationDuration(0) @@ -70,6 +68,137 @@ MediaControls::MediaControls(HTMLMediaElement* mediaElement) { } +// FIXME: This will turn into the standard element factory method once shadow DOM conversion is complete. +// (see https://bugs.webkit.org/show_bug.cgi?id=53020) +PassRefPtr<MediaControlShadowRootElement> MediaControls::create(HTMLMediaElement* mediaElement) +{ + ASSERT(!m_panel); + ASSERT(!m_muteButton); + ASSERT(!m_playButton); + ASSERT(!m_returnToRealtimeButton); + ASSERT(!m_statusDisplay); + ASSERT(!m_timelineContainer); + ASSERT(!m_currentTimeDisplay); + ASSERT(!m_timeline); + ASSERT(!m_timeRemainingDisplay); + ASSERT(!m_seekBackButton); + ASSERT(!m_seekForwardButton); + ASSERT(!m_toggleClosedCaptionsButton); + ASSERT(!m_fullscreenButton); + ASSERT(!m_muteButton); + ASSERT(!m_volumeSliderContainer); + ASSERT(!m_volumeSlider); + ASSERT(!m_volumeSliderMuteButton); + ASSERT(!m_fullScreenMinVolumeButton); + ASSERT(!m_fullScreenMaxVolumeButton); + ASSERT(!m_fullScreenVolumeSlider); + + RefPtr<MediaControlShadowRootElement> controls = MediaControlShadowRootElement::create(mediaElement); + + m_panel = MediaControlPanelElement::create(mediaElement); + + m_rewindButton = MediaControlRewindButtonElement::create(mediaElement); + m_rewindButton->attachToParent(m_panel.get()); + + m_playButton = MediaControlPlayButtonElement::create(mediaElement); + m_playButton->attachToParent(m_panel.get()); + + m_returnToRealtimeButton = MediaControlReturnToRealtimeButtonElement::create(mediaElement); + m_returnToRealtimeButton->attachToParent(m_panel.get()); + + m_statusDisplay = MediaControlStatusDisplayElement::create(mediaElement); + m_statusDisplay->attachToParent(m_panel.get()); + + m_timelineContainer = MediaControlTimelineContainerElement::create(mediaElement); + + m_currentTimeDisplay = MediaControlCurrentTimeDisplayElement::create(mediaElement); + m_currentTimeDisplay->attachToParent(m_timelineContainer.get()); + + m_timeline = MediaControlTimelineElement::create(mediaElement); + m_timeline->attachToParent(m_timelineContainer.get()); + + m_timeRemainingDisplay = MediaControlTimeRemainingDisplayElement::create(mediaElement); + m_timeRemainingDisplay->attachToParent(m_timelineContainer.get()); + + m_timelineContainer->attachToParent(m_panel.get()); + + m_seekBackButton = MediaControlSeekBackButtonElement::create(mediaElement); + m_seekBackButton->attachToParent(m_panel.get()); + + m_seekForwardButton = MediaControlSeekForwardButtonElement::create(mediaElement); + m_seekForwardButton->attachToParent(m_panel.get()); + + m_toggleClosedCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(mediaElement); + m_toggleClosedCaptionsButton->attachToParent(m_panel.get()); + + m_fullscreenButton = MediaControlFullscreenButtonElement::create(mediaElement); + m_fullscreenButton->attachToParent(m_panel.get()); + + m_muteButton = MediaControlPanelMuteButtonElement::create(mediaElement); + m_muteButton->attachToParent(m_panel.get()); + + m_volumeSliderContainer = MediaControlVolumeSliderContainerElement::create(mediaElement); + + m_volumeSlider = MediaControlVolumeSliderElement::create(mediaElement); + m_volumeSlider->attachToParent(m_volumeSliderContainer.get()); + + m_volumeSliderMuteButton = MediaControlVolumeSliderMuteButtonElement::create(mediaElement); + m_volumeSliderMuteButton->attachToParent(m_volumeSliderContainer.get()); + + m_volumeSliderContainer->attachToParent(m_panel.get()); + + // FIXME: These controls, and others, should be created dynamically when needed, instead of + // always created. <http://webkit.org/b/57163> + m_fullScreenMinVolumeButton = MediaControlFullscreenVolumeMinButtonElement::create(mediaElement); + m_fullScreenMinVolumeButton->attachToParent(m_panel.get()); + + m_fullScreenVolumeSlider = MediaControlFullscreenVolumeSliderElement::create(mediaElement); + m_fullScreenVolumeSlider->attachToParent(m_panel.get()); + + m_fullScreenMaxVolumeButton = MediaControlFullscreenVolumeMaxButtonElement::create(mediaElement); + m_fullScreenMaxVolumeButton->attachToParent(m_panel.get()); + + m_panel->attachToParent(controls.get()); + return controls.release(); +} + +void MediaControls::reset() +{ + update(); +} + +void MediaControls::playbackProgressed() +{ + if (m_timeline) + m_timeline->update(false); + updateTimeDisplay(); +} + +void MediaControls::playbackStarted() +{ + playbackProgressed(); +} + +void MediaControls::playbackStopped() +{ + playbackProgressed(); +} + +void MediaControls::changedMute() +{ + update(); +} + +void MediaControls::changedVolume() +{ + update(); +} + +void MediaControls::changedClosedCaptionsVisibility() +{ + update(); +} + void MediaControls::updateStyle() { if (!m_controlsShadowRoot) @@ -109,6 +238,12 @@ void MediaControls::updateStyle() m_volumeSliderMuteButton->updateStyle(); if (m_volumeSlider) m_volumeSlider->updateStyle(); + if (m_fullScreenMinVolumeButton) + m_fullScreenMinVolumeButton->updateStyle(); + if (m_fullScreenVolumeSlider) + m_fullScreenVolumeSlider->updateStyle(); + if (m_fullScreenMaxVolumeButton) + m_fullScreenMaxVolumeButton->updateStyle(); } void MediaControls::destroy() @@ -151,46 +286,19 @@ void MediaControls::update() m_volumeSliderMuteButton = 0; m_controlsShadowRoot = 0; m_toggleClosedCaptionsButton = 0; + m_fullScreenMinVolumeButton = 0; + m_fullScreenVolumeSlider = 0; + m_fullScreenMaxVolumeButton = 0; } m_opacityAnimationTo = 1.0f; m_opacityAnimationTimer.stop(); - m_timeUpdateTimer.stop(); return; } if (!m_controlsShadowRoot) { - createControlsShadowRoot(); - createPanel(); - if (m_panel) { - createRewindButton(); - createPlayButton(); - createReturnToRealtimeButton(); - createStatusDisplay(); - createTimelineContainer(); - if (m_timelineContainer) { - createCurrentTimeDisplay(); - createTimeline(); - createTimeRemainingDisplay(); - } - createSeekBackButton(); - createSeekForwardButton(); - createToggleClosedCaptionsButton(); - createFullscreenButton(); - createMuteButton(); - createVolumeSliderContainer(); - if (m_volumeSliderContainer) { - createVolumeSlider(); - createVolumeSliderMuteButton(); - } - m_panel->attach(); - } - } - - if (media->canPlay()) { - if (m_timeUpdateTimer.isActive()) - m_timeUpdateTimer.stop(); - } else if (media->renderer()->style()->visibility() == VISIBLE && m_timeline && m_timeline->renderer() && m_timeline->renderer()->style()->display() != NONE) { - m_timeUpdateTimer.startRepeating(cTimeUpdateRepeatDelay); + m_controlsShadowRoot = create(m_mediaElement); + m_mediaElement->renderer()->addChild(m_controlsShadowRoot->renderer()); + m_panel->attach(); } if (m_panel) { @@ -232,148 +340,16 @@ void MediaControls::update() m_volumeSlider->update(); if (m_volumeSliderMuteButton) m_volumeSliderMuteButton->update(); - + if (m_fullScreenMinVolumeButton) + m_fullScreenMinVolumeButton->update(); + if (m_fullScreenVolumeSlider) + m_fullScreenVolumeSlider->update(); + if (m_fullScreenMaxVolumeButton) + m_fullScreenMaxVolumeButton->update(); updateTimeDisplay(); updateControlVisibility(); } -void MediaControls::createControlsShadowRoot() -{ - ASSERT(!m_controlsShadowRoot); - m_controlsShadowRoot = MediaControlShadowRootElement::create(m_mediaElement); - m_mediaElement->renderer()->addChild(m_controlsShadowRoot->renderer()); -} - -void MediaControls::createPanel() -{ - ASSERT(!m_panel); - m_panel = MediaControlPanelElement::create(m_mediaElement); - m_panel->attachToParent(m_controlsShadowRoot.get()); -} - -void MediaControls::createMuteButton() -{ - ASSERT(!m_muteButton); - m_muteButton = MediaControlPanelMuteButtonElement::create(m_mediaElement); - m_muteButton->attachToParent(m_panel.get()); -} - -void MediaControls::createPlayButton() -{ - ASSERT(!m_playButton); - m_playButton = MediaControlPlayButtonElement::create(m_mediaElement); - m_playButton->attachToParent(m_panel.get()); -} - -void MediaControls::createSeekBackButton() -{ - ASSERT(!m_seekBackButton); - m_seekBackButton = MediaControlSeekBackButtonElement::create(m_mediaElement); - m_seekBackButton->attachToParent(m_panel.get()); -} - -void MediaControls::createSeekForwardButton() -{ - ASSERT(!m_seekForwardButton); - m_seekForwardButton = MediaControlSeekForwardButtonElement::create(m_mediaElement); - m_seekForwardButton->attachToParent(m_panel.get()); -} - -void MediaControls::createRewindButton() -{ - ASSERT(!m_rewindButton); - m_rewindButton = MediaControlRewindButtonElement::create(m_mediaElement); - m_rewindButton->attachToParent(m_panel.get()); -} - -void MediaControls::createReturnToRealtimeButton() -{ - ASSERT(!m_returnToRealtimeButton); - m_returnToRealtimeButton = MediaControlReturnToRealtimeButtonElement::create(m_mediaElement); - m_returnToRealtimeButton->attachToParent(m_panel.get()); -} - -void MediaControls::createToggleClosedCaptionsButton() -{ - ASSERT(!m_toggleClosedCaptionsButton); - m_toggleClosedCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(m_mediaElement); - m_toggleClosedCaptionsButton->attachToParent(m_panel.get()); -} - -void MediaControls::createStatusDisplay() -{ - ASSERT(!m_statusDisplay); - m_statusDisplay = MediaControlStatusDisplayElement::create(m_mediaElement); - m_statusDisplay->attachToParent(m_panel.get()); -} - -void MediaControls::createTimelineContainer() -{ - ASSERT(!m_timelineContainer); - m_timelineContainer = MediaControlTimelineContainerElement::create(m_mediaElement); - m_timelineContainer->attachToParent(m_panel.get()); -} - -void MediaControls::createTimeline() -{ - ASSERT(!m_timeline); - m_timeline = MediaControlTimelineElement::create(m_mediaElement); - m_timeline->setAttribute(precisionAttr, "float"); - m_timeline->attachToParent(m_timelineContainer.get()); -} - -void MediaControls::createVolumeSliderContainer() -{ - ASSERT(!m_volumeSliderContainer); - m_volumeSliderContainer = MediaControlVolumeSliderContainerElement::create(m_mediaElement); - m_volumeSliderContainer->attachToParent(m_panel.get()); -} - -void MediaControls::createVolumeSlider() -{ - ASSERT(!m_volumeSlider); - m_volumeSlider = MediaControlVolumeSliderElement::create(m_mediaElement); - m_volumeSlider->setAttribute(precisionAttr, "float"); - m_volumeSlider->setAttribute(maxAttr, "1"); - m_volumeSlider->setAttribute(valueAttr, String::number(m_mediaElement->volume())); - m_volumeSlider->attachToParent(m_volumeSliderContainer.get()); -} - -void MediaControls::createVolumeSliderMuteButton() -{ - ASSERT(!m_volumeSliderMuteButton); - m_volumeSliderMuteButton = MediaControlVolumeSliderMuteButtonElement::create(m_mediaElement); - m_volumeSliderMuteButton->attachToParent(m_volumeSliderContainer.get()); -} - -void MediaControls::createCurrentTimeDisplay() -{ - ASSERT(!m_currentTimeDisplay); - m_currentTimeDisplay = MediaControlCurrentTimeDisplayElement::create(m_mediaElement); - m_currentTimeDisplay->attachToParent(m_timelineContainer.get()); -} - -void MediaControls::createTimeRemainingDisplay() -{ - ASSERT(!m_timeRemainingDisplay); - m_timeRemainingDisplay = MediaControlTimeRemainingDisplayElement::create(m_mediaElement); - m_timeRemainingDisplay->attachToParent(m_timelineContainer.get()); -} - -void MediaControls::createFullscreenButton() -{ - ASSERT(!m_fullscreenButton); - m_fullscreenButton = MediaControlFullscreenButtonElement::create(m_mediaElement); - m_fullscreenButton->attachToParent(m_panel.get()); -} - -void MediaControls::timeUpdateTimerFired(Timer<MediaControls>*) -{ - if (m_timeline) - m_timeline->update(false); - updateTimeDisplay(); -} - void MediaControls::updateTimeDisplay() { ASSERT(m_mediaElement->renderer()); @@ -480,13 +456,6 @@ void MediaControls::updateVolumeSliderContainer(bool visible) return; RefPtr<RenderStyle> s = m_volumeSliderContainer->styleForElement(); - int height = s->height().isPercent() ? 0 : s->height().value(); - int width = s->width().isPercent() ? 0 : s->width().value(); - IntPoint offset = m_mediaElement->document()->page()->theme()->volumeSliderOffsetFromMuteButton(m_muteButton->renderBox(), IntSize(width, height)); - int x = offset.x() + m_muteButton->renderBox()->offsetLeft(); - int y = offset.y() + m_muteButton->renderBox()->offsetTop(); - - m_volumeSliderContainer->setPosition(x, y); m_volumeSliderContainer->setVisible(true); m_volumeSliderContainer->update(); m_volumeSlider->update(); @@ -588,23 +557,6 @@ void MediaControls::forwardEvent(Event* event) #endif } -// We want the timeline slider to be at least 100 pixels wide. -static const int minWidthToDisplayTimeDisplays = 16 + 16 + 45 + 100 + 45 + 16 + 1; - -void MediaControls::updateTimeDisplayVisibility() -{ - ASSERT(m_mediaElement->renderer()); - - if (!m_currentTimeDisplay && !m_timeRemainingDisplay) - return; - - int width = m_mediaElement->renderBox()->width(); - bool shouldShowTimeDisplays = width >= minWidthToDisplayTimeDisplays * m_mediaElement->renderer()->style()->effectiveZoom(); - - m_currentTimeDisplay->setVisible(shouldShowTimeDisplays); - m_timeRemainingDisplay->setVisible(shouldShowTimeDisplays); -} - #if PLATFORM(ANDROID) void MediaControls::updateLastTouch() { |
