[SCM] WebKit Debian packaging branch, webkit-1.3, updated. upstream/1.3.7-4207-g178b198

dglazkov at chromium.org dglazkov at chromium.org
Mon Feb 21 00:09:43 UTC 2011


The following commit has been merged in the webkit-1.3 branch:
commit 580afb433b25f2130fbe1c851e788c5c75aa4bb3
Author: dglazkov at chromium.org <dglazkov at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Fri Jan 28 17:11:08 2011 +0000

    2011-01-27  Dimitri Glazkov  <dglazkov at chromium.org>
    
            Reviewed by Eric Carlson.
    
            Split MediaControls out of RenderMedia.
            https://bugs.webkit.org/show_bug.cgi?id=53252
    
            Near-mechanical moving of stuff, no change in behavior, thus no new tests.
    
            * Android.mk: Added MediaControls to build system.
            * CMakeLists.txt: Ditto.
            * GNUmakefile.am: Ditto.
            * WebCore.gypi: Ditto.
            * WebCore.pro: Ditto.
            * WebCore.vcproj/WebCore.vcproj: Ditto.
            * WebCore.xcodeproj/project.pbxproj: Ditto.
            * html/HTMLMediaElement.cpp:
            (WebCore::HTMLMediaElement::defaultEventHandler): Changed to forward events to MediaControls.
            * html/shadow/MediaControls.cpp: Copied all controls-related methods from
                Source/WebCore/rendering/RenderMedia.cpp, pulled them into their own class called MediaControls.
            * html/shadow/MediaControls.h: Ditto from Source/WebCore/rendering/RenderMedia.h.
            * rendering/MediaControlElements.cpp:
            (WebCore::MediaControlTimelineElement::defaultEventHandler): Changed to use MediaControls.
            * rendering/RenderMedia.cpp:
            (WebCore::RenderMedia::RenderMedia): Moved relevant constructor initializers out to MediaControls.
            (WebCore::RenderMedia::destroy): Changed to use MediaControls.
            (WebCore::RenderMedia::styleDidChange): Ditto.
            (WebCore::RenderMedia::layout): Ditto.
            (WebCore::RenderMedia::updateFromElement): Ditto.
            * rendering/RenderMedia.h: Updated defs accordingly and removed player() accessor, which
                is only used by sub-class RenderVideo.
            (WebCore::RenderMedia::controls): Added.
            * rendering/RenderVideo.cpp:
            (WebCore::RenderVideo::~RenderVideo): Changed to access MediaPlayer* directly from mediaElement().
            (WebCore::RenderVideo::calculateIntrinsicSize): Ditto.
            (WebCore::RenderVideo::paintReplaced): Ditto.
            (WebCore::RenderVideo::updatePlayer): Ditto.
            (WebCore::RenderVideo::supportsAcceleratedRendering): Ditto.
            (WebCore::RenderVideo::acceleratedRenderingStateChanged): Ditto.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@76950 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/Source/WebCore/Android.mk b/Source/WebCore/Android.mk
index dcb100f..df688b4 100644
--- a/Source/WebCore/Android.mk
+++ b/Source/WebCore/Android.mk
@@ -347,6 +347,7 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
 	html/parser/TextDocumentParser.cpp \
 	html/parser/TextViewSourceParser.cpp \
 	\
+	html/shadow/MediaControls.cpp \
 	html/shadow/SliderThumbElement.cpp \
 	\
 	loader/cache/CachedCSSStyleSheet.cpp \
diff --git a/Source/WebCore/CMakeLists.txt b/Source/WebCore/CMakeLists.txt
index e882433..e43ae67 100644
--- a/Source/WebCore/CMakeLists.txt
+++ b/Source/WebCore/CMakeLists.txt
@@ -1149,6 +1149,7 @@ SET(WebCore_SOURCES
     html/parser/TextDocumentParser.cpp
     html/parser/TextViewSourceParser.cpp
 
+    html/shadow/MediaControls.cpp
     html/shadow/SliderThumbElement.cpp
 
     inspector/ConsoleMessage.cpp
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 1f500e2..df0799b 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,43 @@
+2011-01-27  Dimitri Glazkov  <dglazkov at chromium.org>
+
+        Reviewed by Eric Carlson.
+
+        Split MediaControls out of RenderMedia.
+        https://bugs.webkit.org/show_bug.cgi?id=53252
+
+        Near-mechanical moving of stuff, no change in behavior, thus no new tests.
+
+        * Android.mk: Added MediaControls to build system.
+        * CMakeLists.txt: Ditto.
+        * GNUmakefile.am: Ditto.
+        * WebCore.gypi: Ditto.
+        * WebCore.pro: Ditto.
+        * WebCore.vcproj/WebCore.vcproj: Ditto.
+        * WebCore.xcodeproj/project.pbxproj: Ditto.
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::defaultEventHandler): Changed to forward events to MediaControls.
+        * html/shadow/MediaControls.cpp: Copied all controls-related methods from
+            Source/WebCore/rendering/RenderMedia.cpp, pulled them into their own class called MediaControls. 
+        * html/shadow/MediaControls.h: Ditto from Source/WebCore/rendering/RenderMedia.h.
+        * rendering/MediaControlElements.cpp:
+        (WebCore::MediaControlTimelineElement::defaultEventHandler): Changed to use MediaControls.
+        * rendering/RenderMedia.cpp:
+        (WebCore::RenderMedia::RenderMedia): Moved relevant constructor initializers out to MediaControls.
+        (WebCore::RenderMedia::destroy): Changed to use MediaControls.
+        (WebCore::RenderMedia::styleDidChange): Ditto.
+        (WebCore::RenderMedia::layout): Ditto.
+        (WebCore::RenderMedia::updateFromElement): Ditto.
+        * rendering/RenderMedia.h: Updated defs accordingly and removed player() accessor, which
+            is only used by sub-class RenderVideo.
+        (WebCore::RenderMedia::controls): Added.
+        * rendering/RenderVideo.cpp:
+        (WebCore::RenderVideo::~RenderVideo): Changed to access MediaPlayer* directly from mediaElement().
+        (WebCore::RenderVideo::calculateIntrinsicSize): Ditto.
+        (WebCore::RenderVideo::paintReplaced): Ditto.
+        (WebCore::RenderVideo::updatePlayer): Ditto.
+        (WebCore::RenderVideo::supportsAcceleratedRendering): Ditto.
+        (WebCore::RenderVideo::acceleratedRenderingStateChanged): Ditto.
+
 2011-01-28  Pavel Feldman  <pfeldman at chromium.org>
 
         Reviewed by Yury Semikhatsky.
diff --git a/Source/WebCore/GNUmakefile.am b/Source/WebCore/GNUmakefile.am
index c0ab45a..8e1e9fd 100644
--- a/Source/WebCore/GNUmakefile.am
+++ b/Source/WebCore/GNUmakefile.am
@@ -1880,6 +1880,8 @@ webcore_sources += \
 	Source/WebCore/html/parser/TextDocumentParser.h \
 	Source/WebCore/html/parser/TextViewSourceParser.cpp \
 	Source/WebCore/html/parser/TextViewSourceParser.h \
+	Source/WebCore/html/shadow/MediaControls.cpp \
+	Source/WebCore/html/shadow/MediaControls.h \
 	Source/WebCore/html/shadow/SliderThumbElement.cpp \
 	Source/WebCore/html/shadow/SliderThumbElement.h \
 	Source/WebCore/html/PasswordInputType.cpp \
diff --git a/Source/WebCore/WebCore.gypi b/Source/WebCore/WebCore.gypi
index 0248578..3ca1e27 100644
--- a/Source/WebCore/WebCore.gypi
+++ b/Source/WebCore/WebCore.gypi
@@ -2001,6 +2001,8 @@
             'html/parser/TextDocumentParser.h',
             'html/parser/TextViewSourceParser.cpp',
             'html/parser/TextViewSourceParser.h',
+            'html/shadow/MediaControls.cpp',
+            'html/shadow/MediaControls.h',
             'html/shadow/SliderThumbElement.cpp',
             'html/shadow/SliderThumbElement.h',
             'inspector/ConsoleMessage.cpp',
