summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/html/shadow
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/html/shadow')
-rw-r--r--Source/WebCore/html/shadow/MediaControls.cpp332
-rw-r--r--Source/WebCore/html/shadow/MediaControls.h40
-rw-r--r--Source/WebCore/html/shadow/SliderThumbElement.cpp20
-rw-r--r--Source/WebCore/html/shadow/SliderThumbElement.h3
4 files changed, 189 insertions, 206 deletions
diff --git a/Source/WebCore/html/shadow/MediaControls.cpp b/Source/WebCore/html/shadow/MediaControls.cpp
index 61a3684..20f1abb 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,6 +557,7 @@ void MediaControls::forwardEvent(Event* event)
#endif
}
+<<<<<<< HEAD
// We want the timeline slider to be at least 100 pixels wide.
static const int minWidthToDisplayTimeDisplays = 16 + 16 + 45 + 100 + 45 + 16 + 1;
@@ -612,6 +582,8 @@ void MediaControls::updateLastTouch()
}
#endif
+=======
+>>>>>>> webkit.org at r82507
}
#endif
diff --git a/Source/WebCore/html/shadow/MediaControls.h b/Source/WebCore/html/shadow/MediaControls.h
index a4fbbd6..726573e 100644
--- a/Source/WebCore/html/shadow/MediaControls.h
+++ b/Source/WebCore/html/shadow/MediaControls.h
@@ -53,6 +53,9 @@ class MediaControlStatusDisplayElement;
class MediaControlTimelineContainerElement;
class MediaControlVolumeSliderContainerElement;
class MediaControlElement;
+class MediaControlFullscreenVolumeMinButtonElement;
+class MediaControlFullscreenVolumeSliderElement;
+class MediaControlFullscreenVolumeMaxButtonElement;
class MediaPlayer;
class RenderBox;
@@ -62,12 +65,21 @@ class MediaControls {
public:
MediaControls(HTMLMediaElement*);
+ void reset();
+
+ void playbackProgressed();
+ void playbackStarted();
+ void playbackStopped();
+
+ void changedMute();
+ void changedVolume();
+ void changedClosedCaptionsVisibility();
+
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.
@@ -78,27 +90,7 @@ public:
#endif
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>*);
+ PassRefPtr<MediaControlShadowRootElement> create(HTMLMediaElement*);
void updateControlVisibility();
void changeOpacity(HTMLElement*, float opacity);
@@ -125,9 +117,11 @@ private:
RefPtr<MediaControlTimeDisplayElement> m_currentTimeDisplay;
RefPtr<MediaControlTimeDisplayElement> m_timeRemainingDisplay;
RefPtr<MediaControlStatusDisplayElement> m_statusDisplay;
+ RefPtr<MediaControlFullscreenVolumeMinButtonElement> m_fullScreenMinVolumeButton;
+ RefPtr<MediaControlFullscreenVolumeSliderElement> m_fullScreenVolumeSlider;
+ RefPtr<MediaControlFullscreenVolumeMaxButtonElement> m_fullScreenMaxVolumeButton;
HTMLMediaElement* m_mediaElement;
- Timer<MediaControls> m_timeUpdateTimer;
Timer<MediaControls> m_opacityAnimationTimer;
double m_opacityAnimationStartTime;
diff --git a/Source/WebCore/html/shadow/SliderThumbElement.cpp b/Source/WebCore/html/shadow/SliderThumbElement.cpp
index 2c049cb..d1aa15e 100644
--- a/Source/WebCore/html/shadow/SliderThumbElement.cpp
+++ b/Source/WebCore/html/shadow/SliderThumbElement.cpp
@@ -56,6 +56,8 @@ namespace WebCore {
class RenderSliderThumb : public RenderBlock {
public:
RenderSliderThumb(Node*);
+
+private:
virtual void layout();
};
@@ -85,6 +87,16 @@ void RenderSliderThumb::layout()
RenderBlock::layout();
}
+void SliderThumbElement::setPositionFromValue()
+{
+ // Since today the code to calculate position is in the RenderSlider layout
+ // path, we don't actually update the value here. Instead, we poke at the
+ // renderer directly to trigger layout.
+ // FIXME: Move the logic of positioning the thumb here.
+ if (renderer())
+ renderer()->setNeedsLayout(true);
+}
+
RenderObject* SliderThumbElement::createRenderer(RenderArena* arena, RenderStyle*)
{
return new (arena) RenderSliderThumb(this);
@@ -92,11 +104,11 @@ RenderObject* SliderThumbElement::createRenderer(RenderArena* arena, RenderStyle
void SliderThumbElement::dragFrom(const IntPoint& point)
{
- setPosition(point);
+ setPositionFromPoint(point);
startDragging();
}
-void SliderThumbElement::setPosition(const IntPoint& point)
+void SliderThumbElement::setPositionFromPoint(const IntPoint& point)
{
HTMLInputElement* input = static_cast<HTMLInputElement*>(shadowHost());
ASSERT(input);
@@ -212,6 +224,7 @@ void SliderThumbElement::defaultEventHandler(Event* event)
#endif
) {
if (m_inDragMode)
+<<<<<<< HEAD
#if PLATFORM(ANDROID) && ENABLE(TOUCH_EVENTS)
{
if (event->isMouseEvent()) {
@@ -233,6 +246,9 @@ void SliderThumbElement::defaultEventHandler(Event* event)
}
#endif
+=======
+ setPositionFromPoint(mouseEvent->absoluteLocation());
+>>>>>>> webkit.org at r82507
return;
}
diff --git a/Source/WebCore/html/shadow/SliderThumbElement.h b/Source/WebCore/html/shadow/SliderThumbElement.h
index 7c4c179..9414ac4 100644
--- a/Source/WebCore/html/shadow/SliderThumbElement.h
+++ b/Source/WebCore/html/shadow/SliderThumbElement.h
@@ -49,6 +49,7 @@ public:
static PassRefPtr<SliderThumbElement> create(Document*);
bool inDragMode() const { return m_inDragMode; }
+ void setPositionFromValue();
void dragFrom(const IntPoint&);
virtual void defaultEventHandler(Event*);
@@ -60,7 +61,7 @@ private:
virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
void startDragging();
void stopDragging();
- void setPosition(const IntPoint&);
+ void setPositionFromPoint(const IntPoint&);
FloatPoint m_offsetToThumb;
bool m_inDragMode;