15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     its contributors may be used to endorse or promote products derived
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     from this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/shadow/MediaControlElements.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
33197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionStatePlaceholder.h"
348abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/dom/DOMTokenList.h"
3551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h"
3606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/MouseEvent.h"
37d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLVideoElement.h"
39aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch#include "core/html/MediaController.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/shadow/MediaControls.h"
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/track/TextTrack.h"
4251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/html/track/vtt/VTTRegionList.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderMediaControlElements.h"
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderSlider.h"
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTheme.h"
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderVideo.h"
485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h"
49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
50c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static const AtomicString& getMediaControlCurrentTimeDisplayElementShadowPseudoId();
5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static const AtomicString& getMediaControlTimeRemainingDisplayElementShadowPseudoId();
5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
57c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// This is the duration from mediaControls.css
58f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)static const double fadeOutDuration = 0.3;
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)static bool isUserInteractionEvent(Event* event)
61c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
62c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    const AtomicString& type = event->type();
63c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return type == EventTypeNames::mousedown
64c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || type == EventTypeNames::mouseup
65c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || type == EventTypeNames::click
66c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || type == EventTypeNames::dblclick
67c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || event->isKeyboardEvent()
68c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || event->isTouchEvent();
69c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
70c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
71c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// Sliders (the volume control and timeline) need to capture some additional events used when dragging the thumb.
72c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)static bool isUserInteractionEventForSlider(Event* event)
73c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
74c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    const AtomicString& type = event->type();
75c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return type == EventTypeNames::mousedown
76c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || type == EventTypeNames::mouseup
77c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || type == EventTypeNames::click
78c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || type == EventTypeNames::dblclick
79c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || type == EventTypeNames::mouseover
80c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || type == EventTypeNames::mouseout
81c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || type == EventTypeNames::mousemove
82c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || event->isKeyboardEvent()
83c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || event->isTouchEvent();
84c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
85c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
86c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
87d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)MediaControlPanelElement::MediaControlPanelElement(MediaControls& mediaControls)
88d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : MediaControlDivElement(mediaControls, MediaControlsPanel)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isDisplayed(false)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_opaque(true)
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_transitionTimer(this, &MediaControlPanelElement::transitionTimerFired)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
95d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<MediaControlPanelElement> MediaControlPanelElement::create(MediaControls& mediaControls)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return adoptRefWillBeNoop(new MediaControlPanelElement(mediaControls));
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const AtomicString& MediaControlPanelElement::shadowPseudoId() const
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-panel", AtomicString::ConstructFromLiteral));
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return id;
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid MediaControlPanelElement::defaultEventHandler(Event* event)
10707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
10807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // Suppress the media element activation behavior (toggle play/pause) when
10907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // any part of the control panel is clicked.
11007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (event->type() == EventTypeNames::click) {
11107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        event->setDefaultHandled();
11207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return;
11307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
11407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    HTMLDivElement::defaultEventHandler(event);
11507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
11607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void MediaControlPanelElement::startTimer()
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stopTimer();
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The timer is required to set the property display:'none' on the panel,
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // such that captions are correctly displayed at the bottom of the video
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // at the end of the fadeout transition.
124f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    // FIXME: Racing a transition with a setTimeout like this is wrong.
125d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_transitionTimer.startOneShot(fadeOutDuration, FROM_HERE);
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void MediaControlPanelElement::stopTimer()
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_transitionTimer.isActive())
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_transitionTimer.stop();
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void MediaControlPanelElement::transitionTimerFired(Timer<MediaControlPanelElement>*)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_opaque)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hide();
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stopTimer();
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void MediaControlPanelElement::makeOpaque()
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_opaque)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setInlineStyleProperty(CSSPropertyOpacity, 1.0, CSSPrimitiveValue::CSS_NUMBER);
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_opaque = true;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_isDisplayed)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        show();
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void MediaControlPanelElement::makeTransparent()
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_opaque)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setInlineStyleProperty(CSSPropertyOpacity, 0.0, CSSPrimitiveValue::CSS_NUMBER);
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_opaque = false;
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    startTimer();
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void MediaControlPanelElement::setIsDisplayed(bool isDisplayed)
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isDisplayed = isDisplayed;
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
170c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)bool MediaControlPanelElement::keepEventInNode(Event* event)
171c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
172c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return isUserInteractionEvent(event);
173c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
174c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
177d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)MediaControlPanelEnclosureElement::MediaControlPanelEnclosureElement(MediaControls& mediaControls)
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Mapping onto same MediaControlElementType as panel element, since it has similar properties.
179d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : MediaControlDivElement(mediaControls, MediaControlsPanel)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
183d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<MediaControlPanelEnclosureElement> MediaControlPanelEnclosureElement::create(MediaControls& mediaControls)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return adoptRefWillBeNoop(new MediaControlPanelEnclosureElement(mediaControls));
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const AtomicString& MediaControlPanelEnclosureElement::shadowPseudoId() const
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-enclosure", AtomicString::ConstructFromLiteral));
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return id;
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
196d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)MediaControlOverlayEnclosureElement::MediaControlOverlayEnclosureElement(MediaControls& mediaControls)
197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Mapping onto same MediaControlElementType as panel element, since it has similar properties.
198d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : MediaControlDivElement(mediaControls, MediaControlsPanel)
199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
202d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<MediaControlOverlayEnclosureElement> MediaControlOverlayEnclosureElement::create(MediaControls& mediaControls)
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return adoptRefWillBeNoop(new MediaControlOverlayEnclosureElement(mediaControls));
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const AtomicString& MediaControlOverlayEnclosureElement::shadowPseudoId() const
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-overlay-enclosure", AtomicString::ConstructFromLiteral));
210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return id;
211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid* MediaControlOverlayEnclosureElement::preDispatchEventHandler(Event* event)
2147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
2157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // When the media element is clicked or touched we want to make the overlay cast button visible
2167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // (if the other requirements are right) even if JavaScript is doing its own handling of the event.
2177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Doing it in preDispatchEventHandler prevents any interference from JavaScript.
2187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Note that we can't simply test for click, since JS handling of touch events can prevent their translation to click events.
2197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (event && (event->type() == EventTypeNames::click || event->type() == EventTypeNames::touchstart) && mediaElement().hasRemoteRoutes() && !mediaElement().shouldShowControls())
2207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        mediaControls().showOverlayCastButton();
2217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return MediaControlDivElement::preDispatchEventHandler(event);
2227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
2237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// ----------------------------
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
227d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)MediaControlMuteButtonElement::MediaControlMuteButtonElement(MediaControls& mediaControls)
228d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : MediaControlInputElement(mediaControls, MediaMuteButton)
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
232d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<MediaControlMuteButtonElement> MediaControlMuteButtonElement::create(MediaControls& mediaControls)
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeRawPtr<MediaControlMuteButtonElement> button = adoptRefWillBeNoop(new MediaControlMuteButtonElement(mediaControls));
235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    button->ensureUserAgentShadowRoot();
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    button->setType("button");
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return button.release();
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
240d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void MediaControlMuteButtonElement::defaultEventHandler(Event* event)
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
242d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (event->type() == EventTypeNames::click) {
24307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        mediaElement().setMuted(!mediaElement().muted());
244d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        event->setDefaultHandled();
245d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
247d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    HTMLInputElement::defaultEventHandler(event);
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
250d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void MediaControlMuteButtonElement::updateDisplayType()
251d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
25207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setDisplayType(mediaElement().muted() ? MediaUnMuteButton : MediaMuteButton);
253d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
254d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
255d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)const AtomicString& MediaControlMuteButtonElement::shadowPseudoId() const
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-mute-button", AtomicString::ConstructFromLiteral));
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return id;
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
263d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)MediaControlPlayButtonElement::MediaControlPlayButtonElement(MediaControls& mediaControls)
264d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : MediaControlInputElement(mediaControls, MediaPlayButton)
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
268d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<MediaControlPlayButtonElement> MediaControlPlayButtonElement::create(MediaControls& mediaControls)
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeRawPtr<MediaControlPlayButtonElement> button = adoptRefWillBeNoop(new MediaControlPlayButtonElement(mediaControls));
271926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    button->ensureUserAgentShadowRoot();
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    button->setType("button");
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return button.release();
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void MediaControlPlayButtonElement::defaultEventHandler(Event* event)
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2781e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() == EventTypeNames::click) {
27907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        mediaElement().togglePlayState();
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateDisplayType();
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event->setDefaultHandled();
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLInputElement::defaultEventHandler(event);
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void MediaControlPlayButtonElement::updateDisplayType()
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
28807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setDisplayType(mediaElement().togglePlayStateWillPlay() ? MediaPlayButton : MediaPauseButton);
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const AtomicString& MediaControlPlayButtonElement::shadowPseudoId() const
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-play-button", AtomicString::ConstructFromLiteral));
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return id;
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
299d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)MediaControlOverlayPlayButtonElement::MediaControlOverlayPlayButtonElement(MediaControls& mediaControls)
300d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : MediaControlInputElement(mediaControls, MediaOverlayPlayButton)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
304d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<MediaControlOverlayPlayButtonElement> MediaControlOverlayPlayButtonElement::create(MediaControls& mediaControls)
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeRawPtr<MediaControlOverlayPlayButtonElement> button = adoptRefWillBeNoop(new MediaControlOverlayPlayButtonElement(mediaControls));
307926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    button->ensureUserAgentShadowRoot();
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    button->setType("button");
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return button.release();
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
312f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid MediaControlOverlayPlayButtonElement::defaultEventHandler(Event* event)
313f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
314f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (event->type() == EventTypeNames::click && mediaElement().togglePlayStateWillPlay()) {
315f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        mediaElement().togglePlayState();
316f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        updateDisplayType();
317f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        event->setDefaultHandled();
318f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    }
319f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
320f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void MediaControlOverlayPlayButtonElement::updateDisplayType()
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (mediaElement().shouldShowControls() && mediaElement().togglePlayStateWillPlay())
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        show();
3257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    else
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hide();
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const AtomicString& MediaControlOverlayPlayButtonElement::shadowPseudoId() const
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-overlay-play-button", AtomicString::ConstructFromLiteral));
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return id;
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
335c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)bool MediaControlOverlayPlayButtonElement::keepEventInNode(Event* event)
336c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
337c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return isUserInteractionEvent(event);
338c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
339c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
343d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)MediaControlToggleClosedCaptionsButtonElement::MediaControlToggleClosedCaptionsButtonElement(MediaControls& mediaControls)
344d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : MediaControlInputElement(mediaControls, MediaShowClosedCaptionsButton)
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
348d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<MediaControlToggleClosedCaptionsButtonElement> MediaControlToggleClosedCaptionsButtonElement::create(MediaControls& mediaControls)
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeRawPtr<MediaControlToggleClosedCaptionsButtonElement> button = adoptRefWillBeNoop(new MediaControlToggleClosedCaptionsButtonElement(mediaControls));
351926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    button->ensureUserAgentShadowRoot();
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    button->setType("button");
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    button->hide();
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return button.release();
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void MediaControlToggleClosedCaptionsButtonElement::updateDisplayType()
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
35943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    bool captionsVisible = mediaElement().closedCaptionsVisible();
360926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setDisplayType(captionsVisible ? MediaHideClosedCaptionsButton : MediaShowClosedCaptionsButton);
361926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setChecked(captionsVisible);
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void MediaControlToggleClosedCaptionsButtonElement::defaultEventHandler(Event* event)
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3661e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() == EventTypeNames::click) {
36743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        mediaElement().setClosedCaptionsVisible(!mediaElement().closedCaptionsVisible());
36843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        setChecked(mediaElement().closedCaptionsVisible());
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateDisplayType();
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event->setDefaultHandled();
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLInputElement::defaultEventHandler(event);
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const AtomicString& MediaControlToggleClosedCaptionsButtonElement::shadowPseudoId() const
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-toggle-closed-captions-button", AtomicString::ConstructFromLiteral));
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return id;
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
384d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)MediaControlTimelineElement::MediaControlTimelineElement(MediaControls& mediaControls)
385d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : MediaControlInputElement(mediaControls, MediaSlider)
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
389d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<MediaControlTimelineElement> MediaControlTimelineElement::create(MediaControls& mediaControls)
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeRawPtr<MediaControlTimelineElement> timeline = adoptRefWillBeNoop(new MediaControlTimelineElement(mediaControls));
392926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    timeline->ensureUserAgentShadowRoot();
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    timeline->setType("range");
394f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    timeline->setAttribute(stepAttr, "any");
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return timeline.release();
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void MediaControlTimelineElement::defaultEventHandler(Event* event)
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
40007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (event->isMouseEvent() && toMouseEvent(event)->button() != LeftButton)
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!inDocument() || !document().isActive())
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() == EventTypeNames::mousedown)
40707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        mediaControls().beginScrubbing();
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4091e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() == EventTypeNames::mouseup)
41007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        mediaControls().endScrubbing();
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MediaControlInputElement::defaultEventHandler(event);
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() == EventTypeNames::mouseover || event->type() == EventTypeNames::mouseout || event->type() == EventTypeNames::mousemove)
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    double time = value().toDouble();
418aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (event->type() == EventTypeNames::input) {
419a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        // FIXME: This will need to take the timeline offset into consideration
420a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        // once that concept is supported, see https://crbug.com/312699
421aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (mediaElement().controller())
4227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            mediaElement().controller()->setCurrentTime(time);
423aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        else
424aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            mediaElement().setCurrentTime(time, IGNORE_EXCEPTION);
425aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    }
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderSlider* slider = toRenderSlider(renderer());
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (slider && slider->inDragMode())
429d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        mediaControls().updateCurrentTimeDisplay();
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool MediaControlTimelineElement::willRespondToMouseClickEvents()
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return inDocument() && document().isActive();
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void MediaControlTimelineElement::setPosition(double currentTime)
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValue(String::number(currentTime));
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
44253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void MediaControlTimelineElement::setDuration(double duration)
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
44451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setFloatingPointAttribute(maxAttr, std::isfinite(duration) ? duration : 0);
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
44709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const AtomicString& MediaControlTimelineElement::shadowPseudoId() const
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-timeline", AtomicString::ConstructFromLiteral));
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return id;
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
453c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)bool MediaControlTimelineElement::keepEventInNode(Event* event)
454c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
455c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return isUserInteractionEventForSlider(event);
456c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
457c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
460d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)MediaControlVolumeSliderElement::MediaControlVolumeSliderElement(MediaControls& mediaControls)
461d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : MediaControlInputElement(mediaControls, MediaVolumeSlider)
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
465d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<MediaControlVolumeSliderElement> MediaControlVolumeSliderElement::create(MediaControls& mediaControls)
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeRawPtr<MediaControlVolumeSliderElement> slider = adoptRefWillBeNoop(new MediaControlVolumeSliderElement(mediaControls));
468926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    slider->ensureUserAgentShadowRoot();
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    slider->setType("range");
470f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    slider->setAttribute(stepAttr, "any");
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    slider->setAttribute(maxAttr, "1");
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return slider.release();
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void MediaControlVolumeSliderElement::defaultEventHandler(Event* event)
476d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
477d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (event->isMouseEvent() && toMouseEvent(event)->button() != LeftButton)
478d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
479d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
480d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!inDocument() || !document().isActive())
481d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
482d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
483d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    MediaControlInputElement::defaultEventHandler(event);
484d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
485d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (event->type() == EventTypeNames::mouseover || event->type() == EventTypeNames::mouseout || event->type() == EventTypeNames::mousemove)
486d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
487d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
488d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    double volume = value().toDouble();
48907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    mediaElement().setVolume(volume, ASSERT_NO_EXCEPTION);
49007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    mediaElement().setMuted(false);
491d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
492d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
493d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool MediaControlVolumeSliderElement::willRespondToMouseMoveEvents()
494d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
495d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!inDocument() || !document().isActive())
496d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
497d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
498d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return MediaControlInputElement::willRespondToMouseMoveEvents();
499d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
500d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
501d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool MediaControlVolumeSliderElement::willRespondToMouseClickEvents()
502d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
503d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!inDocument() || !document().isActive())
504d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
505d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
506d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return MediaControlInputElement::willRespondToMouseClickEvents();
507d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
508d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
509d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void MediaControlVolumeSliderElement::setVolume(double volume)
510d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
511d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (value().toDouble() != volume)
512d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        setValue(String::number(volume));
513d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
514d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
515d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)const AtomicString& MediaControlVolumeSliderElement::shadowPseudoId() const
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-volume-slider", AtomicString::ConstructFromLiteral));
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return id;
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
521c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)bool MediaControlVolumeSliderElement::keepEventInNode(Event* event)
522c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
523c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return isUserInteractionEventForSlider(event);
524c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
525c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
528d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)MediaControlFullscreenButtonElement::MediaControlFullscreenButtonElement(MediaControls& mediaControls)
529d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : MediaControlInputElement(mediaControls, MediaEnterFullscreenButton)
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
533d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<MediaControlFullscreenButtonElement> MediaControlFullscreenButtonElement::create(MediaControls& mediaControls)
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeRawPtr<MediaControlFullscreenButtonElement> button = adoptRefWillBeNoop(new MediaControlFullscreenButtonElement(mediaControls));
536926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    button->ensureUserAgentShadowRoot();
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    button->setType("button");
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    button->hide();
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return button.release();
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void MediaControlFullscreenButtonElement::defaultEventHandler(Event* event)
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() == EventTypeNames::click) {
545197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (mediaElement().isFullscreen())
546197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            mediaElement().exitFullscreen();
54743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        else
548197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            mediaElement().enterFullscreen();
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event->setDefaultHandled();
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLInputElement::defaultEventHandler(event);
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const AtomicString& MediaControlFullscreenButtonElement::shadowPseudoId() const
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-fullscreen-button", AtomicString::ConstructFromLiteral));
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return id;
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void MediaControlFullscreenButtonElement::setIsFullscreen(bool isFullscreen)
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setDisplayType(isFullscreen ? MediaExitFullscreenButton : MediaEnterFullscreenButton);
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciMediaControlCastButtonElement::MediaControlCastButtonElement(MediaControls& mediaControls, bool isOverlayButton)
5687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    : MediaControlInputElement(mediaControls, MediaCastOnButton), m_isOverlayButton(isOverlayButton)
5697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
5707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
5717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
5727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciPassRefPtrWillBeRawPtr<MediaControlCastButtonElement> MediaControlCastButtonElement::create(MediaControls& mediaControls, bool isOverlayButton)
5737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
5747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeRawPtr<MediaControlCastButtonElement> button = adoptRefWillBeNoop(new MediaControlCastButtonElement(mediaControls, isOverlayButton));
5757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    button->ensureUserAgentShadowRoot();
5767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    button->setType("button");
5777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return button.release();
5787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
5797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
5807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid MediaControlCastButtonElement::defaultEventHandler(Event* event)
5817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
5827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (event->type() == EventTypeNames::click) {
5837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (mediaElement().isPlayingRemotely()) {
5847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            mediaElement().requestRemotePlaybackControl();
5857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        } else {
5867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            mediaElement().requestRemotePlayback();
5877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
5887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
5897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    HTMLInputElement::defaultEventHandler(event);
5907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
5917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
5927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciconst AtomicString& MediaControlCastButtonElement::shadowPseudoId() const
5937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
5947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    DEFINE_STATIC_LOCAL(AtomicString, id_nonOverlay, ("-internal-media-controls-cast-button", AtomicString::ConstructFromLiteral));
5957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    DEFINE_STATIC_LOCAL(AtomicString, id_overlay, ("-internal-media-controls-overlay-cast-button", AtomicString::ConstructFromLiteral));
5967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_isOverlayButton ? id_overlay : id_nonOverlay;
5977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
5987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
5997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid MediaControlCastButtonElement::setIsPlayingRemotely(bool isPlayingRemotely)
6007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
6017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setDisplayType(isPlayingRemotely ? MediaCastOnButton : MediaCastOffButton);
6027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
6037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
6047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool MediaControlCastButtonElement::keepEventInNode(Event* event)
6057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
6067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return isUserInteractionEvent(event);
6077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
6087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
6097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// ----------------------------
6107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
611d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)MediaControlTimeRemainingDisplayElement::MediaControlTimeRemainingDisplayElement(MediaControls& mediaControls)
612d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : MediaControlTimeDisplayElement(mediaControls, MediaTimeRemainingDisplay)
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
616d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<MediaControlTimeRemainingDisplayElement> MediaControlTimeRemainingDisplayElement::create(MediaControls& mediaControls)
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return adoptRefWillBeNoop(new MediaControlTimeRemainingDisplayElement(mediaControls));
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
62153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static const AtomicString& getMediaControlTimeRemainingDisplayElementShadowPseudoId()
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-time-remaining-display", AtomicString::ConstructFromLiteral));
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return id;
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
62709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const AtomicString& MediaControlTimeRemainingDisplayElement::shadowPseudoId() const
62853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
62953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return getMediaControlTimeRemainingDisplayElementShadowPseudoId();
63053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
63153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
634d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)MediaControlCurrentTimeDisplayElement::MediaControlCurrentTimeDisplayElement(MediaControls& mediaControls)
635d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : MediaControlTimeDisplayElement(mediaControls, MediaCurrentTimeDisplay)
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
639d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<MediaControlCurrentTimeDisplayElement> MediaControlCurrentTimeDisplayElement::create(MediaControls& mediaControls)
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return adoptRefWillBeNoop(new MediaControlCurrentTimeDisplayElement(mediaControls));
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
64453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static const AtomicString& getMediaControlCurrentTimeDisplayElementShadowPseudoId()
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-current-time-display", AtomicString::ConstructFromLiteral));
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return id;
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const AtomicString& MediaControlCurrentTimeDisplayElement::shadowPseudoId() const
65153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
65253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return getMediaControlCurrentTimeDisplayElementShadowPseudoId();
65353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)// ----------------------------
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
657d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)MediaControlTextTrackContainerElement::MediaControlTextTrackContainerElement(MediaControls& mediaControls)
658d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : MediaControlDivElement(mediaControls, MediaTextTrackDisplayContainer)
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_fontSize(0)
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
663d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<MediaControlTextTrackContainerElement> MediaControlTextTrackContainerElement::create(MediaControls& mediaControls)
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeRawPtr<MediaControlTextTrackContainerElement> element = adoptRefWillBeNoop(new MediaControlTextTrackContainerElement(mediaControls));
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element->hide();
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element.release();
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
670591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochRenderObject* MediaControlTextTrackContainerElement::createRenderer(RenderStyle*)
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
672f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    return new RenderTextTrackContainerElement(this);
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)const AtomicString& MediaControlTextTrackContainerElement::textTrackContainerElementShadowPseudoId()
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-text-track-container", AtomicString::ConstructFromLiteral));
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return id;
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
68109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const AtomicString& MediaControlTextTrackContainerElement::shadowPseudoId() const
682926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
683926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return textTrackContainerElementShadowPseudoId();
684926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void MediaControlTextTrackContainerElement::updateDisplay()
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
68843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (!mediaElement().closedCaptionsVisible()) {
689926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        removeChildren();
690926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
691926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 1. If the media element is an audio element, or is another playback
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // mechanism with no rendering area, abort these steps. There is nothing to
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // render.
69643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (isHTMLAudioElement(mediaElement()))
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 2. Let video be the media element or other playback mechanism.
700d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    HTMLVideoElement& video = toHTMLVideoElement(mediaElement());
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 3. Let output be an empty list of absolutely positioned CSS block boxes.
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 4. If the user agent is exposing a user interface for video, add to
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // output one or more completely transparent positioned CSS block boxes that
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // cover the same region as the user interface.
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 5. If the last time these rules were run, the user agent was not exposing
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // a user interface for video, but now it is, let reset be true. Otherwise,
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // let reset be false.
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // There is nothing to be done explicitly for 4th and 5th steps, as
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // everything is handled through CSS. The caption box is on top of the
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // controls box, in a container set with the -webkit-box display property.
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 6. Let tracks be the subset of video's list of text tracks that have as
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // their rules for updating the text track rendering these rules for
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // updating the display of WebVTT text tracks, and whose text track mode is
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // showing or showing by default.
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 7. Let cues be an empty list of text track cues.
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 8. For each track track in tracks, append to cues all the cues from
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // track's list of cues that have their text track cue active flag set.
723d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    CueList activeCues = video.currentlyActiveCues();
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 9. If reset is false, then, for each text track cue cue in cues: if cue's
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // text track cue display state has a set of CSS boxes, then add those boxes
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // to output, and remove cue from cues.
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // There is nothing explicitly to be done here, as all the caching occurs
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // within the TextTrackCue instance itself. If parameters of the cue change,
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the display tree is cleared.
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 10. For each text track cue cue in cues that has not yet had
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // corresponding CSS boxes added to output, in text track cue order, run the
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // following substeps:
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < activeCues.size(); ++i) {
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TextTrackCue* cue = activeCues[i].data();
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(cue->isActive());
740926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!cue->track() || !cue->track()->isRendered() || !cue->isActive())
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
74351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        cue->updateDisplay(m_videoDisplaySize.size(), *this);
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 11. Return output.
747d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (hasChildren())
748926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        show();
74993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    else
750926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        hide();
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
75309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void MediaControlTextTrackContainerElement::updateSizes()
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
75509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!document().isActive())
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
758926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    IntRect videoBox;
759926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
760d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!mediaElement().renderer() || !mediaElement().renderer()->isVideo())
76193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return;
762d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    videoBox = toRenderVideo(mediaElement().renderer())->videoBox();
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
76409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_videoDisplaySize == videoBox)
765926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
766926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_videoDisplaySize = videoBox;
767926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
768926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    float smallestDimension = std::min(m_videoDisplaySize.size().height(), m_videoDisplaySize.size().width());
769926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    float fontSize = smallestDimension * 0.05f;
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (fontSize != m_fontSize) {
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_fontSize = fontSize;
77383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        setInlineStyleProperty(CSSPropertyFontSize, fontSize, CSSPrimitiveValue::CSS_PX);
774926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
779c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
780