diff --git a/Source/WebCore/WebCore.pro b/Source/WebCore/WebCore.pro
index c6caa2a..34804ba 100644
--- a/Source/WebCore/WebCore.pro
+++ b/Source/WebCore/WebCore.pro
@@ -1039,6 +1039,7 @@ SOURCES += \
     html/parser/HTMLViewSourceParser.cpp \
     html/parser/TextDocumentParser.cpp \
     html/parser/TextViewSourceParser.cpp \
+    html/shadow/MediaControls.cpp \
     html/shadow/SliderThumbElement.cpp \
     inspector/ConsoleMessage.cpp \
     inspector/InjectedScript.cpp \
diff --git a/Source/WebCore/WebCore.vcproj/WebCore.vcproj b/Source/WebCore/WebCore.vcproj/WebCore.vcproj
index 75dbe88..a68f158 100755
--- a/Source/WebCore/WebCore.vcproj/WebCore.vcproj
+++ b/Source/WebCore/WebCore.vcproj/WebCore.vcproj
@@ -55509,6 +55509,14 @@
 				Name="shadow"
 				>
 				<File
+					RelativePath="..\html\shadow\MediaControls.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\html\shadow\MediaControls.h"
+					>
+				</File>
+				<File
 					RelativePath="..\html\shadow\SliderThumbElement.cpp"
 					>
 				</File>
diff --git a/Source/WebCore/WebCore.xcodeproj/project.pbxproj b/Source/WebCore/WebCore.xcodeproj/project.pbxproj
index 6417c97..2588887 100644
--- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj
+++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj
@@ -888,6 +888,8 @@
 		4138D3361244054800323D33 /* EventContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4138D3341244054800323D33 /* EventContext.cpp */; };
 		4150F9F112B6E0E70008C860 /* SliderThumbElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 4150F9EF12B6E0E70008C860 /* SliderThumbElement.h */; };
 		4150F9F212B6E0E70008C860 /* SliderThumbElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4150F9F012B6E0E70008C860 /* SliderThumbElement.cpp */; };
+		4157AF8012F1FB0400A8C6F5 /* MediaControls.h in Headers */ = {isa = PBXBuildFile; fileRef = 4157AF7E12F1FB0400A8C6F5 /* MediaControls.h */; };
+		4157AF8112F1FB0400A8C6F5 /* MediaControls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4157AF7F12F1FB0400A8C6F5 /* MediaControls.cpp */; };
 		4162A450101145AE00DFF3ED /* DedicatedWorkerContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4162A44D101145AE00DFF3ED /* DedicatedWorkerContext.cpp */; };
 		4162A451101145AE00DFF3ED /* DedicatedWorkerContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 4162A44E101145AE00DFF3ED /* DedicatedWorkerContext.h */; };
 		4162A454101145E300DFF3ED /* JSDedicatedWorkerContextCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4162A453101145E300DFF3ED /* JSDedicatedWorkerContextCustom.cpp */; };
