summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/html/shadow/MediaControls.cpp
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2011-06-08 08:26:01 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-06-08 08:26:01 -0700
commit3742ac093d35d923c81693096ab6671e9b147700 (patch)
treec2add9100f789dad45ef1ec5328bddde02c47a4c /Source/WebCore/html/shadow/MediaControls.cpp
parent901401d90459bc22580842455d4588b9a697514d (diff)
parente5926f4a0d6adc9ad4a75824129f117181953560 (diff)
downloadexternal_webkit-3742ac093d35d923c81693096ab6671e9b147700.zip
external_webkit-3742ac093d35d923c81693096ab6671e9b147700.tar.gz
external_webkit-3742ac093d35d923c81693096ab6671e9b147700.tar.bz2
Merge changes I55c6d71a,Ifb3277d4,Ia1b847a2,I7ba9cf3f,Ida2b2a8a,I1280ec90,I72f818d5,I2e3b588b,I9a4e6289,Ia724c78b,Icd8612c8,Ie31b15d7,Ie125edae,I77941a88,I89dae78b,I3516e5ca,I1a4c17b5,I2c4ecc1a,I9c8e6537,Ifac13115,Ie1f80e09,Ia541ed77,I60ce9d78
* changes: Merge WebKit at r82507: Update ThirdPartyProject.prop Merge WebKit at r82507: Cherry-pick change r88166 to add INSPECTOR guards to ScriptProfiler Merge WebKit at r82507: Work around a V8 bug Merge WebKit at r82507: JNIType renamed to JavaType Merge WebKit at r82507: IconDatabaseClient interface expanded Merge WebKit at r82507: Don't use new loss-free code path in HTMLCanvasElement::toDataURL() Merge WebKit at r82507: IcondDatabaseBase::iconForPageURL() renamed Merge WebKit at r82507: IconDatabaseBase::Open() signature changed Merge WebKit at r82507: Node::isContentEditable() renamed Merge WebKit at r82507: Use icon database through IconDatabaseBase Merge WebKit at r82507: toInputElement() is now a member of Node Merge WebKit at r82507: FrameLoaderClient::objectContentType() signature changed Merge WebKit at r82507: StringImpl::computeHash() removed Merge WebKit at r82507: Stub out FontPlatformData::setOrientation() Merge WebKit at r82507: Path::strokeBoundingRect() is now const Merge WebKit at r82507: Add missing UnusedParam.h include in ApplicationCacheGroup.cpp Merge WebKit at r82507: Continue to use Android's version of FontPlatformData.h Merge WebKit at r82507: Update signature of FontCustomPlatformData::fontPlatformData() Merge WebKit at r82507: Fix conflicts due to JNI refactoring Merge WebKit at r82507: Fix conflicts due to new StorageTracker Merge WebKit at r82507: Fix conflicts Merge WebKit at r82507: Fix makefiles Merge WebKit at r82507: Initial merge by git
Diffstat (limited to 'Source/WebCore/html/shadow/MediaControls.cpp')
-rw-r--r--Source/WebCore/html/shadow/MediaControls.cpp346
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()
{