18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
25af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * Copyright (C) 2008, 2009, 2010 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(VIDEO)
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MediaControlElements.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "CSSStyleSelector.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventNames.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatConversion.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h"
40231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "LocalizedStrings.h"
412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "MediaControls.h"
42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "MouseEvent.h"
43643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Page.h"
442bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "RenderFlexibleBox.h"
45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "RenderMedia.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderSlider.h"
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "RenderTheme.h"
482bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "RenderView.h"
495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "Settings.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames;
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockHTMLMediaElement* toParentMediaElement(RenderObject* o)
56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Node* node = o->node();
58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Node* mediaNode = node ? node->shadowAncestorNode() : 0;
59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!mediaNode || (!mediaNode->hasTagName(HTMLNames::videoTag) && !mediaNode->hasTagName(HTMLNames::audioTag)))
60231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return 0;
61231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
62231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return static_cast<HTMLMediaElement*>(mediaNode);
63231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
64231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
65231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block// FIXME: These constants may need to be tweaked to better match the seeking in the QuickTime plug-in.
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const float cSeekRepeatDelay = 0.1f;
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const float cStepTime = 0.07f;
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const float cSeekTime = 0.2f;
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ----------------------------
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
722fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockMediaControlElement::MediaControlElement(HTMLMediaElement* mediaElement)
735af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    : HTMLDivElement(divTag, mediaElement->document())
74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    , m_mediaElement(mediaElement)
75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic const String& displayString()
790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    DEFINE_STATIC_LOCAL(String, s, ("display"));
812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return s;
82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
83635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid MediaControlElement::show()
850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ExceptionCode ec;
872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // FIXME: Make more efficient <http://webkit.org/b/58157>
882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    style()->removeProperty(displayString(), ec);
898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid MediaControlElement::hide()
92635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ExceptionCode ec;
942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // FIXME: Make more efficient <http://webkit.org/b/58157>
952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    DEFINE_STATIC_LOCAL(String, none, ("none"));
962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    style()->setProperty(displayString(), none, ec);
97635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// ----------------------------
100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1012fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline MediaControlPanelElement::MediaControlPanelElement(HTMLMediaElement* mediaElement)
1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : MediaControlElement(mediaElement)
1032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1062fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockPassRefPtr<MediaControlPanelElement> MediaControlPanelElement::create(HTMLMediaElement* mediaElement)
1072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return adoptRef(new MediaControlPanelElement(mediaElement));
1092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1112fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockMediaControlElementType MediaControlPanelElement::displayType() const
1122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return MediaControlsPanel;
1142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1162fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst AtomicString& MediaControlPanelElement::shadowPseudoId() const
1172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-panel"));
1192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return id;
1202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// ----------------------------
1232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1245af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeinline MediaControlTimelineContainerElement::MediaControlTimelineContainerElement(HTMLMediaElement* mediaElement)
1252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : MediaControlElement(mediaElement)
1265af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
1275af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
1285af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
1295af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkePassRefPtr<MediaControlTimelineContainerElement> MediaControlTimelineContainerElement::create(HTMLMediaElement* mediaElement)
1300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<MediaControlTimelineContainerElement> element = adoptRef(new MediaControlTimelineContainerElement(mediaElement));
1322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    element->hide();
1332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return element.release();
1340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1362fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockMediaControlElementType MediaControlTimelineContainerElement::displayType() const
1372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return MediaTimelineContainer;
1392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1412fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst AtomicString& MediaControlTimelineContainerElement::shadowPseudoId() const
1422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-timeline-container"));
1442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return id;
1452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// ----------------------------
1480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1492bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass RenderMediaVolumeSliderContainer : public RenderBlock {
1502bde8e466a4451c7319e3a072d118917957d6554Steve Blockpublic:
1512bde8e466a4451c7319e3a072d118917957d6554Steve Block    RenderMediaVolumeSliderContainer(Node*);
1522bde8e466a4451c7319e3a072d118917957d6554Steve Block
1532bde8e466a4451c7319e3a072d118917957d6554Steve Blockprivate:
1542bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void layout();
1552bde8e466a4451c7319e3a072d118917957d6554Steve Block};
1562bde8e466a4451c7319e3a072d118917957d6554Steve Block
1572bde8e466a4451c7319e3a072d118917957d6554Steve BlockRenderMediaVolumeSliderContainer::RenderMediaVolumeSliderContainer(Node* node)
1582bde8e466a4451c7319e3a072d118917957d6554Steve Block    : RenderBlock(node)
1592bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1602bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1612bde8e466a4451c7319e3a072d118917957d6554Steve Block
1622bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid RenderMediaVolumeSliderContainer::layout()
1632bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1642bde8e466a4451c7319e3a072d118917957d6554Steve Block    RenderBlock::layout();
1652bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (style()->display() == NONE || !previousSibling() || !previousSibling()->isBox())
1662bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
1672bde8e466a4451c7319e3a072d118917957d6554Steve Block
1682bde8e466a4451c7319e3a072d118917957d6554Steve Block    RenderBox* buttonBox = toRenderBox(previousSibling());
1692bde8e466a4451c7319e3a072d118917957d6554Steve Block
1702bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (view())
1712bde8e466a4451c7319e3a072d118917957d6554Steve Block        view()->disableLayoutState();
1722bde8e466a4451c7319e3a072d118917957d6554Steve Block
1732bde8e466a4451c7319e3a072d118917957d6554Steve Block    IntPoint offset = theme()->volumeSliderOffsetFromMuteButton(buttonBox, IntSize(width(), height()));
1742bde8e466a4451c7319e3a072d118917957d6554Steve Block    setX(offset.x() + buttonBox->offsetLeft());
1752bde8e466a4451c7319e3a072d118917957d6554Steve Block    setY(offset.y() + buttonBox->offsetTop());
1762bde8e466a4451c7319e3a072d118917957d6554Steve Block
1772bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (view())
1782bde8e466a4451c7319e3a072d118917957d6554Steve Block        view()->enableLayoutState();
1792bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1802bde8e466a4451c7319e3a072d118917957d6554Steve Block
1815af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeinline MediaControlVolumeSliderContainerElement::MediaControlVolumeSliderContainerElement(HTMLMediaElement* mediaElement)
1822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : MediaControlElement(mediaElement)
183231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
184231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
185231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1865af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkePassRefPtr<MediaControlVolumeSliderContainerElement> MediaControlVolumeSliderContainerElement::create(HTMLMediaElement* mediaElement)
1875af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
1882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<MediaControlVolumeSliderContainerElement> element = adoptRef(new MediaControlVolumeSliderContainerElement(mediaElement));
1892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    element->hide();
1902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return element.release();
1915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
1925af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
1932bde8e466a4451c7319e3a072d118917957d6554Steve BlockRenderObject* MediaControlVolumeSliderContainerElement::createRenderer(RenderArena* arena, RenderStyle*)
1942bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1952bde8e466a4451c7319e3a072d118917957d6554Steve Block    return new (arena) RenderMediaVolumeSliderContainer(this);
1962bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1972bde8e466a4451c7319e3a072d118917957d6554Steve Block
1982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid MediaControlVolumeSliderContainerElement::defaultEventHandler(Event* event)
199231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
2002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!event->isMouseEvent() || event->type() != eventNames().mouseoutEvent)
2012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
202231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Poor man's mouseleave event detection.
2042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
2052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!mouseEvent->relatedTarget() || !mouseEvent->relatedTarget()->toNode())
206231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
207231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (this->containsIncludingShadowDOM(mouseEvent->relatedTarget()->toNode()))
2092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
210231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    hide();
212231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
213231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2152fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockMediaControlElementType MediaControlVolumeSliderContainerElement::displayType() const
2162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return MediaVolumeSliderContainer;
2182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2202fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst AtomicString& MediaControlVolumeSliderContainerElement::shadowPseudoId() const
2212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-volume-slider-container"));
2232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return id;
2242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
226231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block// ----------------------------
227231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2285af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeinline MediaControlStatusDisplayElement::MediaControlStatusDisplayElement(HTMLMediaElement* mediaElement)
2292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : MediaControlElement(mediaElement)
230231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    , m_stateBeingDisplayed(Nothing)
2310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2345af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkePassRefPtr<MediaControlStatusDisplayElement> MediaControlStatusDisplayElement::create(HTMLMediaElement* mediaElement)
2355af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
2362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<MediaControlStatusDisplayElement> element = adoptRef(new MediaControlStatusDisplayElement(mediaElement));
2372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    element->hide();
2382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return element.release();
2395af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
2405af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
2410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid MediaControlStatusDisplayElement::update()
2420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Get the new state that we'll have to display.
2440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    StateBeingDisplayed newStateToDisplay = Nothing;
2450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2465af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (mediaElement()->readyState() != HTMLMediaElement::HAVE_ENOUGH_DATA && !mediaElement()->currentSrc().isEmpty())
2470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        newStateToDisplay = Loading;
2485af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    else if (mediaElement()->movieLoadType() == MediaPlayer::LiveStream)
2490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        newStateToDisplay = LiveBroadcast;
2500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (newStateToDisplay == m_stateBeingDisplayed)
2520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
2530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode e;
2552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (m_stateBeingDisplayed == Nothing)
2572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        show();
2582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    else if (newStateToDisplay == Nothing)
2592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        hide();
2602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_stateBeingDisplayed = newStateToDisplay;
2622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    switch (m_stateBeingDisplayed) {
2640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case Nothing:
2650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        setInnerText("", e);
2660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        break;
2670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case Loading:
2680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        setInnerText(mediaElementLoadingStateText(), e);
2690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        break;
2700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case LiveBroadcast:
2710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        setInnerText(mediaElementLiveBroadcastStateText(), e);
2720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        break;
2730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
2740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2762fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockMediaControlElementType MediaControlStatusDisplayElement::displayType() const
2772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return MediaStatusDisplay;
2792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2812fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst AtomicString& MediaControlStatusDisplayElement::shadowPseudoId() const
2822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
2832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-status-display"));
2842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return id;
2852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// ----------------------------
2880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2892fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockMediaControlInputElement::MediaControlInputElement(HTMLMediaElement* mediaElement, MediaControlElementType displayType)
2902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : HTMLInputElement(inputTag, mediaElement->document(), 0, false)
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_mediaElement(mediaElement)
2922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_displayType(displayType)
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid MediaControlInputElement::show()
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ExceptionCode ec;
2992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    style()->removeProperty(displayString(), ec);
3008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
3018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
3022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid MediaControlInputElement::hide()
3030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ExceptionCode ec;
3052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    DEFINE_STATIC_LOCAL(String, none, ("none"));
3062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    style()->setProperty(displayString(), none, ec);
3070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid MediaControlInputElement::setDisplayType(MediaControlElementType displayType)
3115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
3125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (displayType == m_displayType)
3135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return;
3145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
3155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_displayType = displayType;
316231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (RenderObject* object = renderer())
317231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        object->repaint();
3185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
3195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ----------------------------
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3222fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline MediaControlMuteButtonElement::MediaControlMuteButtonElement(HTMLMediaElement* mediaElement, MediaControlElementType displayType)
3232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : MediaControlInputElement(mediaElement, displayType)
3245af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
3255af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
3265af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid MediaControlMuteButtonElement::defaultEventHandler(Event* event)
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (event->type() == eventNames().clickEvent) {
3305af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        mediaElement()->setMuted(!mediaElement()->muted());
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        event->setDefaultHandled();
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HTMLInputElement::defaultEventHandler(event);
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid MediaControlMuteButtonElement::changedMute()
3382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    updateDisplayType();
3402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
34281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid MediaControlMuteButtonElement::updateDisplayType()
3432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
34481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setDisplayType(mediaElement()->muted() ? MediaUnMuteButton : MediaMuteButton);
3452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
34781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// ----------------------------
34881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline MediaControlPanelMuteButtonElement::MediaControlPanelMuteButtonElement(HTMLMediaElement* mediaElement, MediaControls* controls)
35081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    : MediaControlMuteButtonElement(mediaElement, MediaMuteButton)
3512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_controls(controls)
3525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
3535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
3545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
3552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochPassRefPtr<MediaControlPanelMuteButtonElement> MediaControlPanelMuteButtonElement::create(HTMLMediaElement* mediaElement, MediaControls* controls)
35681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
3572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(controls);
3582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<MediaControlPanelMuteButtonElement> button = adoptRef(new MediaControlPanelMuteButtonElement(mediaElement, controls));
36081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    button->setType("button");
36181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return button.release();
36281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
36381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid MediaControlPanelMuteButtonElement::defaultEventHandler(Event* event)
3652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
3662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (event->type() == eventNames().mouseoverEvent)
3672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_controls->showVolumeSlider();
3682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MediaControlMuteButtonElement::defaultEventHandler(event);
3702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
3712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
37281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochconst AtomicString& MediaControlPanelMuteButtonElement::shadowPseudoId() const
37381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
37481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-mute-button"));
37581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return id;
37681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
37781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
37881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// ----------------------------
37981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3802fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline MediaControlVolumeSliderMuteButtonElement::MediaControlVolumeSliderMuteButtonElement(HTMLMediaElement* mediaElement)
3812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    : MediaControlMuteButtonElement(mediaElement, MediaMuteButton)
3822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3852fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockPassRefPtr<MediaControlVolumeSliderMuteButtonElement> MediaControlVolumeSliderMuteButtonElement::create(HTMLMediaElement* mediaElement)
3862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RefPtr<MediaControlVolumeSliderMuteButtonElement> button = adoptRef(new MediaControlVolumeSliderMuteButtonElement(mediaElement));
3882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    button->setType("button");
3892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return button.release();
3902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3922fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst AtomicString& MediaControlVolumeSliderMuteButtonElement::shadowPseudoId() const
3932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-volume-slider-mute-button"));
3952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return id;
3962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ----------------------------
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4005af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeinline MediaControlPlayButtonElement::MediaControlPlayButtonElement(HTMLMediaElement* mediaElement)
4012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : MediaControlInputElement(mediaElement, MediaPlayButton)
4025af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
4035af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
4045af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
4055af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkePassRefPtr<MediaControlPlayButtonElement> MediaControlPlayButtonElement::create(HTMLMediaElement* mediaElement)
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
407bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    RefPtr<MediaControlPlayButtonElement> button = adoptRef(new MediaControlPlayButtonElement(mediaElement));
408bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    button->setType("button");
409bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return button.release();
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid MediaControlPlayButtonElement::defaultEventHandler(Event* event)
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (event->type() == eventNames().clickEvent) {
4155af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        mediaElement()->togglePlayState();
4162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        updateDisplayType();
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        event->setDefaultHandled();
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HTMLInputElement::defaultEventHandler(event);
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid MediaControlPlayButtonElement::updateDisplayType()
4235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
4245af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    setDisplayType(mediaElement()->canPlay() ? MediaPlayButton : MediaPauseButton);
4255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
4265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
4272fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst AtomicString& MediaControlPlayButtonElement::shadowPseudoId() const
4282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-play-button"));
4302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return id;
4312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ----------------------------
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4352fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline MediaControlSeekButtonElement::MediaControlSeekButtonElement(HTMLMediaElement* mediaElement, MediaControlElementType displayType)
4362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : MediaControlInputElement(mediaElement, displayType)
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_seeking(false)
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_capturing(false)
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_seekTimer(this, &MediaControlSeekButtonElement::seekTimerFired)
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid MediaControlSeekButtonElement::defaultEventHandler(Event* event)
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (event->type() == eventNames().mousedownEvent) {
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (Frame* frame = document()->frame()) {
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_capturing = true;
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            frame->eventHandler()->setCapturingMouseEventsNode(this);
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4505af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        mediaElement()->pause(event->fromUserGesture());
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_seekTimer.startRepeating(cSeekRepeatDelay);
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        event->setDefaultHandled();
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (event->type() == eventNames().mouseupEvent) {
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_capturing)
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (Frame* frame = document()->frame()) {
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_capturing = false;
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                frame->eventHandler()->setCapturingMouseEventsNode(0);
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ExceptionCode ec;
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_seeking || m_seekTimer.isActive()) {
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!m_seeking) {
4625af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                float stepTime = isForwardButton() ? cStepTime : -cStepTime;
4635af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                mediaElement()->setCurrentTime(mediaElement()->currentTime() + stepTime, ec);
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_seekTimer.stop();
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_seeking = false;
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            event->setDefaultHandled();
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HTMLInputElement::defaultEventHandler(event);
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid MediaControlSeekButtonElement::seekTimerFired(Timer<MediaControlSeekButtonElement>*)
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ExceptionCode ec;
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_seeking = true;
4775af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    float seekTime = isForwardButton() ? cSeekTime : -cSeekTime;
4785af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    mediaElement()->setCurrentTime(mediaElement()->currentTime() + seekTime, ec);
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid MediaControlSeekButtonElement::detach()
4820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_capturing) {
4840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (Frame* frame = document()->frame())
4850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            frame->eventHandler()->setCapturingMouseEventsNode(0);
4860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
4870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    MediaControlInputElement::detach();
4880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// ----------------------------
4910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4922fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline MediaControlSeekForwardButtonElement::MediaControlSeekForwardButtonElement(HTMLMediaElement* mediaElement)
4932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : MediaControlSeekButtonElement(mediaElement, MediaSeekForwardButton)
4942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
4962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4972fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockPassRefPtr<MediaControlSeekForwardButtonElement> MediaControlSeekForwardButtonElement::create(HTMLMediaElement* mediaElement)
4982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
4992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RefPtr<MediaControlSeekForwardButtonElement> button = adoptRef(new MediaControlSeekForwardButtonElement(mediaElement));
5002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    button->setType("button");
5012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return button.release();
5022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
5032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5042fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst AtomicString& MediaControlSeekForwardButtonElement::shadowPseudoId() const
5052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
5062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-seek-forward-button"));
5072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return id;
5082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
5092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// ----------------------------
5112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5122fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline MediaControlSeekBackButtonElement::MediaControlSeekBackButtonElement(HTMLMediaElement* mediaElement)
5132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : MediaControlSeekButtonElement(mediaElement, MediaSeekBackButton)
5142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
5152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
5162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5172fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockPassRefPtr<MediaControlSeekBackButtonElement> MediaControlSeekBackButtonElement::create(HTMLMediaElement* mediaElement)
5182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
5192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RefPtr<MediaControlSeekBackButtonElement> button = adoptRef(new MediaControlSeekBackButtonElement(mediaElement));
5202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    button->setType("button");
5212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return button.release();
5222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
5232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5242fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst AtomicString& MediaControlSeekBackButtonElement::shadowPseudoId() const
5252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
5262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-seek-back-button"));
5272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return id;
5282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
5292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// ----------------------------
5312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5325af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeinline MediaControlRewindButtonElement::MediaControlRewindButtonElement(HTMLMediaElement* element)
5332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : MediaControlInputElement(element, MediaRewindButton)
5340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
5350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
5360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5375af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkePassRefPtr<MediaControlRewindButtonElement> MediaControlRewindButtonElement::create(HTMLMediaElement* mediaElement)
5385af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
539bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    RefPtr<MediaControlRewindButtonElement> button = adoptRef(new MediaControlRewindButtonElement(mediaElement));
540bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    button->setType("button");
541bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return button.release();
5425af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
5435af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
5440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid MediaControlRewindButtonElement::defaultEventHandler(Event* event)
5450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
5460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (event->type() == eventNames().clickEvent) {
5475af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        mediaElement()->rewind(30);
5480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        event->setDefaultHandled();
5490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
5500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    HTMLInputElement::defaultEventHandler(event);
5510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
5520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5532fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst AtomicString& MediaControlRewindButtonElement::shadowPseudoId() const
5542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
5552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-rewind-button"));
5562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return id;
5572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
5582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// ----------------------------
5600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5615af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeinline MediaControlReturnToRealtimeButtonElement::MediaControlReturnToRealtimeButtonElement(HTMLMediaElement* mediaElement)
5622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : MediaControlInputElement(mediaElement, MediaReturnToRealtimeButton)
5630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
5640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
5650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5665af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkePassRefPtr<MediaControlReturnToRealtimeButtonElement> MediaControlReturnToRealtimeButtonElement::create(HTMLMediaElement* mediaElement)
5675af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
568bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    RefPtr<MediaControlReturnToRealtimeButtonElement> button = adoptRef(new MediaControlReturnToRealtimeButtonElement(mediaElement));
569bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    button->setType("button");
5702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    button->hide();
571bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return button.release();
5725af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
5735af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
5740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid MediaControlReturnToRealtimeButtonElement::defaultEventHandler(Event* event)
5750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
5760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (event->type() == eventNames().clickEvent) {
5775af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        mediaElement()->returnToRealtime();
5780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        event->setDefaultHandled();
5790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
5800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    HTMLInputElement::defaultEventHandler(event);
5810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
5820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5832fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst AtomicString& MediaControlReturnToRealtimeButtonElement::shadowPseudoId() const
5842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
5852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-return-to-realtime-button"));
5862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return id;
5872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
5880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ----------------------------
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeinline MediaControlToggleClosedCaptionsButtonElement::MediaControlToggleClosedCaptionsButtonElement(HTMLMediaElement* mediaElement)
5922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : MediaControlInputElement(mediaElement, MediaShowClosedCaptionsButton)
593643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
594643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
595643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
5965af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkePassRefPtr<MediaControlToggleClosedCaptionsButtonElement> MediaControlToggleClosedCaptionsButtonElement::create(HTMLMediaElement* mediaElement)
5975af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
598bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    RefPtr<MediaControlToggleClosedCaptionsButtonElement> button = adoptRef(new MediaControlToggleClosedCaptionsButtonElement(mediaElement));
599bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    button->setType("button");
6002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    button->hide();
601bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return button.release();
6025af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
6035af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
604643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid MediaControlToggleClosedCaptionsButtonElement::defaultEventHandler(Event* event)
605643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
606643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (event->type() == eventNames().clickEvent) {
6075af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        mediaElement()->setClosedCaptionsVisible(!mediaElement()->closedCaptionsVisible());
6085af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        setChecked(mediaElement()->closedCaptionsVisible());
6092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        updateDisplayType();
610643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        event->setDefaultHandled();
611643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
6122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
613643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    HTMLInputElement::defaultEventHandler(event);
614643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
615643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
616643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid MediaControlToggleClosedCaptionsButtonElement::updateDisplayType()
617643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
6185af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    setDisplayType(mediaElement()->closedCaptionsVisible() ? MediaHideClosedCaptionsButton : MediaShowClosedCaptionsButton);
619643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
620643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
6212fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst AtomicString& MediaControlToggleClosedCaptionsButtonElement::shadowPseudoId() const
6222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-toggle-closed-captions-button"));
6242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return id;
6252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
627643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// ----------------------------
628643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
6292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochMediaControlTimelineElement::MediaControlTimelineElement(HTMLMediaElement* mediaElement, MediaControls* controls)
6302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : MediaControlInputElement(mediaElement, MediaSlider)
6312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_controls(controls)
632231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochPassRefPtr<MediaControlTimelineElement> MediaControlTimelineElement::create(HTMLMediaElement* mediaElement, MediaControls* controls)
6365af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
6372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(controls);
6382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<MediaControlTimelineElement> timeline = adoptRef(new MediaControlTimelineElement(mediaElement, controls));
640bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    timeline->setType("range");
6412bde8e466a4451c7319e3a072d118917957d6554Steve Block    timeline->setAttribute(precisionAttr, "float");
642bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return timeline.release();
6435af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
6445af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid MediaControlTimelineElement::defaultEventHandler(Event* event)
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
647231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Left button is 0. Rejects mouse events not from left button.
648231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (event->isMouseEvent() && static_cast<MouseEvent*>(event)->button())
6490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
6500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
651dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!attached())
652dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
653dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (event->type() == eventNames().mousedownEvent)
6555af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        mediaElement()->beginScrubbing();
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6570d60bcd000865d49c38ca619815d4cd7b2afc87aBen Murdoch#if PLATFORM(ANDROID) && ENABLE(TOUCH_EVENTS)
6580d60bcd000865d49c38ca619815d4cd7b2afc87aBen Murdoch    if (event->type() == eventNames().touchstartEvent)
6590d60bcd000865d49c38ca619815d4cd7b2afc87aBen Murdoch        mediaElement()->beginScrubbing();
6600d60bcd000865d49c38ca619815d4cd7b2afc87aBen Murdoch#endif
6610d60bcd000865d49c38ca619815d4cd7b2afc87aBen Murdoch
6620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    MediaControlInputElement::defaultEventHandler(event);
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (event->type() == eventNames().mouseoverEvent || event->type() == eventNames().mouseoutEvent || event->type() == eventNames().mousemoveEvent)
6658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
666635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6670d60bcd000865d49c38ca619815d4cd7b2afc87aBen Murdoch#if PLATFORM(ANDROID) && ENABLE(TOUCH_EVENTS)
6680d60bcd000865d49c38ca619815d4cd7b2afc87aBen Murdoch    if (event->type() == eventNames().touchmoveEvent || event->type() == eventNames().touchcancelEvent)
6690d60bcd000865d49c38ca619815d4cd7b2afc87aBen Murdoch        return;
6700d60bcd000865d49c38ca619815d4cd7b2afc87aBen Murdoch#endif
6710d60bcd000865d49c38ca619815d4cd7b2afc87aBen Murdoch
6728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    float time = narrowPrecisionToFloat(value().toDouble());
6735af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (time != mediaElement()->currentTime()) {
6742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // FIXME: This is fired 3 times on every click. We should not be doing that <http:/webkit.org/b/58160>.
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ExceptionCode ec;
6765af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        mediaElement()->setCurrentTime(time, ec);
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
678635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RenderSlider* slider = toRenderSlider(renderer());
6802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (slider && slider->inDragMode())
6812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_controls->updateTimeDisplay();
6828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
6838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (event->type() == eventNames().mouseupEvent)
6845af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        mediaElement()->endScrubbing();
6850d60bcd000865d49c38ca619815d4cd7b2afc87aBen Murdoch
6860d60bcd000865d49c38ca619815d4cd7b2afc87aBen Murdoch#if PLATFORM(ANDROID) && ENABLE(TOUCH_EVENTS)
6870d60bcd000865d49c38ca619815d4cd7b2afc87aBen Murdoch    if (event->type() == eventNames().touchendEvent)
6880d60bcd000865d49c38ca619815d4cd7b2afc87aBen Murdoch        mediaElement()->endScrubbing();
6890d60bcd000865d49c38ca619815d4cd7b2afc87aBen Murdoch#endif
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid MediaControlTimelineElement::setPosition(float currentTime)
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    setValue(String::number(currentTime));
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid MediaControlTimelineElement::setDuration(float duration)
6982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
6992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    setAttribute(maxAttr, String::number(isfinite(duration) ? duration : 0));
7002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
7012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7032fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst AtomicString& MediaControlTimelineElement::shadowPseudoId() const
7042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
7052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-timeline"));
7062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return id;
7072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
7082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ----------------------------
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7115af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeinline MediaControlVolumeSliderElement::MediaControlVolumeSliderElement(HTMLMediaElement* mediaElement)
7122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : MediaControlInputElement(mediaElement, MediaVolumeSlider)
7135af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
7145af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
7155af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
7165af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkePassRefPtr<MediaControlVolumeSliderElement> MediaControlVolumeSliderElement::create(HTMLMediaElement* mediaElement)
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
718bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    RefPtr<MediaControlVolumeSliderElement> slider = adoptRef(new MediaControlVolumeSliderElement(mediaElement));
719bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    slider->setType("range");
7202bde8e466a4451c7319e3a072d118917957d6554Steve Block    slider->setAttribute(precisionAttr, "float");
7212bde8e466a4451c7319e3a072d118917957d6554Steve Block    slider->setAttribute(maxAttr, "1");
7222bde8e466a4451c7319e3a072d118917957d6554Steve Block    slider->setAttribute(valueAttr, String::number(mediaElement->volume()));
723bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return slider.release();
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
726231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid MediaControlVolumeSliderElement::defaultEventHandler(Event* event)
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
728231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Left button is 0. Rejects mouse events not from left button.
729231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (event->isMouseEvent() && static_cast<MouseEvent*>(event)->button())
730231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
731231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
732dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!attached())
733dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
734dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
735231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    MediaControlInputElement::defaultEventHandler(event);
736231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
737231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (event->type() == eventNames().mouseoverEvent || event->type() == eventNames().mouseoutEvent || event->type() == eventNames().mousemoveEvent)
738231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
739231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
740231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    float volume = narrowPrecisionToFloat(value().toDouble());
7415af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (volume != mediaElement()->volume()) {
742231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        ExceptionCode ec = 0;
7435af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        mediaElement()->setVolume(volume, ec);
744231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        ASSERT(!ec);
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid MediaControlVolumeSliderElement::setVolume(float volume)
749cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
750643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (value().toFloat() != volume)
751cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        setValue(String::number(volume));
752cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
753cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
7542fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst AtomicString& MediaControlVolumeSliderElement::shadowPseudoId() const
7552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
7562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-volume-slider"));
7572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return id;
7582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
7592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
760231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block// ----------------------------
761231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
7622bde8e466a4451c7319e3a072d118917957d6554Steve Blockinline MediaControlFullscreenVolumeSliderElement::MediaControlFullscreenVolumeSliderElement(HTMLMediaElement* mediaElement)
7632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    : MediaControlVolumeSliderElement(mediaElement)
7642bde8e466a4451c7319e3a072d118917957d6554Steve Block{
7652bde8e466a4451c7319e3a072d118917957d6554Steve Block}
7662bde8e466a4451c7319e3a072d118917957d6554Steve Block
7672bde8e466a4451c7319e3a072d118917957d6554Steve BlockPassRefPtr<MediaControlFullscreenVolumeSliderElement> MediaControlFullscreenVolumeSliderElement::create(HTMLMediaElement* mediaElement)
7682bde8e466a4451c7319e3a072d118917957d6554Steve Block{
7692bde8e466a4451c7319e3a072d118917957d6554Steve Block    RefPtr<MediaControlFullscreenVolumeSliderElement> slider = adoptRef(new MediaControlFullscreenVolumeSliderElement(mediaElement));
7702bde8e466a4451c7319e3a072d118917957d6554Steve Block    slider->setType("range");
7712bde8e466a4451c7319e3a072d118917957d6554Steve Block    slider->setAttribute(precisionAttr, "float");
7722bde8e466a4451c7319e3a072d118917957d6554Steve Block    slider->setAttribute(maxAttr, "1");
7732bde8e466a4451c7319e3a072d118917957d6554Steve Block    slider->setAttribute(valueAttr, String::number(mediaElement->volume()));
7742bde8e466a4451c7319e3a072d118917957d6554Steve Block    return slider.release();
7752bde8e466a4451c7319e3a072d118917957d6554Steve Block}
7762bde8e466a4451c7319e3a072d118917957d6554Steve Block
7772bde8e466a4451c7319e3a072d118917957d6554Steve Blockconst AtomicString& MediaControlFullscreenVolumeSliderElement::shadowPseudoId() const
7782bde8e466a4451c7319e3a072d118917957d6554Steve Block{
7792bde8e466a4451c7319e3a072d118917957d6554Steve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-fullscreen-volume-slider"));
7802bde8e466a4451c7319e3a072d118917957d6554Steve Block    return id;
7812bde8e466a4451c7319e3a072d118917957d6554Steve Block}
7822bde8e466a4451c7319e3a072d118917957d6554Steve Block
7832bde8e466a4451c7319e3a072d118917957d6554Steve Block// ----------------------------
7842bde8e466a4451c7319e3a072d118917957d6554Steve Block
7852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline MediaControlFullscreenButtonElement::MediaControlFullscreenButtonElement(HTMLMediaElement* mediaElement, MediaControls* controls)
7862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : MediaControlInputElement(mediaElement, MediaFullscreenButton)
7872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_controls(controls)
7885af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
7895af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
7905af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
7912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochPassRefPtr<MediaControlFullscreenButtonElement> MediaControlFullscreenButtonElement::create(HTMLMediaElement* mediaElement, MediaControls* controls)
7920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
7932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(controls);
7942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<MediaControlFullscreenButtonElement> button = adoptRef(new MediaControlFullscreenButtonElement(mediaElement, controls));
796bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    button->setType("button");
7972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    button->hide();
798bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return button.release();
7990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
8000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
801231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid MediaControlFullscreenButtonElement::defaultEventHandler(Event* event)
802231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
803231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (event->type() == eventNames().clickEvent) {
8045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(FULLSCREEN_API)
8055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        // Only use the new full screen API if the fullScreenEnabled setting has
8062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // been explicitly enabled. Otherwise, use the old fullscreen API. This
8075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        // allows apps which embed a WebView to retain the existing full screen
8085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        // video implementation without requiring them to implement their own full
8095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        // screen behavior.
8105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (document()->settings() && document()->settings()->fullScreenEnabled()) {
8112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (document()->webkitIsFullScreen() && document()->webkitCurrentFullScreenElement() == mediaElement()) {
8125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                document()->webkitCancelFullScreen();
8132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                m_controls->exitedFullscreen();
8142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            } else {
8155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                mediaElement()->webkitRequestFullScreen(0);
8162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                m_controls->enteredFullscreen();
8172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            }
8185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        } else
8195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
8205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            mediaElement()->enterFullscreen();
821231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        event->setDefaultHandled();
822231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
823231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    HTMLInputElement::defaultEventHandler(event);
824231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
8250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8262fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst AtomicString& MediaControlFullscreenButtonElement::shadowPseudoId() const
8272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
8282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-fullscreen-button"));
8292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return id;
8302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
8312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ----------------------------
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8342bde8e466a4451c7319e3a072d118917957d6554Steve Blockinline MediaControlFullscreenVolumeMinButtonElement::MediaControlFullscreenVolumeMinButtonElement(HTMLMediaElement* mediaElement)
8352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    : MediaControlInputElement(mediaElement, MediaUnMuteButton)
8360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
8370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
8380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8392bde8e466a4451c7319e3a072d118917957d6554Steve BlockPassRefPtr<MediaControlFullscreenVolumeMinButtonElement> MediaControlFullscreenVolumeMinButtonElement::create(HTMLMediaElement* mediaElement)
8400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
8412bde8e466a4451c7319e3a072d118917957d6554Steve Block    RefPtr<MediaControlFullscreenVolumeMinButtonElement> button = adoptRef(new MediaControlFullscreenVolumeMinButtonElement(mediaElement));
8422bde8e466a4451c7319e3a072d118917957d6554Steve Block    button->setType("button");
8432bde8e466a4451c7319e3a072d118917957d6554Steve Block    return button.release();
8442bde8e466a4451c7319e3a072d118917957d6554Steve Block}
8452bde8e466a4451c7319e3a072d118917957d6554Steve Block
8462bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid MediaControlFullscreenVolumeMinButtonElement::defaultEventHandler(Event* event)
8472bde8e466a4451c7319e3a072d118917957d6554Steve Block{
8482bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (event->type() == eventNames().clickEvent) {
8492bde8e466a4451c7319e3a072d118917957d6554Steve Block        ExceptionCode code = 0;
8502bde8e466a4451c7319e3a072d118917957d6554Steve Block        mediaElement()->setVolume(0, code);
8512bde8e466a4451c7319e3a072d118917957d6554Steve Block        event->setDefaultHandled();
8520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
8532bde8e466a4451c7319e3a072d118917957d6554Steve Block    HTMLInputElement::defaultEventHandler(event);
8540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
8550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8562bde8e466a4451c7319e3a072d118917957d6554Steve Blockconst AtomicString& MediaControlFullscreenVolumeMinButtonElement::shadowPseudoId() const
8570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
8582bde8e466a4451c7319e3a072d118917957d6554Steve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-fullscreen-volume-min-button"));
8592bde8e466a4451c7319e3a072d118917957d6554Steve Block    return id;
8602bde8e466a4451c7319e3a072d118917957d6554Steve Block}
8610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8622bde8e466a4451c7319e3a072d118917957d6554Steve Block// ----------------------------
8630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8642bde8e466a4451c7319e3a072d118917957d6554Steve Blockinline MediaControlFullscreenVolumeMaxButtonElement::MediaControlFullscreenVolumeMaxButtonElement(HTMLMediaElement* mediaElement)
8652bde8e466a4451c7319e3a072d118917957d6554Steve Block: MediaControlInputElement(mediaElement, MediaMuteButton)
8662bde8e466a4451c7319e3a072d118917957d6554Steve Block{
8672bde8e466a4451c7319e3a072d118917957d6554Steve Block}
8682bde8e466a4451c7319e3a072d118917957d6554Steve Block
8692bde8e466a4451c7319e3a072d118917957d6554Steve BlockPassRefPtr<MediaControlFullscreenVolumeMaxButtonElement> MediaControlFullscreenVolumeMaxButtonElement::create(HTMLMediaElement* mediaElement)
8702bde8e466a4451c7319e3a072d118917957d6554Steve Block{
8712bde8e466a4451c7319e3a072d118917957d6554Steve Block    RefPtr<MediaControlFullscreenVolumeMaxButtonElement> button = adoptRef(new MediaControlFullscreenVolumeMaxButtonElement(mediaElement));
8722bde8e466a4451c7319e3a072d118917957d6554Steve Block    button->setType("button");
8732bde8e466a4451c7319e3a072d118917957d6554Steve Block    return button.release();
8742bde8e466a4451c7319e3a072d118917957d6554Steve Block}
8752bde8e466a4451c7319e3a072d118917957d6554Steve Block
8762bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid MediaControlFullscreenVolumeMaxButtonElement::defaultEventHandler(Event* event)
8772bde8e466a4451c7319e3a072d118917957d6554Steve Block{
8782bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (event->type() == eventNames().clickEvent) {
8792bde8e466a4451c7319e3a072d118917957d6554Steve Block        ExceptionCode code = 0;
8802bde8e466a4451c7319e3a072d118917957d6554Steve Block        mediaElement()->setVolume(1, code);
8812bde8e466a4451c7319e3a072d118917957d6554Steve Block        event->setDefaultHandled();
8822bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
8832bde8e466a4451c7319e3a072d118917957d6554Steve Block    HTMLInputElement::defaultEventHandler(event);
8842bde8e466a4451c7319e3a072d118917957d6554Steve Block}
8852bde8e466a4451c7319e3a072d118917957d6554Steve Block
8862bde8e466a4451c7319e3a072d118917957d6554Steve Blockconst AtomicString& MediaControlFullscreenVolumeMaxButtonElement::shadowPseudoId() const
8872bde8e466a4451c7319e3a072d118917957d6554Steve Block{
8882bde8e466a4451c7319e3a072d118917957d6554Steve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-fullscreen-volume-max-button"));
8892bde8e466a4451c7319e3a072d118917957d6554Steve Block    return id;
8902bde8e466a4451c7319e3a072d118917957d6554Steve Block}
8912bde8e466a4451c7319e3a072d118917957d6554Steve Block
8922bde8e466a4451c7319e3a072d118917957d6554Steve Block// ----------------------------
8932bde8e466a4451c7319e3a072d118917957d6554Steve Block
8942bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass RenderMediaControlTimeDisplay : public RenderFlexibleBox {
8952bde8e466a4451c7319e3a072d118917957d6554Steve Blockpublic:
8962bde8e466a4451c7319e3a072d118917957d6554Steve Block    RenderMediaControlTimeDisplay(Node*);
8972bde8e466a4451c7319e3a072d118917957d6554Steve Block
8982bde8e466a4451c7319e3a072d118917957d6554Steve Blockprivate:
8992bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void layout();
9002bde8e466a4451c7319e3a072d118917957d6554Steve Block};
9012bde8e466a4451c7319e3a072d118917957d6554Steve Block
9022bde8e466a4451c7319e3a072d118917957d6554Steve BlockRenderMediaControlTimeDisplay::RenderMediaControlTimeDisplay(Node* node)
9032bde8e466a4451c7319e3a072d118917957d6554Steve Block    : RenderFlexibleBox(node)
9042bde8e466a4451c7319e3a072d118917957d6554Steve Block{
9052bde8e466a4451c7319e3a072d118917957d6554Steve Block}
9062bde8e466a4451c7319e3a072d118917957d6554Steve Block
9072bde8e466a4451c7319e3a072d118917957d6554Steve Block// We want the timeline slider to be at least 100 pixels wide.
9082bde8e466a4451c7319e3a072d118917957d6554Steve Block// FIXME: Eliminate hard-coded widths altogether.
9092bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic const int minWidthToDisplayTimeDisplays = 45 + 100 + 45;
9102bde8e466a4451c7319e3a072d118917957d6554Steve Block
9112bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid RenderMediaControlTimeDisplay::layout()
9122bde8e466a4451c7319e3a072d118917957d6554Steve Block{
9132bde8e466a4451c7319e3a072d118917957d6554Steve Block    RenderFlexibleBox::layout();
9142bde8e466a4451c7319e3a072d118917957d6554Steve Block    RenderBox* timelineContainerBox = parentBox();
9152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    while (timelineContainerBox && timelineContainerBox->isAnonymous())
9162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        timelineContainerBox = timelineContainerBox->parentBox();
9172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9182bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (timelineContainerBox && timelineContainerBox->width() < minWidthToDisplayTimeDisplays)
9192bde8e466a4451c7319e3a072d118917957d6554Steve Block        setWidth(0);
9202bde8e466a4451c7319e3a072d118917957d6554Steve Block}
9212bde8e466a4451c7319e3a072d118917957d6554Steve Block
9222bde8e466a4451c7319e3a072d118917957d6554Steve Blockinline MediaControlTimeDisplayElement::MediaControlTimeDisplayElement(HTMLMediaElement* mediaElement)
9232bde8e466a4451c7319e3a072d118917957d6554Steve Block    : MediaControlElement(mediaElement)
9242bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_currentValue(0)
9252bde8e466a4451c7319e3a072d118917957d6554Steve Block{
9260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
9270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
928231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid MediaControlTimeDisplayElement::setCurrentValue(float time)
929231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
930231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_currentValue = time;
931231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
932231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
9332bde8e466a4451c7319e3a072d118917957d6554Steve BlockRenderObject* MediaControlTimeDisplayElement::createRenderer(RenderArena* arena, RenderStyle*)
9342bde8e466a4451c7319e3a072d118917957d6554Steve Block{
9352bde8e466a4451c7319e3a072d118917957d6554Steve Block    return new (arena) RenderMediaControlTimeDisplay(this);
9362bde8e466a4451c7319e3a072d118917957d6554Steve Block}
9372bde8e466a4451c7319e3a072d118917957d6554Steve Block
9382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// ----------------------------
9392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9402fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockPassRefPtr<MediaControlTimeRemainingDisplayElement> MediaControlTimeRemainingDisplayElement::create(HTMLMediaElement* mediaElement)
9412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return adoptRef(new MediaControlTimeRemainingDisplayElement(mediaElement));
9432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9452fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockMediaControlTimeRemainingDisplayElement::MediaControlTimeRemainingDisplayElement(HTMLMediaElement* mediaElement)
9462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : MediaControlTimeDisplayElement(mediaElement)
9472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9502fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockMediaControlElementType MediaControlTimeRemainingDisplayElement::displayType() const
9512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return MediaTimeRemainingDisplay;
9532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9552fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst AtomicString& MediaControlTimeRemainingDisplayElement::shadowPseudoId() const
9562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-time-remaining-display"));
9582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return id;
9592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// ----------------------------
9622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9632fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockPassRefPtr<MediaControlCurrentTimeDisplayElement> MediaControlCurrentTimeDisplayElement::create(HTMLMediaElement* mediaElement)
9642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return adoptRef(new MediaControlCurrentTimeDisplayElement(mediaElement));
9662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9682fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockMediaControlCurrentTimeDisplayElement::MediaControlCurrentTimeDisplayElement(HTMLMediaElement* mediaElement)
9692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : MediaControlTimeDisplayElement(mediaElement)
9702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9732fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockMediaControlElementType MediaControlCurrentTimeDisplayElement::displayType() const
9742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return MediaCurrentTimeDisplay;
9762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9782fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockconst AtomicString& MediaControlCurrentTimeDisplayElement::shadowPseudoId() const
9792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-current-time-display"));
9812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return id;
9822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9845af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} // namespace WebCore
9850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9865af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#endif // ENABLE(VIDEO)
987