15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef HTMLMediaElement_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define HTMLMediaElement_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ActiveDOMObject.h"
3006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/GenericEventQueue.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLElement.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/track/TextTrack.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/track/TextTrackCue.h"
3451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/html/track/vtt/VTTCue.h"
351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PODIntervalTree.h"
36c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "platform/Supplementable.h"
3751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/graphics/media/MediaPlayer.h"
385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "public/platform/WebMediaPlayerClient.h"
395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebMimeRegistry.h"
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
4209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class WebContentDecryptionModule;
4351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)class WebInbandTextTrack;
4451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)class WebLayer;
4551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
46521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
47c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(WEB_AUDIO)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AudioSourceProvider;
51f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuclass AudioSourceProviderClient;
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)class AudioTrackList;
545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class ContentType;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Event;
56df95704c49daea886ddad70775bda23618d6274dBen Murdochclass ExceptionState;
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HTMLSourceElement;
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HTMLTrackElement;
595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class KURL;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MediaController;
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MediaControls;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MediaError;
63e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass HTMLMediaSource;
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class TextTrackList;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class TimeRanges;
6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class URLRegistry;
675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)class VideoTrackList;
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef PODIntervalTree<double, TextTrackCue*> CueIntervalTree;
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)typedef CueIntervalTree::IntervalType CueInterval;
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)typedef Vector<CueInterval> CueList;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: The inheritance from MediaPlayerClient here should be private inheritance.
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// But it can't be until the Chromium WebMediaPlayerClientImpl class is fixed so it
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// no longer depends on typecasting a MediaPlayerClient to an HTMLMediaElement.
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass HTMLMediaElement : public HTMLElement, public WillBeHeapSupplementable<HTMLMediaElement>, public MediaPlayerClient, public ActiveDOMObject {
787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    DEFINE_WRAPPERTYPEINFO();
79323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(HTMLMediaElement);
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
8151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    static blink::WebMimeRegistry::SupportsType supportsType(const ContentType&, const String& keySystem = String());
825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    static void setMediaStreamRegistry(URLRegistry*);
8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    static bool isMediaStreamURL(const String& url);
8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
86a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    virtual void trace(Visitor*) OVERRIDE;
875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#if ENABLE(WEB_AUDIO)
885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void clearWeakMembers(Visitor*);
895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#endif
90d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    blink::WebMediaPlayer* webMediaPlayer() const { return m_player ? m_player->webMediaPlayer() : 0; }
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual bool hasVideo() const { return false; }
9307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    bool hasAudio() const;
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    bool supportsSave() const;
9602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
9751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    blink::WebLayer* platformLayer() const;
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    enum DelayedActionType {
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        LoadMediaResource = 1 << 0,
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        LoadTextTrackResource = 1 << 1,
102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        TextTrackChangesNotification = 1 << 2
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void scheduleDelayedAction(DelayedActionType);
10502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
106f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    bool isActive() const { return m_active; }
10702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool hasRemoteRoutes() const { return m_remoteRoutesAvailable; }
1097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool isPlayingRemotely() const { return m_playingRemotely; }
1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
11119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    // error state
112d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    PassRefPtrWillBeRawPtr<MediaError> error() const;
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    // network state
115a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    void setSrc(const AtomicString&);
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const KURL& currentSrc() const { return m_currentSrc; }
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum NetworkState { NETWORK_EMPTY, NETWORK_IDLE, NETWORK_LOADING, NETWORK_NO_SOURCE };
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NetworkState networkState() const;
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    String preload() const;
12209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void setPreload(const AtomicString&);
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
124197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    PassRefPtrWillBeRawPtr<TimeRanges> buffered() const;
125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void load();
12609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    String canPlayType(const String& mimeType, const String& keySystem = String()) const;
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    // ready state
12909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    enum ReadyState { HAVE_NOTHING, HAVE_METADATA, HAVE_CURRENT_DATA, HAVE_FUTURE_DATA, HAVE_ENOUGH_DATA };
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ReadyState readyState() const;
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool seeking() const;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    // playback state
134aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    double currentTime() const;
135aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    void setCurrentTime(double, ExceptionState&);
136aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    double duration() const;
13707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    bool paused() const;
13853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    double defaultPlaybackRate() const;
139323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    void setDefaultPlaybackRate(double);
14053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    double playbackRate() const;
141323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    void setPlaybackRate(double);
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void updatePlaybackRate();
143197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    PassRefPtrWillBeRawPtr<TimeRanges> played();
144197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    PassRefPtrWillBeRawPtr<TimeRanges> seekable() const;
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool ended() const;
14602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    bool autoplay() const;
14702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    bool loop() const;
1487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void setLoop(bool);
14907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void play();
15007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void pause();
1517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void requestRemotePlayback();
1527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void requestRemotePlaybackControl();
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    // statistics
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned webkitAudioDecodedByteCount() const;
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned webkitVideoDecodedByteCount() const;
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    // media source extensions
159e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    void closeMediaSource();
1605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void durationChanged(double duration, bool requestSeek);
1613c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
16219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    // controls
163197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool shouldShowControls() const;
16407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    double volume() const;
16507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void setVolume(double, ExceptionState&);
16607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    bool muted() const;
16707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void setMuted(bool);
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // play/pause toggling that uses the media controller if present. togglePlayStateWillPlay() is
17007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // true if togglePlayState() will call play() or unpause() on the media element or controller.
17107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    bool togglePlayStateWillPlay() const;
17207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void togglePlayState();
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    AudioTrackList& audioTracks();
1755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void audioTrackChanged();
1765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    VideoTrackList& videoTracks();
1785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void selectedVideoTrackChanged(blink::WebMediaPlayer::TrackId*);
1795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
180f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    PassRefPtrWillBeRawPtr<TextTrack> addTextTrack(const AtomicString& kind, const AtomicString& label, const AtomicString& language, ExceptionState&);
181f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    PassRefPtrWillBeRawPtr<TextTrack> addTextTrack(const AtomicString& kind, const AtomicString& label, ExceptionState& exceptionState) { return addTextTrack(kind, label, emptyAtom, exceptionState); }
182f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    PassRefPtrWillBeRawPtr<TextTrack> addTextTrack(const AtomicString& kind, ExceptionState& exceptionState) { return addTextTrack(kind, emptyAtom, emptyAtom, exceptionState); }
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextTrackList* textTracks();
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CueList currentlyActiveCues() const { return m_currentlyActiveCues; }
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
187d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void addTextTrack(TextTrack*);
188d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void removeTextTrack(TextTrack*);
1897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void textTracksChanged();
190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void notifyMediaPlayerOfTextTrackChanges();
191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
192d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Implements the "forget the media element's media-resource-specific tracks" algorithm in the HTML5 spec.
193d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void forgetResourceSpecificTracks();
194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
195d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void didAddTrackElement(HTMLTrackElement*);
196d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void didRemoveTrackElement(HTMLTrackElement*);
197d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    blink::WebMediaPlayer::TrackId addAudioTrack(const String& id, blink::WebMediaPlayerClient::AudioTrackKind, const AtomicString& label, const AtomicString& language, bool enabled);
1995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void removeAudioTrack(blink::WebMediaPlayer::TrackId);
2005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    blink::WebMediaPlayer::TrackId addVideoTrack(const String& id, blink::WebMediaPlayerClient::VideoTrackKind, const AtomicString& label, const AtomicString& language, bool selected);
2015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void removeVideoTrack(blink::WebMediaPlayer::TrackId);
2025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
203d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    virtual void mediaPlayerDidAddTextTrack(blink::WebInbandTextTrack*) OVERRIDE FINAL;
204d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    virtual void mediaPlayerDidRemoveTextTrack(blink::WebInbandTextTrack*) OVERRIDE FINAL;
20509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // FIXME: Remove this when WebMediaPlayerClientImpl::loadInternal does not depend on it.
20609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual KURL mediaPlayerPosterURL() OVERRIDE { return KURL(); }
207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
208f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    class TrackGroup {
209f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        STACK_ALLOCATED();
210f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    public:
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        enum GroupKind { CaptionsAndSubtitles, Description, Chapter, Metadata, Other };
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
213f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        explicit TrackGroup(GroupKind kind)
214d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            : visibleTrack(nullptr)
215d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            , defaultTrack(nullptr)
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            , kind(kind)
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            , hasSrcLang(false)
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
221f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        WillBeHeapVector<RefPtrWillBeMember<TextTrack> > tracks;
222f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        RefPtrWillBeMember<TextTrack> visibleTrack;
223f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        RefPtrWillBeMember<TextTrack> defaultTrack;
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        GroupKind kind;
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool hasSrcLang;
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void configureTextTrackGroupForLanguage(const TrackGroup&) const;
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void configureTextTracks();
230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void configureTextTrackGroup(const TrackGroup&);
231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool textTracksAreReady() const;
2331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    enum VisibilityChangeAssumption {
2341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        AssumeNoVisibleChange,
2351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        AssumeVisibleChange
2361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    };
2371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    void configureTextTrackDisplay(VisibilityChangeAssumption);
238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void updateTextTrackDisplay();
23919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    void textTrackReadyStateChanged(TextTrack*);
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
241d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void textTrackKindChanged(TextTrack*);
242d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void textTrackModeChanged(TextTrack*);
243d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void textTrackAddCues(TextTrack*, const TextTrackCueList*);
244d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void textTrackRemoveCues(TextTrack*, const TextTrackCueList*);
245f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    void textTrackAddCue(TextTrack*, PassRefPtrWillBeRawPtr<TextTrackCue>);
246f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    void textTrackRemoveCue(TextTrack*, PassRefPtrWillBeRawPtr<TextTrackCue>);
247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // EventTarget function.
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Both Node (via HTMLElement) and ActiveDOMObject define this method, which
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // causes an ambiguity error at compile time. This class's constructor
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // ensures that both implementations return document, so return the result
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // of one of them here.
2535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    using HTMLElement::executionContext;
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool hasSingleSecurityOrigin() const { return !m_player || (webMediaPlayer() && webMediaPlayer()->hasSingleSecurityOrigin()); }
25602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isFullscreen() const;
25843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    void enterFullscreen();
25907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void exitFullscreen();
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    bool hasClosedCaptions() const;
26243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    bool closedCaptionsVisible() const;
26343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    void setClosedCaptionsVisible(bool);
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void remoteRouteAvailabilityChanged(bool);
2667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void connectedToRemoteDevice();
2677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void disconnectedFromRemoteDevice();
2687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MediaControls* mediaControls() const;
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void sourceWasRemoved(HTMLSourceElement*);
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void sourceWasAdded(HTMLSourceElement*);
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    // ActiveDOMObject functions.
27509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool hasPendingActivity() const OVERRIDE FINAL;
27609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void contextDestroyed() OVERRIDE FINAL;
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(WEB_AUDIO)
279f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    AudioSourceProviderClient* audioSourceNode() { return m_audioSourceNode; }
280f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    void setAudioSourceNode(AudioSourceProviderClient*);
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    AudioSourceProvider* audioSourceProvider();
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum InvalidURLAction { DoNothing, Complain };
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isSafeToLoadURL(const KURL&, InvalidURLAction);
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MediaController* controller() const;
2895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void setController(PassRefPtrWillBeRawPtr<MediaController>); // Resets the MediaGroup and sets the MediaController.
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
291a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    void scheduleEvent(PassRefPtrWillBeRawPtr<Event>);
292d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
293e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // Returns the "effective media volume" value as specified in the HTML5 spec.
294e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    double effectiveMediaVolume() const;
295d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
296d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if ENABLE(OILPAN)
297d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    bool isFinalizing() const { return m_isFinalizing; }
298197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
299197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // Oilpan: finalization of the media element is observable from its
300197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // attached MediaSource; it entering a closed state.
301197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    //
302197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // Express that by having the MediaSource keep a weak reference
303197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // to the media element and signal that it wants to be notified
304197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // of destruction if it survives a GC, but the media element
305197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // doesn't.
306197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void setCloseMediaSourceWhenFinalizing();
307d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
308d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
3099e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // Predicates also used when dispatching wrapper creation (cf. [SpecialWrapFor] IDL attribute usage.)
3109e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    virtual bool isHTMLAudioElement() const { return false; }
3119e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    virtual bool isHTMLVideoElement() const { return false; }
3129e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
31409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    HTMLMediaElement(const QualifiedName&, Document&);
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~HTMLMediaElement();
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
317926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
31809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void finishParsingChildren() OVERRIDE FINAL;
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isURLAttribute(const Attribute&) const OVERRIDE;
320521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    virtual void attach(const AttachContext& = AttachContext()) OVERRIDE;
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    virtual void didMoveToNewDocument(Document& oldDocument) OVERRIDE;
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    enum DisplayMode { Unknown, Poster, PosterWaitingForVideo, Video };
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DisplayMode displayMode() const { return m_displayMode; }
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void setDisplayMode(DisplayMode mode) { m_displayMode = mode; }
32702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void setControllerInternal(PassRefPtrWillBeRawPtr<MediaController>);
32951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
330926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool ignoreTrackDisplayUpdateRequests() const { return m_ignoreTrackDisplayUpdate > 0; }
331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void beginIgnoringTrackDisplayUpdateRequests();
332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void endIgnoringTrackDisplayUpdateRequests();
333926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void createMediaPlayer();
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool alwaysCreateUserAgentShadowRoot() const OVERRIDE FINAL { return true; }
33809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool areAuthorShadowsAllowed() const OVERRIDE FINAL { return false; }
339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
34009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool supportsFocus() const OVERRIDE FINAL;
34109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool isMouseFocusable() const OVERRIDE FINAL;
34219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    virtual bool rendererIsNeeded(const RenderStyle&) OVERRIDE;
34319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    virtual RenderObject* createRenderer(RenderStyle*) OVERRIDE;
34409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE FINAL;
3456f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    virtual void didNotifySubtreeInsertionsToDocument() OVERRIDE;
34609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void removedFrom(ContainerNode*) OVERRIDE FINAL;
34709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void didRecalcStyle(StyleRecalcChange) OVERRIDE FINAL;
34802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
34909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void didBecomeFullscreenElement() OVERRIDE FINAL;
35009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void willStopBeingFullscreenElement() OVERRIDE FINAL;
35109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool isInteractiveContent() const OVERRIDE FINAL;
352d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    virtual void defaultEventHandler(Event*) OVERRIDE FINAL;
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // ActiveDOMObject functions.
35509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void stop() OVERRIDE FINAL;
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void updateDisplayState() { }
35802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void setReadyState(ReadyState);
360197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void setNetworkState(blink::WebMediaPlayer::NetworkState);
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void mediaPlayerNetworkStateChanged() OVERRIDE FINAL;
36309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void mediaPlayerReadyStateChanged() OVERRIDE FINAL;
36409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void mediaPlayerTimeChanged() OVERRIDE FINAL;
36509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void mediaPlayerDurationChanged() OVERRIDE FINAL;
36609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void mediaPlayerPlaybackStateChanged() OVERRIDE FINAL;
36709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void mediaPlayerRequestFullscreen() OVERRIDE FINAL;
36809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void mediaPlayerRequestSeek(double) OVERRIDE FINAL;
36909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void mediaPlayerRepaint() OVERRIDE FINAL;
37009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void mediaPlayerSizeChanged() OVERRIDE FINAL;
37109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void mediaPlayerSetWebLayer(blink::WebLayer*) OVERRIDE FINAL;
37209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void mediaPlayerMediaSourceOpened(blink::WebMediaSource*) OVERRIDE FINAL;
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void loadTimerFired(Timer<HTMLMediaElement>*);
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void progressEventTimerFired(Timer<HTMLMediaElement>*);
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void playbackProgressTimerFired(Timer<HTMLMediaElement>*);
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void startPlaybackProgressTimer();
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void startProgressEventTimer();
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void stopPeriodicTimers();
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void seek(double time);
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void finishSeek();
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void checkIfSeekNeeded();
38453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    void addPlayedRange(double start, double end);
38502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void scheduleTimeupdateEvent(bool periodicEvent);
387d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void scheduleEvent(const AtomicString& eventName); // FIXME: Rename to scheduleNamedEvent for clarity.
38802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // loading
39009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void prepareForLoad();
39109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void loadInternal();
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void selectMediaResource();
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void loadResource(const KURL&, ContentType&, const String& keySystem);
394d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void startPlayerLoad();
39507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void setPlayerPreload();
39607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    blink::WebMediaPlayer::LoadType loadType() const;
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void scheduleNextSourceChild();
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void loadNextSourceChild();
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void userCancelledLoad();
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearMediaPlayer(int flags);
4015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void clearMediaPlayerAndAudioSourceProviderClientWithoutLocking();
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool havePotentialSourceChild();
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void noneSupported();
404d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void mediaEngineError(PassRefPtrWillBeRawPtr<MediaError>);
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void cancelPendingEventsAndCallbacks();
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void waitForSourceChange();
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void prepareToPlay();
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KURL selectNextSourceChild(ContentType*, String* keySystem, InvalidURLAction);
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
411197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void mediaLoadingFailed(blink::WebMediaPlayer::NetworkState);
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // deferred loading (preload=none)
4145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool loadIsDeferred() const;
4155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void deferLoad();
4165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void cancelDeferredLoad();
4175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void startDeferredLoad();
4185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void executeDeferredLoad();
4195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void deferredLoadTimerFired(Timer<HTMLMediaElement>*);
4205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
42153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    void updateActiveTextTrackCues(double);
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTrackElement* showingTrackWithSameKind(HTMLTrackElement*) const;
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void markCaptionAndSubtitleTracksAsUnconfigured();
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // This does not check user gesture restrictions.
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void playInternal();
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void allowVideoRendering();
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void updateVolume();
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void updatePlayState();
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool potentiallyPlaying() const;
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool endedPlayback() const;
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool stoppedDueToErrors() const;
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool couldPlayIfEnoughData() const;
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setShouldDelayLoadEvent(bool);
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void invalidateCachedTime();
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void refreshCachedTime() const;
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasMediaControls() const;
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool createMediaControls();
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void configureMediaControls();
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
44609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void* preDispatchEventHandler(Event*) OVERRIDE FINAL;
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void changeNetworkStateFromLoadingToIdle();
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    const AtomicString& mediaGroup() const;
45151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    void setMediaGroup(const AtomicString&);
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void updateMediaController();
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isBlocked() const;
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isBlockedOnMediaController() const;
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isAutoplaying() const { return m_autoplaying; }
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    blink::WebMediaPlayer::CORSMode corsMode() const;
45807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
4595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // Returns the "direction of playback" value as specified in the HTML5 spec.
4605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    enum DirectionOfPlayback { Backward, Forward };
4615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    DirectionOfPlayback directionOfPlayback() const;
4625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
4635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // Returns the "effective playback rate" value as specified in the HTML5 spec.
4645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    double effectivePlaybackRate() const;
4655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
4665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // Creates placeholder AudioTrack and/or VideoTrack objects when WebMemediaPlayer objects
4675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // advertise they have audio and/or video, but don't explicitly signal them via
4685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // addAudioTrack() and addVideoTrack().
4695d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // FIXME: Remove this once all WebMediaPlayer implementations properly report their track info.
4705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void createPlaceholderTracksIfNecessary();
4715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
4725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // Sets the selected/enabled tracks if they aren't set before we initially
4735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // transition to HAVE_METADATA.
4745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void selectInitialTracksIfNecessary();
4755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
4765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void audioTracksTimerFired(Timer<HTMLMediaElement>*);
4775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Timer<HTMLMediaElement> m_loadTimer;
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Timer<HTMLMediaElement> m_progressEventTimer;
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Timer<HTMLMediaElement> m_playbackProgressTimer;
4815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    Timer<HTMLMediaElement> m_audioTracksTimer;
482197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    RefPtrWillBeMember<TimeRanges> m_playedTimeRanges;
4835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    OwnPtrWillBeMember<GenericEventQueue> m_asyncEventQueue;
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    double m_playbackRate;
48653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    double m_defaultPlaybackRate;
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NetworkState m_networkState;
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ReadyState m_readyState;
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ReadyState m_readyStateMaximum;
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KURL m_currentSrc;
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
492d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeMember<MediaError> m_error;
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    double m_volume;
49553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    double m_lastSeekTime;
49602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double m_previousProgressTime;
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4993c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    // Cached duration to suppress duplicate events if duration unchanged.
5003c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    double m_duration;
5013c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The last time a timeupdate event was sent (wall clock).
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double m_lastTimeUpdateEventWallTime;
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The last time a timeupdate event was sent in movie time.
50653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    double m_lastTimeUpdateEventMovieTime;
50702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
5087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // The default playback start position.
5097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    double m_defaultPlaybackStartPosition;
5107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Loading state.
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum LoadState { WaitingForSource, LoadingFromSrcAttr, LoadingFromSourceElement };
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LoadState m_loadState;
514323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtrWillBeMember<HTMLSourceElement> m_currentSourceNode;
515323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtrWillBeMember<Node> m_nextChildNodeToConsider;
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // "Deferred loading" state (for preload=none).
5185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    enum DeferredLoadState {
5195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // The load is not deferred.
5205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        NotDeferred,
5215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // The load is deferred, and waiting for the task to set the
5225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // delaying-the-load-event flag (to false).
5235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        WaitingForStopDelayingLoadEventTask,
5245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // The load is the deferred, and waiting for a triggering event.
5255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        WaitingForTrigger,
5265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // The load is deferred, and waiting for the task to set the
5275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // delaying-the-load-event flag, after which the load will be executed.
5285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        ExecuteOnStopDelayingLoadEventTask
5295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    };
5305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    DeferredLoadState m_deferredLoadState;
5315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    Timer<HTMLMediaElement> m_deferredLoadTimer;
5325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OwnPtr<MediaPlayer> m_player;
534a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    blink::WebLayer* m_webLayer;
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MediaPlayer::Preload m_preload;
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DisplayMode m_displayMode;
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
540197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    RefPtrWillBeMember<HTMLMediaSource> m_mediaSource;
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Cached time value. Only valid when ready state is HAVE_METADATA or
5437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // higher, otherwise the current time is assumed to be zero.
54453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    mutable double m_cachedTime;
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double m_fragmentEndTime;
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
548926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    typedef unsigned PendingActionFlags;
549926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    PendingActionFlags m_pendingActionFlags;
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
551f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    // FIXME: MediaElement has way too many state bits.
552d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool m_userGestureRequiredForPlay : 1;
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_playing : 1;
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_shouldDelayLoadEvent : 1;
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_haveFiredLoadedData : 1;
556f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    bool m_active : 1;
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_autoplaying : 1;
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_muted : 1;
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_paused : 1;
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_seeking : 1;
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // data has not been loaded since sending a "stalled" event
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_sentStalledEvent : 1;
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // time has not changed since sending an "ended" event
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_sentEndEvent : 1;
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_closedCaptionsVisible : 1;
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_completelyLoaded : 1;
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_havePreparedToPlay : 1;
57207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    bool m_delayingLoadForPreloadNone : 1;
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_tracksAreReady : 1;
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_haveVisibleTextTrack : 1;
576926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool m_processingPreferenceChange : 1;
5777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool m_remoteRoutesAvailable : 1;
5787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool m_playingRemotely : 1;
579d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if ENABLE(OILPAN)
580d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    bool m_isFinalizing : 1;
581197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool m_closeMediaSourceWhenFinalizing : 1;
582d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
58353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    double m_lastTextTrackUpdateTime;
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<AudioTrackList> m_audioTracks;
5865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<VideoTrackList> m_videoTracks;
587f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    RefPtrWillBeMember<TextTrackList> m_textTracks;
588f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    WillBeHeapVector<RefPtrWillBeMember<TextTrack> > m_textTracksWhenResourceSelectionBegan;
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CueIntervalTree m_cueTree;
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CueList m_currentlyActiveCues;
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_ignoreTrackDisplayUpdate;
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(WEB_AUDIO)
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This is a weak reference, since m_audioSourceNode holds a reference to us.
5975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // FIXME: Oilpan: Consider making this a strongly traced pointer with oilpan where strong cycles are not a problem.
5989e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    GC_PLUGIN_IGNORE("http://crbug.com/404577")
5995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RawPtrWillBeWeakMember<AudioSourceProviderClient> m_audioSourceNode;
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    friend class MediaController;
6035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<MediaController> m_mediaController;
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    friend class Internals;
606926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    friend class TrackDisplayUpdateScope;
607926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
60809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    static URLRegistry* s_mediaStreamRegistry;
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Template specializations required by PodIntervalTree in debug mode.
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template <>
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct ValueToString<double> {
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static String string(const double value)
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String::number(value);
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template <>
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct ValueToString<TextTrackCue*> {
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static String string(TextTrackCue* const& cue)
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
62551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return cue->toString();
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
63043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)inline bool isHTMLMediaElement(const HTMLElement& element)
631d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
63243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    return isHTMLAudioElement(element) || isHTMLVideoElement(element);
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
63543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)DEFINE_HTMLELEMENT_TYPE_CASTS_WITH_FUNCTION(HTMLMediaElement);
636f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
6377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} // namespace blink
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif // HTMLMediaElement_h
640