@@ -7253,6 +7255,8 @@
 		4138D3341244054800323D33 /* EventContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EventContext.cpp; sourceTree = "<group>"; };
 		4150F9EF12B6E0E70008C860 /* SliderThumbElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SliderThumbElement.h; sourceTree = "<group>"; };
 		4150F9F012B6E0E70008C860 /* SliderThumbElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SliderThumbElement.cpp; sourceTree = "<group>"; };
+		4157AF7E12F1FB0400A8C6F5 /* MediaControls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaControls.h; sourceTree = "<group>"; };
+		4157AF7F12F1FB0400A8C6F5 /* MediaControls.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaControls.cpp; sourceTree = "<group>"; };
 		4162A44D101145AE00DFF3ED /* DedicatedWorkerContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DedicatedWorkerContext.cpp; path = workers/DedicatedWorkerContext.cpp; sourceTree = "<group>"; };
 		4162A44E101145AE00DFF3ED /* DedicatedWorkerContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DedicatedWorkerContext.h; path = workers/DedicatedWorkerContext.h; sourceTree = "<group>"; };
 		4162A44F101145AE00DFF3ED /* DedicatedWorkerContext.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = DedicatedWorkerContext.idl; path = workers/DedicatedWorkerContext.idl; sourceTree = "<group>"; };
@@ -13229,6 +13233,8 @@
 		4150F9ED12B6E0990008C860 /* shadow */ = {
 			isa = PBXGroup;
 			children = (
+				4157AF7F12F1FB0400A8C6F5 /* MediaControls.cpp */,
+				4157AF7E12F1FB0400A8C6F5 /* MediaControls.h */,
 				4150F9F012B6E0E70008C860 /* SliderThumbElement.cpp */,
 				4150F9EF12B6E0E70008C860 /* SliderThumbElement.h */,
 			);
@@ -21498,6 +21504,7 @@
 				49E911C70EF86D47009D0CAF /* MatrixTransformOperation.h in Headers */,
 				931BCC611124DFCB00BE70DD /* MediaCanStartListener.h in Headers */,
 				ABFE7E130D32FAF60066F4D2 /* MediaControlElements.h in Headers */,
+				4157AF8012F1FB0400A8C6F5 /* MediaControls.h in Headers */,
 				97205AB81239291000B17380 /* MediaDocument.h in Headers */,
 				E44613AD0CD6331000FADA75 /* MediaError.h in Headers */,
 				4E1959220A39DABA00220FE5 /* MediaFeatureNames.h in Headers */,
@@ -24346,6 +24353,7 @@
 				FA654A6B1108ABED002615E0 /* MathMLTextElement.cpp in Sources */,
 				49D5DC2B0F423A73008F20FD /* Matrix3DTransformOperation.cpp in Sources */,
 				49E911C60EF86D47009D0CAF /* MatrixTransformOperation.cpp in Sources */,
+				4157AF8112F1FB0400A8C6F5 /* MediaControls.cpp in Sources */,
 				ABFE7E120D32FAF60066F4D2 /* MediaControlElements.cpp in Sources */,
 				97205AB71239291000B17380 /* MediaDocument.cpp in Sources */,
 				4E1959210A39DABA00220FE5 /* MediaFeatureNames.cpp in Sources */,
diff --git a/Source/WebCore/html/HTMLMediaElement.cpp b/Source/WebCore/html/HTMLMediaElement.cpp
index 3149b68..ec1e5e1 100644
--- a/Source/WebCore/html/HTMLMediaElement.cpp
+++ b/Source/WebCore/html/HTMLMediaElement.cpp
@@ -48,6 +48,7 @@
 #include "HTMLSourceElement.h"
 #include "HTMLVideoElement.h"
 #include "Logging.h"
+#include "MediaControls.h"
 #include "MediaDocument.h"
 #include "MediaError.h"
 #include "MediaList.h"
@@ -2287,7 +2288,7 @@ void HTMLMediaElement::defaultEventHandler(Event* event)
         widget->handleEvent(event);
 #else
     if (renderer() && renderer()->isMedia())
-        toRenderMedia(renderer())->forwardEvent(event);
+        toRenderMedia(renderer())->controls()->forwardEvent(event);
     if (event->defaultHandled())
         return;
     HTMLElement::defaultEventHandler(event);
diff --git a/Source/WebCore/html/shadow/MediaControls.cpp b/Source/WebCore/html/shadow/MediaControls.cpp
new file mode 100644
index 0000000..e41e448
--- /dev/null
+++ b/Source/WebCore/html/shadow/MediaControls.cpp
@@ -0,0 +1,572 @@
+/*
+ * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#if ENABLE(VIDEO)
+#include "MediaControls.h"
+
+#include "EventNames.h"
+#include "FloatConversion.h"
+#include "HTMLNames.h"
+#include "MediaControlElements.h"
+#include "MouseEvent.h"
+#include "Page.h"
+#include "RenderLayer.h"
+#include "RenderTheme.h"
+#include <wtf/CurrentTime.h>
+#include <wtf/MathExtras.h>
+
+
+using namespace std;
+
+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)
+    , m_opacityAnimationFrom(0)
+    , m_opacityAnimationTo(1.0f)
+    , m_mouseOver(false)
+{
+}
+
+void MediaControls::updateStyle()
+{
+    if (!m_controlsShadowRoot)
+        return;
+
+    if (m_panel)
+        m_panel->updateStyle();
+    if (m_muteButton)
+        m_muteButton->updateStyle();
+    if (m_playButton)
+        m_playButton->updateStyle();
+    if (m_seekBackButton)
+        m_seekBackButton->updateStyle();
+    if (m_seekForwardButton)
+        m_seekForwardButton->updateStyle();
+    if (m_rewindButton)
+        m_rewindButton->updateStyle();
+    if (m_returnToRealtimeButton)
+        m_returnToRealtimeButton->updateStyle();
+    if (m_toggleClosedCaptionsButton)
+        m_toggleClosedCaptionsButton->updateStyle();
+    if (m_statusDisplay)
+        m_statusDisplay->updateStyle();
+    if (m_timelineContainer)
+        m_timelineContainer->updateStyle();
+    if (m_timeline)
+        m_timeline->updateStyle();
+    if (m_fullscreenButton)
+        m_fullscreenButton->updateStyle();
+    if (m_currentTimeDisplay)
+        m_currentTimeDisplay->updateStyle();
+    if (m_timeRemainingDisplay)
+        m_timeRemainingDisplay->updateStyle();
+    if (m_volumeSliderContainer)
+        m_volumeSliderContainer->updateStyle();
+    if (m_volumeSliderMuteButton)
+        m_volumeSliderMuteButton->updateStyle();
+    if (m_volumeSlider)
+        m_volumeSlider->updateStyle();
+}
+
+void MediaControls::destroy()
+{
+    ASSERT(m_mediaElement->renderer());
+
+    if (m_controlsShadowRoot && m_controlsShadowRoot->renderer()) {
+
+        // detach the panel before removing the shadow renderer to prevent a crash in m_controlsShadowRoot->detach() 
+        //  when display: style changes
+        m_panel->detach();
+
+        m_mediaElement->renderer()->removeChild(m_controlsShadowRoot->renderer());
+        m_controlsShadowRoot->detach();
+        m_controlsShadowRoot = 0;
+    }
+}
+
+void MediaControls::update()
+{
+    HTMLMediaElement* media = m_mediaElement;
+    if (!media->controls() || !media->inActiveDocument()) {
+        if (m_controlsShadowRoot) {
+            m_controlsShadowRoot->detach();
+            m_panel = 0;
+            m_muteButton = 0;
+            m_playButton = 0;
+            m_statusDisplay = 0;
+            m_timelineContainer = 0;
+            m_timeline = 0;
+            m_seekBackButton = 0;
+            m_seekForwardButton = 0;
+            m_rewindButton = 0;
+            m_returnToRealtimeButton = 0;
+            m_currentTimeDisplay = 0;
+            m_timeRemainingDisplay = 0;
+            m_fullscreenButton = 0;
+            m_volumeSliderContainer = 0;
+            m_volumeSlider = 0;
+            m_volumeSliderMuteButton = 0;
+            m_controlsShadowRoot = 0;
+            m_toggleClosedCaptionsButton = 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);
+    }
+
+    if (m_panel) {
+        // update() might alter the opacity of the element, especially if we are in the middle
+        // of an animation. This is the only element concerned as we animate only this element.
+        float opacityBeforeChangingStyle = m_panel->renderer() ? m_panel->renderer()->style()->opacity() : 0;
+        m_panel->update();
+        changeOpacity(m_panel.get(), opacityBeforeChangingStyle);
+    }
+    if (m_muteButton)
+        m_muteButton->update();
+    if (m_playButton)
+        m_playButton->update();
+    if (m_timelineContainer)
+        m_timelineContainer->update();
+    if (m_volumeSliderContainer)
+        m_volumeSliderContainer->update();
+    if (m_timeline)
+        m_timeline->update();
+    if (m_currentTimeDisplay)
+        m_currentTimeDisplay->update();
+    if (m_timeRemainingDisplay)
+        m_timeRemainingDisplay->update();
+    if (m_seekBackButton)
+        m_seekBackButton->update();
+    if (m_seekForwardButton)
+        m_seekForwardButton->update();
+    if (m_rewindButton)
+        m_rewindButton->update();
+    if (m_returnToRealtimeButton)
+        m_returnToRealtimeButton->update();
+    if (m_toggleClosedCaptionsButton)
+        m_toggleClosedCaptionsButton->update();
+    if (m_statusDisplay)
+        m_statusDisplay->update();
+    if (m_fullscreenButton)
+        m_fullscreenButton->update();
+    if (m_volumeSlider)
+        m_volumeSlider->update();
+    if (m_volumeSliderMuteButton)
+        m_volumeSliderMuteButton->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 = MediaControlElement::create(m_mediaElement, MEDIA_CONTROLS_PANEL);
+    m_panel->attachToParent(m_controlsShadowRoot.get());
+}
+
+void MediaControls::createMuteButton()
+{
+    ASSERT(!m_muteButton);
+    m_muteButton = MediaControlMuteButtonElement::create(m_mediaElement, MediaControlMuteButtonElement::Controller);
+    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 = MediaControlSeekButtonElement::create(m_mediaElement, MEDIA_CONTROLS_SEEK_BACK_BUTTON);
+    m_seekBackButton->attachToParent(m_panel.get());
+}
+
+void MediaControls::createSeekForwardButton()
+{
+    ASSERT(!m_seekForwardButton);
+    m_seekForwardButton = MediaControlSeekButtonElement::create(m_mediaElement, MEDIA_CONTROLS_SEEK_FORWARD_BUTTON);
+    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 = MediaControlMuteButtonElement::create(m_mediaElement, MediaControlMuteButtonElement::VolumeSlider);
+    m_volumeSliderMuteButton->attachToParent(m_volumeSliderContainer.get());
+}
+
+void MediaControls::createCurrentTimeDisplay()
+{
+    ASSERT(!m_currentTimeDisplay);
+    m_currentTimeDisplay = MediaControlTimeDisplayElement::create(m_mediaElement, MEDIA_CONTROLS_CURRENT_TIME_DISPLAY);
+    m_currentTimeDisplay->attachToParent(m_timelineContainer.get());
+}
+
+void MediaControls::createTimeRemainingDisplay()
+{
+    ASSERT(!m_timeRemainingDisplay);
+    m_timeRemainingDisplay = MediaControlTimeDisplayElement::create(m_mediaElement, MEDIA_CONTROLS_TIME_REMAINING_DISPLAY);
+    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());
+
+    if (!m_currentTimeDisplay || !m_currentTimeDisplay->renderer() || m_currentTimeDisplay->renderer()->style()->display() == NONE || m_mediaElement->renderer()->style()->visibility() != VISIBLE)
+        return;
+
+    float now = m_mediaElement->currentTime();
+    float duration = m_mediaElement->duration();
+
+    // Allow the theme to format the time
+    ExceptionCode ec;
+    m_currentTimeDisplay->setInnerText(m_mediaElement->renderer()->theme()->formatMediaControlsCurrentTime(now, duration), ec);
+    m_currentTimeDisplay->setCurrentValue(now);
+    m_timeRemainingDisplay->setInnerText(m_mediaElement->renderer()->theme()->formatMediaControlsRemainingTime(now, duration), ec);
+    m_timeRemainingDisplay->setCurrentValue(now - duration);
+}
+
+RenderBox* MediaControls::renderBox()
+{
+    return m_controlsShadowRoot ? m_controlsShadowRoot->renderBox() : 0;
+}
+
+void MediaControls::updateControlVisibility()
+{
+    if (!m_panel || !m_panel->renderer())
+        return;
+
+    // Don't fade for audio controls.
+    HTMLMediaElement* media = m_mediaElement;
+    if (!media->hasVideo())
+        return;
+
+    ASSERT(media->renderer());
+
+    // Don't fade if the media element is not visible
+    if (media->renderer()->style()->visibility() != VISIBLE)
+        return;
+    
+    bool shouldHideController = !m_mouseOver && !media->canPlay();
+
+    // Do fading manually, css animations don't work with shadow trees
+
+    float animateFrom = m_panel->renderer()->style()->opacity();
+    float animateTo = shouldHideController ? 0.0f : 1.0f;
+
+    if (animateFrom == animateTo)
+        return;
+
+    if (m_opacityAnimationTimer.isActive()) {
+        if (m_opacityAnimationTo == animateTo)
+            return;
+        m_opacityAnimationTimer.stop();
+    }
+
+    if (animateFrom < animateTo)
+        m_opacityAnimationDuration = m_panel->renderer()->theme()->mediaControlsFadeInDuration();
+    else
+        m_opacityAnimationDuration = m_panel->renderer()->theme()->mediaControlsFadeOutDuration();
+
+    m_opacityAnimationFrom = animateFrom;
+    m_opacityAnimationTo = animateTo;
+
+    m_opacityAnimationStartTime = currentTime();
+    m_opacityAnimationTimer.startRepeating(cOpacityAnimationRepeatDelay);
+}
+
+void MediaControls::changeOpacity(HTMLElement* e, float opacity)
+{
+    if (!e || !e->renderer() || !e->renderer()->style())
+        return;
+    RefPtr<RenderStyle> s = RenderStyle::clone(e->renderer()->style());
+    s->setOpacity(opacity);
+    // z-index can't be auto if opacity is used
+    s->setZIndex(0);
+    e->renderer()->setStyle(s.release());
+}
+
+void MediaControls::opacityAnimationTimerFired(Timer<MediaControls>*)
+{
+    double time = currentTime() - m_opacityAnimationStartTime;
+    if (time >= m_opacityAnimationDuration) {
+        time = m_opacityAnimationDuration;
+        m_opacityAnimationTimer.stop();
+    }
+    float opacity = narrowPrecisionToFloat(m_opacityAnimationFrom + (m_opacityAnimationTo - m_opacityAnimationFrom) * time / m_opacityAnimationDuration);
+    changeOpacity(m_panel.get(), opacity);
+}
+
+void MediaControls::updateVolumeSliderContainer(bool visible)
+{
+    if (!m_mediaElement->hasAudio() || !m_volumeSliderContainer || !m_volumeSlider)
+        return;
+
+    if (visible && !m_volumeSliderContainer->isVisible()) {
+        if (!m_muteButton || !m_muteButton->renderer() || !m_muteButton->renderBox())
+            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->renderer()->node(), 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();
+    } else if (!visible && m_volumeSliderContainer->isVisible()) {
+        m_volumeSliderContainer->setVisible(false);
+        m_volumeSliderContainer->updateStyle();
+    }
+}
+
+void MediaControls::forwardEvent(Event* event)
+{
+    ASSERT(m_mediaElement->renderer());
+
+    if (event->isMouseEvent() && m_controlsShadowRoot) {
+        MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
+        IntPoint point(mouseEvent->absoluteLocation());
+
+        bool defaultHandled = false;
+        if (m_volumeSliderMuteButton && m_volumeSliderMuteButton->hitTest(point)) {
+            m_volumeSliderMuteButton->defaultEventHandler(event);
+            defaultHandled = event->defaultHandled();
+        }
+
+        bool showVolumeSlider = false;
+        if (!defaultHandled && m_muteButton && m_muteButton->hitTest(point)) {
+            m_muteButton->defaultEventHandler(event);
+            if (event->type() != eventNames().mouseoutEvent)
+                showVolumeSlider = true;
+        }
+
+        if (m_volumeSliderContainer && m_volumeSliderContainer->hitTest(point))
+            showVolumeSlider = true;
+
+        if (m_volumeSlider && m_volumeSlider->hitTest(point)) {
+            m_volumeSlider->defaultEventHandler(event);
+            showVolumeSlider = true;
+        }
+
+        updateVolumeSliderContainer(showVolumeSlider);
+
+        if (m_playButton && m_playButton->hitTest(point))
+            m_playButton->defaultEventHandler(event);
+
+        if (m_seekBackButton && m_seekBackButton->hitTest(point))
+            m_seekBackButton->defaultEventHandler(event);
+
+        if (m_seekForwardButton && m_seekForwardButton->hitTest(point))
+            m_seekForwardButton->defaultEventHandler(event);
+
+        if (m_rewindButton && m_rewindButton->hitTest(point))
+            m_rewindButton->defaultEventHandler(event);
+
+        if (m_returnToRealtimeButton && m_returnToRealtimeButton->hitTest(point))
+            m_returnToRealtimeButton->defaultEventHandler(event);
+
+       if (m_toggleClosedCaptionsButton && m_toggleClosedCaptionsButton->hitTest(point))
+            m_toggleClosedCaptionsButton->defaultEventHandler(event);
+
+        if (m_timeline && m_timeline->hitTest(point))
+            m_timeline->defaultEventHandler(event);
+
+        if (m_fullscreenButton && m_fullscreenButton->hitTest(point))
+            m_fullscreenButton->defaultEventHandler(event);
+
+        if (event->type() == eventNames().mouseoverEvent) {
+            m_mouseOver = true;
+            updateControlVisibility();
+        }
+        if (event->type() == eventNames().mouseoutEvent) {
+            // When the scrollbar thumb captures mouse events, we should treat the mouse as still being over our renderer if the new target is a descendant
+            Node* mouseOverNode = mouseEvent->relatedTarget() ? mouseEvent->relatedTarget()->toNode() : 0;
+            RenderObject* mouseOverRenderer = mouseOverNode ? mouseOverNode->renderer() : 0;
+            m_mouseOver = mouseOverRenderer && mouseOverRenderer->isDescendantOf(m_mediaElement->renderer());
+            updateControlVisibility();
+        }
+    }
+}
+
+// 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);
+}
+
+}
+
+#endif
diff --git a/Source/WebCore/html/shadow/MediaControls.h b/Source/WebCore/html/shadow/MediaControls.h
new file mode 100644
index 0000000..14b9f81
--- /dev/null
+++ b/Source/WebCore/html/shadow/MediaControls.h
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef MediaControls_h
+#define MediaControls_h
+
+#if ENABLE(VIDEO)
+
+#include "Timer.h"
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+
+class HTMLElement;
+class HTMLInputElement;
+class HTMLMediaElement;
+class Event;
+class MediaControlMuteButtonElement;
+class MediaControlPlayButtonElement;
+class MediaControlSeekButtonElement;
+class MediaControlRewindButtonElement;
+class MediaControlReturnToRealtimeButtonElement;
+class MediaControlToggleClosedCaptionsButtonElement;
+class MediaControlTimelineElement;
+class MediaControlVolumeSliderElement;
+class MediaControlFullscreenButtonElement;
+class MediaControlTimeDisplayElement;
+class MediaControlStatusDisplayElement;
+class MediaControlTimelineContainerElement;
+class MediaControlVolumeSliderContainerElement;
+class MediaControlElement;
+class MediaPlayer;
+
+class RenderBox;
+class RenderMedia;
+
+class MediaControls {
+public:
+    MediaControls(HTMLMediaElement*);
+
+    void destroy();
+    void update();
+    void updateStyle();
+    void forwardEvent(Event*);
+    void updateTimeDisplay();
+    void updateTimeDisplayVisibility();
+
+    // FIXME: This is temporary to allow RenderMedia::layout tweak the position of controls.
+    // Once shadow DOM refactoring is complete, the tweaking will be in MediaControlsShadowRoot and this accessor will no longer be necessary.
+    RenderBox* renderBox();
+
+private:
+    void createControlsShadowRoot();
+    void destroyControlsShadowRoot();
+    void createPanel();
+    void createMuteButton();
+    void createPlayButton();
+    void createSeekBackButton();
+    void createSeekForwardButton();
+    void createRewindButton();
+    void createReturnToRealtimeButton();
+    void createToggleClosedCaptionsButton();
+    void createStatusDisplay();
+    void createTimelineContainer();
+    void createTimeline();
+    void createVolumeSliderContainer();
+    void createVolumeSlider();
+    void createVolumeSliderMuteButton();
+    void createCurrentTimeDisplay();
+    void createTimeRemainingDisplay();
+    void createFullscreenButton();
+
+    void timeUpdateTimerFired(Timer<MediaControls>*);
+
+    void updateControlVisibility();
+    void changeOpacity(HTMLElement*, float opacity);
+    void opacityAnimationTimerFired(Timer<MediaControls>*);
+
+    void updateVolumeSliderContainer(bool visible);
+
+private:
+    RefPtr<HTMLElement> m_controlsShadowRoot;
+    RefPtr<MediaControlElement> m_panel;
+    RefPtr<MediaControlMuteButtonElement> m_muteButton;
+    RefPtr<MediaControlPlayButtonElement> m_playButton;
+    RefPtr<MediaControlSeekButtonElement> m_seekBackButton;
+    RefPtr<MediaControlSeekButtonElement> m_seekForwardButton;
+    RefPtr<MediaControlRewindButtonElement> m_rewindButton;
+    RefPtr<MediaControlReturnToRealtimeButtonElement> m_returnToRealtimeButton;
+    RefPtr<MediaControlToggleClosedCaptionsButtonElement> m_toggleClosedCaptionsButton;
+    RefPtr<MediaControlTimelineElement> m_timeline;
+    RefPtr<MediaControlVolumeSliderElement> m_volumeSlider;
+    RefPtr<MediaControlMuteButtonElement> m_volumeSliderMuteButton;
+    RefPtr<MediaControlFullscreenButtonElement> m_fullscreenButton;
+    RefPtr<MediaControlTimelineContainerElement> m_timelineContainer;
+    RefPtr<MediaControlVolumeSliderContainerElement> m_volumeSliderContainer;
+    RefPtr<MediaControlTimeDisplayElement> m_currentTimeDisplay;
+    RefPtr<MediaControlTimeDisplayElement> m_timeRemainingDisplay;
+    RefPtr<MediaControlStatusDisplayElement> m_statusDisplay;
+
+    HTMLMediaElement* m_mediaElement;
+    Timer<MediaControls> m_timeUpdateTimer;
+    Timer<MediaControls> m_opacityAnimationTimer;
+
+    double m_opacityAnimationStartTime;
+    double m_opacityAnimationDuration;
+    float m_opacityAnimationFrom;
+    float m_opacityAnimationTo;
+
+    bool m_mouseOver;
+};
+
+
+}
+
+#endif
+#endif
diff --git a/Source/WebCore/rendering/MediaControlElements.cpp b/Source/WebCore/rendering/MediaControlElements.cpp
index 113ca3b..2f9ea30 100644
--- a/Source/WebCore/rendering/MediaControlElements.cpp
+++ b/Source/WebCore/rendering/MediaControlElements.cpp
@@ -37,6 +37,7 @@
 #include "Frame.h"
 #include "HTMLNames.h"
 #include "LocalizedStrings.h"
+#include "MediaControls.h"
 #include "MouseEvent.h"
 #include "Page.h"
 #include "RenderMedia.h"
@@ -740,7 +741,7 @@ void MediaControlTimelineElement::defaultEventHandler(Event* event)
 
     RenderSlider* slider = toRenderSlider(renderer());
     if (slider && slider->inDragMode())
-        toRenderMedia(mediaElement()->renderer())->updateTimeDisplay();
+        toRenderMedia(mediaElement()->renderer())->controls()->updateTimeDisplay();
 
     if (event->type() == eventNames().mouseupEvent)
         mediaElement()->endScrubbing();
diff --git a/Source/WebCore/rendering/RenderMedia.cpp b/Source/WebCore/rendering/RenderMedia.cpp
index 7da72db..16cd874 100644
--- a/Source/WebCore/rendering/RenderMedia.cpp
+++ b/Source/WebCore/rendering/RenderMedia.cpp
@@ -28,48 +28,22 @@
 #if ENABLE(VIDEO)
 #include "RenderMedia.h"
 
-#include "EventNames.h"
-#include "FloatConversion.h"
-#include "HTMLNames.h"
+#include "HTMLMediaElement.h"
 #include "MediaControlElements.h"
-#include "MouseEvent.h"
-#include "Page.h"
-#include "RenderLayer.h"
-#include "RenderTheme.h"
-#include <wtf/CurrentTime.h>
-#include <wtf/MathExtras.h>
-
-using namespace std;
+#include "MediaControls.h"
 
 namespace WebCore {
 
-using namespace HTMLNames;
-
-static const double cTimeUpdateRepeatDelay = 0.2;
-static const double cOpacityAnimationRepeatDelay = 0.05;
-
 RenderMedia::RenderMedia(HTMLMediaElement* video)
     : RenderImage(video)
-    , m_timeUpdateTimer(this, &RenderMedia::timeUpdateTimerFired)
-    , m_opacityAnimationTimer(this, &RenderMedia::opacityAnimationTimerFired)
-    , m_mouseOver(false)
-    , m_opacityAnimationStartTime(0)
-    , m_opacityAnimationDuration(0)
-    , m_opacityAnimationFrom(0)
-    , m_opacityAnimationTo(1.0f)
+    , m_controls(new MediaControls(video))
 {
     setImageResource(RenderImageResource::create());
 }
 
 RenderMedia::RenderMedia(HTMLMediaElement* video, const IntSize& intrinsicSize)
     : RenderImage(video)
-    , m_timeUpdateTimer(this, &RenderMedia::timeUpdateTimerFired)
-    , m_opacityAnimationTimer(this, &RenderMedia::opacityAnimationTimerFired)
-    , m_mouseOver(false)
-    , m_opacityAnimationStartTime(0)
-    , m_opacityAnimationDuration(0)
-    , m_opacityAnimationFrom(0)
-    , m_opacityAnimationTo(1.0f)
+    , m_controls(new MediaControls(video))
 {
     setImageResource(RenderImageResource::create());
     setIntrinsicSize(intrinsicSize);
@@ -81,16 +55,7 @@ RenderMedia::~RenderMedia()
 
 void RenderMedia::destroy()
 {
-    if (m_controlsShadowRoot && m_controlsShadowRoot->renderer()) {
-
-        // detach the panel before removing the shadow renderer to prevent a crash in m_controlsShadowRoot->detach() 
-        //  when display: style changes
-        m_panel->detach();
-
-        removeChild(m_controlsShadowRoot->renderer());
-        m_controlsShadowRoot->detach();
-        m_controlsShadowRoot = 0;
-    }
+    m_controls->destroy();
     RenderImage::destroy();
 }
 
@@ -99,51 +64,10 @@ HTMLMediaElement* RenderMedia::mediaElement() const
     return static_cast<HTMLMediaElement*>(node()); 
 }
 
-MediaPlayer* RenderMedia::player() const
-{
-    return mediaElement()->player();
-}
-
 void RenderMedia::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
 {
     RenderImage::styleDidChange(diff, oldStyle);
-
-    if (m_controlsShadowRoot) {
-        if (m_panel)
-            m_panel->updateStyle();
-        if (m_muteButton)
-            m_muteButton->updateStyle();
-        if (m_playButton)
-            m_playButton->updateStyle();
-        if (m_seekBackButton)
-            m_seekBackButton->updateStyle();
-        if (m_seekForwardButton)
-            m_seekForwardButton->updateStyle();
-        if (m_rewindButton)
-            m_rewindButton->updateStyle();
-        if (m_returnToRealtimeButton)
-            m_returnToRealtimeButton->updateStyle();
-        if (m_toggleClosedCaptionsButton)
-            m_toggleClosedCaptionsButton->updateStyle();
-        if (m_statusDisplay)
-            m_statusDisplay->updateStyle();
-        if (m_timelineContainer)
-            m_timelineContainer->updateStyle();
-        if (m_timeline)
-            m_timeline->updateStyle();
-        if (m_fullscreenButton)
-            m_fullscreenButton->updateStyle();
-        if (m_currentTimeDisplay)
-            m_currentTimeDisplay->updateStyle();
-        if (m_timeRemainingDisplay)
-            m_timeRemainingDisplay->updateStyle();
-        if (m_volumeSliderContainer)
-            m_volumeSliderContainer->updateStyle();
-        if (m_volumeSliderMuteButton)
-            m_volumeSliderMuteButton->updateStyle();
-        if (m_volumeSlider)
-            m_volumeSlider->updateStyle();
-    }
+    m_controls->updateStyle();
 }
 
 void RenderMedia::layout()
@@ -152,17 +76,13 @@ void RenderMedia::layout()
 
     RenderImage::layout();
 
-    RenderBox* controlsRenderer = m_controlsShadowRoot ? m_controlsShadowRoot->renderBox() : 0;
+    RenderBox* controlsRenderer = m_controls->renderBox();
     if (!controlsRenderer)
         return;
     IntSize newSize = contentBoxRect().size();
     if (newSize != oldSize || controlsRenderer->needsLayout()) {
 
-        if (m_currentTimeDisplay && m_timeRemainingDisplay) {
-            bool shouldShowTimeDisplays = shouldShowTimeDisplayControls();
-            m_currentTimeDisplay->setVisible(shouldShowTimeDisplays);
-            m_timeRemainingDisplay->setVisible(shouldShowTimeDisplays);
-        }
+        m_controls->updateTimeDisplayVisibility();
 
         controlsRenderer->setLocation(borderLeft() + paddingLeft(), borderTop() + paddingTop());
         controlsRenderer->style()->setHeight(Length(newSize.height(), Fixed));
@@ -173,443 +93,9 @@ void RenderMedia::layout()
     }
 }
 
-void RenderMedia::createControlsShadowRoot()
-{
-    ASSERT(!m_controlsShadowRoot);
-    m_controlsShadowRoot = MediaControlShadowRootElement::create(mediaElement());
-    addChild(m_controlsShadowRoot->renderer());
-}
-
-void RenderMedia::createPanel()
-{
-    ASSERT(!m_panel);
-    m_panel = MediaControlElement::create(mediaElement(), MEDIA_CONTROLS_PANEL);
-    m_panel->attachToParent(m_controlsShadowRoot.get());
-}
-
-void RenderMedia::createMuteButton()
-{
-    ASSERT(!m_muteButton);
-    m_muteButton = MediaControlMuteButtonElement::create(mediaElement(), MediaControlMuteButtonElement::Controller);
-    m_muteButton->attachToParent(m_panel.get());
-}
-
-void RenderMedia::createPlayButton()
-{
-    ASSERT(!m_playButton);
-    m_playButton = MediaControlPlayButtonElement::create(mediaElement());
-    m_playButton->attachToParent(m_panel.get());
-}
-
-void RenderMedia::createSeekBackButton()
-{
-    ASSERT(!m_seekBackButton);
-    m_seekBackButton = MediaControlSeekButtonElement::create(mediaElement(), MEDIA_CONTROLS_SEEK_BACK_BUTTON);
-    m_seekBackButton->attachToParent(m_panel.get());
-}
-
-void RenderMedia::createSeekForwardButton()
-{
-    ASSERT(!m_seekForwardButton);
-    m_seekForwardButton = MediaControlSeekButtonElement::create(mediaElement(), MEDIA_CONTROLS_SEEK_FORWARD_BUTTON);
-    m_seekForwardButton->attachToParent(m_panel.get());
-}
-
-void RenderMedia::createRewindButton()
-{
-    ASSERT(!m_rewindButton);
-    m_rewindButton = MediaControlRewindButtonElement::create(mediaElement());
-    m_rewindButton->attachToParent(m_panel.get());
-}
-
-void RenderMedia::createReturnToRealtimeButton()
-{
-    ASSERT(!m_returnToRealtimeButton);
-    m_returnToRealtimeButton = MediaControlReturnToRealtimeButtonElement::create(mediaElement());
-    m_returnToRealtimeButton->attachToParent(m_panel.get());
-}
-
-void RenderMedia::createToggleClosedCaptionsButton()
-{
-    ASSERT(!m_toggleClosedCaptionsButton);
-    m_toggleClosedCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(mediaElement());
-    m_toggleClosedCaptionsButton->attachToParent(m_panel.get());
-}
-
-void RenderMedia::createStatusDisplay()
-{
-    ASSERT(!m_statusDisplay);
-    m_statusDisplay = MediaControlStatusDisplayElement::create(mediaElement());
-    m_statusDisplay->attachToParent(m_panel.get());
-}
-
-void RenderMedia::createTimelineContainer()
-{
-    ASSERT(!m_timelineContainer);
-    m_timelineContainer = MediaControlTimelineContainerElement::create(mediaElement());
-    m_timelineContainer->attachToParent(m_panel.get());
-}
-
-void RenderMedia::createTimeline()
-{
-    ASSERT(!m_timeline);
-    m_timeline = MediaControlTimelineElement::create(mediaElement());
-    m_timeline->setAttribute(precisionAttr, "float");
-    m_timeline->attachToParent(m_timelineContainer.get());
-}
-
-void RenderMedia::createVolumeSliderContainer()
-{
-    ASSERT(!m_volumeSliderContainer);
-    m_volumeSliderContainer = MediaControlVolumeSliderContainerElement::create(mediaElement());
-    m_volumeSliderContainer->attachToParent(m_panel.get());
-}
-
-void RenderMedia::createVolumeSlider()
-{
-    ASSERT(!m_volumeSlider);
-    m_volumeSlider = MediaControlVolumeSliderElement::create(mediaElement());
-    m_volumeSlider->setAttribute(precisionAttr, "float");
-    m_volumeSlider->setAttribute(maxAttr, "1");
-    m_volumeSlider->setAttribute(valueAttr, String::number(mediaElement()->volume()));
-    m_volumeSlider->attachToParent(m_volumeSliderContainer.get());
-}
-
-void RenderMedia::createVolumeSliderMuteButton()
-{
-    ASSERT(!m_volumeSliderMuteButton);
-    m_volumeSliderMuteButton = MediaControlMuteButtonElement::create(mediaElement(), MediaControlMuteButtonElement::VolumeSlider);
-    m_volumeSliderMuteButton->attachToParent(m_volumeSliderContainer.get());
-    
-}
-
-void RenderMedia::createCurrentTimeDisplay()
-{
-    ASSERT(!m_currentTimeDisplay);
-    m_currentTimeDisplay = MediaControlTimeDisplayElement::create(mediaElement(), MEDIA_CONTROLS_CURRENT_TIME_DISPLAY);
-    m_currentTimeDisplay->attachToParent(m_timelineContainer.get());
-}
-
-void RenderMedia::createTimeRemainingDisplay()
-{
-    ASSERT(!m_timeRemainingDisplay);
-    m_timeRemainingDisplay = MediaControlTimeDisplayElement::create(mediaElement(), MEDIA_CONTROLS_TIME_REMAINING_DISPLAY);
-    m_timeRemainingDisplay->attachToParent(m_timelineContainer.get());
-}
-
-void RenderMedia::createFullscreenButton()
-{
-    ASSERT(!m_fullscreenButton);
-    m_fullscreenButton = MediaControlFullscreenButtonElement::create(mediaElement());
-    m_fullscreenButton->attachToParent(m_panel.get());
-}
-    
 void RenderMedia::updateFromElement()
 {
-    updateControls();
-}
-            
-void RenderMedia::updateControls()
-{
-    HTMLMediaElement* media = mediaElement();
-    if (!media->controls() || !media->inActiveDocument()) {
-        if (m_controlsShadowRoot) {
-            m_controlsShadowRoot->detach();
-            m_panel = 0;
-            m_muteButton = 0;
-            m_playButton = 0;
-            m_statusDisplay = 0;
-            m_timelineContainer = 0;
-            m_timeline = 0;
-            m_seekBackButton = 0;
-            m_seekForwardButton = 0;
-            m_rewindButton = 0;
-            m_returnToRealtimeButton = 0;
-            m_currentTimeDisplay = 0;
-            m_timeRemainingDisplay = 0;
-            m_fullscreenButton = 0;
-            m_volumeSliderContainer = 0;
-            m_volumeSlider = 0;
-            m_volumeSliderMuteButton = 0;
-            m_controlsShadowRoot = 0;
-            m_toggleClosedCaptionsButton = 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 (style()->visibility() == VISIBLE && m_timeline && m_timeline->renderer() && m_timeline->renderer()->style()->display() != NONE) {
-        m_timeUpdateTimer.startRepeating(cTimeUpdateRepeatDelay);
-    }
-
-    
-    if (m_panel) {
-        // update() might alter the opacity of the element, especially if we are in the middle
-        // of an animation. This is the only element concerned as we animate only this element.
-        float opacityBeforeChangingStyle = m_panel->renderer() ? m_panel->renderer()->style()->opacity() : 0;
-        m_panel->update();
-        changeOpacity(m_panel.get(), opacityBeforeChangingStyle);
-    }
-    if (m_muteButton)
-        m_muteButton->update();
-    if (m_playButton)
-        m_playButton->update();
-    if (m_timelineContainer)
-        m_timelineContainer->update();
-    if (m_volumeSliderContainer)
-        m_volumeSliderContainer->update();
-    if (m_timeline)
-        m_timeline->update();
-    if (m_currentTimeDisplay)
-        m_currentTimeDisplay->update();
-    if (m_timeRemainingDisplay)
-        m_timeRemainingDisplay->update();
-    if (m_seekBackButton)
-        m_seekBackButton->update();
-    if (m_seekForwardButton)
-        m_seekForwardButton->update();
-    if (m_rewindButton)
-        m_rewindButton->update();
-    if (m_returnToRealtimeButton)
-        m_returnToRealtimeButton->update();
-    if (m_toggleClosedCaptionsButton)
-        m_toggleClosedCaptionsButton->update();
-    if (m_statusDisplay)
-        m_statusDisplay->update();
-    if (m_fullscreenButton)
-        m_fullscreenButton->update();
-    if (m_volumeSlider)
-        m_volumeSlider->update();
-    if (m_volumeSliderMuteButton)
-        m_volumeSliderMuteButton->update();
-
-    updateTimeDisplay();
-    updateControlVisibility();
-}
-
-void RenderMedia::timeUpdateTimerFired(Timer<RenderMedia>*)
-{
-    if (m_timeline)
-        m_timeline->update(false);
-    updateTimeDisplay();
-}
-    
-void RenderMedia::updateTimeDisplay()
-{
-    if (!m_currentTimeDisplay || !m_currentTimeDisplay->renderer() || m_currentTimeDisplay->renderer()->style()->display() == NONE || style()->visibility() != VISIBLE)
-        return;
-
-    float now = mediaElement()->currentTime();
-    float duration = mediaElement()->duration();
-
-    // Allow the theme to format the time
-    ExceptionCode ec;
-    m_currentTimeDisplay->setInnerText(theme()->formatMediaControlsCurrentTime(now, duration), ec);
-    m_currentTimeDisplay->setCurrentValue(now);
-    m_timeRemainingDisplay->setInnerText(theme()->formatMediaControlsRemainingTime(now, duration), ec);
-    m_timeRemainingDisplay->setCurrentValue(now - duration);
-}
-
-void RenderMedia::updateControlVisibility() 
-{
-    if (!m_panel || !m_panel->renderer())
-        return;
-
-    // Don't fade for audio controls.
-    HTMLMediaElement* media = mediaElement();
-    if (!media->hasVideo())
-        return;
-
-    // Don't fade if the media element is not visible
-    if (style()->visibility() != VISIBLE)
-        return;
-    
-    bool shouldHideController = !m_mouseOver && !media->canPlay();
-
-    // Do fading manually, css animations don't work with shadow trees
-
-    float animateFrom = m_panel->renderer()->style()->opacity();
-    float animateTo = shouldHideController ? 0.0f : 1.0f;
-
-    if (animateFrom == animateTo)
-        return;
-
-    if (m_opacityAnimationTimer.isActive()) {
-        if (m_opacityAnimationTo == animateTo)
-            return;
-        m_opacityAnimationTimer.stop();
-    }
-
-    if (animateFrom < animateTo)
-        m_opacityAnimationDuration = m_panel->renderer()->theme()->mediaControlsFadeInDuration();
-    else
-        m_opacityAnimationDuration = m_panel->renderer()->theme()->mediaControlsFadeOutDuration();
-
-    m_opacityAnimationFrom = animateFrom;
-    m_opacityAnimationTo = animateTo;
-
-    m_opacityAnimationStartTime = currentTime();
-    m_opacityAnimationTimer.startRepeating(cOpacityAnimationRepeatDelay);
-}
-    
-void RenderMedia::changeOpacity(HTMLElement* e, float opacity) 
-{
-    if (!e || !e->renderer() || !e->renderer()->style())
-        return;
-    RefPtr<RenderStyle> s = RenderStyle::clone(e->renderer()->style());
-    s->setOpacity(opacity);
-    // z-index can't be auto if opacity is used
-    s->setZIndex(0);
-    e->renderer()->setStyle(s.release());
-}
-    
-void RenderMedia::opacityAnimationTimerFired(Timer<RenderMedia>*)
-{
-    double time = currentTime() - m_opacityAnimationStartTime;
-    if (time >= m_opacityAnimationDuration) {
-        time = m_opacityAnimationDuration;
-        m_opacityAnimationTimer.stop();
-    }
-    float opacity = narrowPrecisionToFloat(m_opacityAnimationFrom + (m_opacityAnimationTo - m_opacityAnimationFrom) * time / m_opacityAnimationDuration);
-    changeOpacity(m_panel.get(), opacity);
-}
-
-void RenderMedia::updateVolumeSliderContainer(bool visible)
-{
-    if (!mediaElement()->hasAudio() || !m_volumeSliderContainer || !m_volumeSlider)
-        return;
-
-    if (visible && !m_volumeSliderContainer->isVisible()) {
-        if (!m_muteButton || !m_muteButton->renderer() || !m_muteButton->renderBox())
-            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 = document()->page()->theme()->volumeSliderOffsetFromMuteButton(m_muteButton->renderer()->node(), 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();
-    } else if (!visible && m_volumeSliderContainer->isVisible()) {
-        m_volumeSliderContainer->setVisible(false);
-        m_volumeSliderContainer->updateStyle();
-    }
-}
-
-void RenderMedia::forwardEvent(Event* event)
-{
-    if (event->isMouseEvent() && m_controlsShadowRoot) {
-        MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
-        IntPoint point(mouseEvent->absoluteLocation());
-
-        bool defaultHandled = false;
-        if (m_volumeSliderMuteButton && m_volumeSliderMuteButton->hitTest(point)) {
-            m_volumeSliderMuteButton->defaultEventHandler(event);
-            defaultHandled = event->defaultHandled();
-        }
-
-        bool showVolumeSlider = false;
-        if (!defaultHandled && m_muteButton && m_muteButton->hitTest(point)) {
-            m_muteButton->defaultEventHandler(event);
-            if (event->type() != eventNames().mouseoutEvent)
-                showVolumeSlider = true;
-        }
-
-        if (m_volumeSliderContainer && m_volumeSliderContainer->hitTest(point))
-            showVolumeSlider = true;
-
-        if (m_volumeSlider && m_volumeSlider->hitTest(point)) {
-            m_volumeSlider->defaultEventHandler(event);
-            showVolumeSlider = true;
-        }
-
-        updateVolumeSliderContainer(showVolumeSlider);
-
-        if (m_playButton && m_playButton->hitTest(point))
-            m_playButton->defaultEventHandler(event);
-
-        if (m_seekBackButton && m_seekBackButton->hitTest(point))
-            m_seekBackButton->defaultEventHandler(event);
-
-        if (m_seekForwardButton && m_seekForwardButton->hitTest(point))
-            m_seekForwardButton->defaultEventHandler(event);
-
-        if (m_rewindButton && m_rewindButton->hitTest(point))
-            m_rewindButton->defaultEventHandler(event);
-
-        if (m_returnToRealtimeButton && m_returnToRealtimeButton->hitTest(point))
-            m_returnToRealtimeButton->defaultEventHandler(event);
-
-       if (m_toggleClosedCaptionsButton && m_toggleClosedCaptionsButton->hitTest(point))
-            m_toggleClosedCaptionsButton->defaultEventHandler(event);
-
-        if (m_timeline && m_timeline->hitTest(point))
-            m_timeline->defaultEventHandler(event);
-
-        if (m_fullscreenButton && m_fullscreenButton->hitTest(point))
-            m_fullscreenButton->defaultEventHandler(event);
-        
-        if (event->type() == eventNames().mouseoverEvent) {
-            m_mouseOver = true;
-            updateControlVisibility();
-        }
-        if (event->type() == eventNames().mouseoutEvent) {
-            // When the scrollbar thumb captures mouse events, we should treat the mouse as still being over our renderer if the new target is a descendant
-            Node* mouseOverNode = mouseEvent->relatedTarget() ? mouseEvent->relatedTarget()->toNode() : 0;
-            RenderObject* mouseOverRenderer = mouseOverNode ? mouseOverNode->renderer() : 0;
-            m_mouseOver = mouseOverRenderer && mouseOverRenderer->isDescendantOf(this);
-            updateControlVisibility();
-        }
-    }
-}
-
-// We want the timeline slider to be at least 100 pixels wide.
-static const int minWidthToDisplayTimeDisplays = 16 + 16 + 45 + 100 + 45 + 16 + 1;
-
-bool RenderMedia::shouldShowTimeDisplayControls() const
-{
-    if (!m_currentTimeDisplay && !m_timeRemainingDisplay)
-        return false;
-
-    int width = mediaElement()->renderBox()->width();
-    return width >= minWidthToDisplayTimeDisplays * style()->effectiveZoom();
+    m_controls->update();
 }
 
 } // namespace WebCore
diff --git a/Source/WebCore/rendering/RenderMedia.h b/Source/WebCore/rendering/RenderMedia.h
index 2af9f9b..7658ef6 100644
--- a/Source/WebCore/rendering/RenderMedia.h
+++ b/Source/WebCore/rendering/RenderMedia.h
@@ -29,27 +29,11 @@
 #if ENABLE(VIDEO)
 
 #include "RenderImage.h"
-#include "Timer.h"
 
 namespace WebCore {
-    
-class HTMLInputElement;
+
 class HTMLMediaElement;
-class MediaControlMuteButtonElement;
-class MediaControlPlayButtonElement;
-class MediaControlSeekButtonElement;
-class MediaControlRewindButtonElement;
-class MediaControlReturnToRealtimeButtonElement;
-class MediaControlToggleClosedCaptionsButtonElement;
-class MediaControlTimelineElement;
-class MediaControlVolumeSliderElement;
-class MediaControlFullscreenButtonElement;
-class MediaControlTimeDisplayElement;
-class MediaControlStatusDisplayElement;
-class MediaControlTimelineContainerElement;
-class MediaControlVolumeSliderContainerElement;
-class MediaControlElement;
-class MediaPlayer;
+class MediaControls;
 
 class RenderMedia : public RenderImage {
 public:
@@ -61,16 +45,9 @@ public:
     RenderObjectChildList* children() { return &m_children; }
 
     HTMLMediaElement* mediaElement() const;
-    MediaPlayer* player() const;
-
-    bool shouldShowTimeDisplayControls() const;
+    MediaControls* controls() const;
 
-    void updateFromElement();
-    void updatePlayer();
-    void updateControls();
-    void updateTimeDisplay();
-    
-    void forwardEvent(Event*);
+    virtual void updateFromElement();
 
 protected:
     virtual void layout();
@@ -85,65 +62,13 @@ private:
     virtual bool isMedia() const { return true; }
     virtual bool isImage() const { return false; }
 
-    void createControlsShadowRoot();
-    void destroyControlsShadowRoot();
-    void createPanel();
-    void createMuteButton();
-    void createPlayButton();
-    void createSeekBackButton();
-    void createSeekForwardButton();
-    void createRewindButton();
-    void createReturnToRealtimeButton();
-    void createToggleClosedCaptionsButton();
-    void createStatusDisplay();
-    void createTimelineContainer();
-    void createTimeline();
-    void createVolumeSliderContainer();
-    void createVolumeSlider();
-    void createVolumeSliderMuteButton();
-    void createCurrentTimeDisplay();
-    void createTimeRemainingDisplay();
-    void createFullscreenButton();
-    
-    void timeUpdateTimerFired(Timer<RenderMedia>*);
-    
-    void updateControlVisibility();
-    void changeOpacity(HTMLElement*, float opacity);
-    void opacityAnimationTimerFired(Timer<RenderMedia>*);
-
-    void updateVolumeSliderContainer(bool visible);
 
     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
 
     virtual bool requiresForcedStyleRecalcPropagation() const { return true; }
 
-    RefPtr<HTMLElement> m_controlsShadowRoot;
-    RefPtr<MediaControlElement> m_panel;
-    RefPtr<MediaControlMuteButtonElement> m_muteButton;
-    RefPtr<MediaControlPlayButtonElement> m_playButton;
-    RefPtr<MediaControlSeekButtonElement> m_seekBackButton;
-    RefPtr<MediaControlSeekButtonElement> m_seekForwardButton;
-    RefPtr<MediaControlRewindButtonElement> m_rewindButton;
-    RefPtr<MediaControlReturnToRealtimeButtonElement> m_returnToRealtimeButton;
-    RefPtr<MediaControlToggleClosedCaptionsButtonElement> m_toggleClosedCaptionsButton;
-    RefPtr<MediaControlTimelineElement> m_timeline;
-    RefPtr<MediaControlVolumeSliderElement> m_volumeSlider;
-    RefPtr<MediaControlMuteButtonElement> m_volumeSliderMuteButton;
-    RefPtr<MediaControlFullscreenButtonElement> m_fullscreenButton;
-    RefPtr<MediaControlTimelineContainerElement> m_timelineContainer;
-    RefPtr<MediaControlVolumeSliderContainerElement> m_volumeSliderContainer;
-    RefPtr<MediaControlTimeDisplayElement> m_currentTimeDisplay;
-    RefPtr<MediaControlTimeDisplayElement> m_timeRemainingDisplay;
-    RefPtr<MediaControlStatusDisplayElement> m_statusDisplay;
+    OwnPtr<MediaControls> m_controls;
     RenderObjectChildList m_children;
-    
-    Timer<RenderMedia> m_timeUpdateTimer;
-    Timer<RenderMedia> m_opacityAnimationTimer;
-    bool m_mouseOver;
-    double m_opacityAnimationStartTime;
-    double m_opacityAnimationDuration;
-    float m_opacityAnimationFrom;
-    float m_opacityAnimationTo;
 };
 
 inline RenderMedia* toRenderMedia(RenderObject* object)
@@ -152,6 +77,11 @@ inline RenderMedia* toRenderMedia(RenderObject* object)
     return static_cast<RenderMedia*>(object);
 }
 
+inline MediaControls* RenderMedia::controls() const
+{
+    return m_controls.get();
+}
+
 // This will catch anyone doing an unnecessary cast.
 void toRenderMedia(const RenderMedia*);
 
diff --git a/Source/WebCore/rendering/RenderVideo.cpp b/Source/WebCore/rendering/RenderVideo.cpp
index 0f3b551..1ae736b 100644
--- a/Source/WebCore/rendering/RenderVideo.cpp
+++ b/Source/WebCore/rendering/RenderVideo.cpp
@@ -56,7 +56,7 @@ RenderVideo::RenderVideo(HTMLVideoElement* video)
 
 RenderVideo::~RenderVideo()
 {
-    if (MediaPlayer* p = player()) {
+    if (MediaPlayer* p = mediaElement()->player()) {
         p->setVisible(false);
         p->setFrameView(0);
     }
@@ -108,9 +108,9 @@ IntSize RenderVideo::calculateIntrinsicSize()
     // The intrinsic height of a video element's playback area is the intrinsic height 
     // of the video resource, if that is available; otherwise it is the intrinsic 
     // height of the poster frame, if that is available; otherwise it is 150 CSS pixels.
-    
-    if (player() && video->readyState() >= HTMLVideoElement::HAVE_METADATA)
-        return player()->naturalSize();
+    MediaPlayer* player = mediaElement()->player();
+    if (player && video->readyState() >= HTMLVideoElement::HAVE_METADATA)
+        return player->naturalSize();
 
     if (video->shouldDisplayPosterImage() && !m_cachedImageSize.isEmpty() && !imageResource()->errorOccurred())
         return m_cachedImageSize;
@@ -186,7 +186,7 @@ bool RenderVideo::shouldDisplayVideo() const
 
 void RenderVideo::paintReplaced(PaintInfo& paintInfo, int tx, int ty)
 {
-    MediaPlayer* mediaPlayer = player();
+    MediaPlayer* mediaPlayer = mediaElement()->player();
     bool displayingPoster = videoElement()->shouldDisplayPosterImage();
 
     if (!displayingPoster) {
@@ -228,7 +228,7 @@ void RenderVideo::updatePlayer()
 {
     updateIntrinsicSize();
 
-    MediaPlayer* mediaPlayer = player();
+    MediaPlayer* mediaPlayer = mediaElement()->player();
     if (!mediaPlayer)
         return;
 
@@ -265,7 +265,7 @@ int RenderVideo::minimumReplacedHeight() const
 #if USE(ACCELERATED_COMPOSITING)
 bool RenderVideo::supportsAcceleratedRendering() const
 {
-    MediaPlayer* p = player();
+    MediaPlayer* p = mediaElement()->player();
     if (p)
         return p->supportsAcceleratedRendering();
 
@@ -274,7 +274,7 @@ bool RenderVideo::supportsAcceleratedRendering() const
 
 void RenderVideo::acceleratedRenderingStateChanged()
 {
-    MediaPlayer* p = player();
+    MediaPlayer* p = mediaElement()->player();
     if (p)
         p->acceleratedRenderingStateChanged();
 }

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list