0d3601ff77c55cfda43c74293ff6fcc10f985011
[WebKit-https.git] / Source / WebCore / html / HTMLMediaElement.h
1 /*
2  * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef HTMLMediaElement_h
27 #define HTMLMediaElement_h
28
29 #if ENABLE(VIDEO)
30 #include "HTMLElement.h"
31 #include "ActiveDOMObject.h"
32 #include "GenericEventQueue.h"
33 #include "MediaCanStartListener.h"
34 #include "MediaControllerInterface.h"
35 #include "MediaPlayer.h"
36
37 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
38 #include "MediaPlayerProxy.h"
39 #endif
40
41 #if ENABLE(VIDEO_TRACK)
42 #include "AudioTrack.h"
43 #include "CaptionUserPreferences.h"
44 #include "PODIntervalTree.h"
45 #include "TextTrack.h"
46 #include "TextTrackCue.h"
47 #include "VideoTrack.h"
48 #endif
49
50 namespace WebCore {
51
52 #if USE(AUDIO_SESSION)
53 class AudioSessionManagerToken;
54 #endif
55 #if ENABLE(WEB_AUDIO)
56 class AudioSourceProvider;
57 class MediaElementAudioSourceNode;
58 #endif
59 class Event;
60 class HTMLSourceElement;
61 class HTMLTrackElement;
62 class KURL;
63 class MediaController;
64 class MediaControls;
65 class MediaError;
66 class PageActivityAssertionToken;
67 class TimeRanges;
68 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
69 class Widget;
70 #endif
71 #if PLATFORM(MAC)
72 class DisplaySleepDisabler;
73 #endif
74 #if ENABLE(ENCRYPTED_MEDIA_V2)
75 class MediaKeys;
76 #endif
77
78 #if ENABLE(VIDEO_TRACK)
79 class AudioTrackList;
80 class AudioTrackPrivate;
81 class InbandTextTrackPrivate;
82 class TextTrackList;
83 class VideoTrackList;
84 class VideoTrackPrivate;
85
86 typedef PODIntervalTree<double, TextTrackCue*> CueIntervalTree;
87 typedef CueIntervalTree::IntervalType CueInterval;
88 typedef Vector<CueInterval> CueList;
89 #endif
90
91 class HTMLMediaElement : public HTMLElement, private MediaPlayerClient, public MediaPlayerSupportsTypeClient, private MediaCanStartListener, public ActiveDOMObject, public MediaControllerInterface
92 #if ENABLE(VIDEO_TRACK)
93     , private AudioTrackClient
94     , private TextTrackClient
95     , private VideoTrackClient
96 #endif
97 #if USE(PLATFORM_TEXT_TRACK_MENU)
98     , public PlatformTextTrackMenuClient
99 #endif
100 {
101 public:
102     MediaPlayer* player() const { return m_player.get(); }
103
104     virtual bool isVideo() const { return false; }
105     virtual bool hasVideo() const { return false; }
106     virtual bool hasAudio() const;
107
108     void rewind(double timeDelta);
109     void returnToRealtime();
110
111     // Eventually overloaded in HTMLVideoElement
112     virtual bool supportsFullscreen() const { return false; };
113
114     virtual bool supportsSave() const;
115     virtual bool supportsScanning() const;
116     
117     PlatformMedia platformMedia() const;
118 #if USE(ACCELERATED_COMPOSITING)
119     PlatformLayer* platformLayer() const;
120 #endif
121
122     enum DelayedActionType {
123         LoadMediaResource = 1 << 0,
124         ConfigureTextTracks = 1 << 1,
125         TextTrackChangesNotification = 1 << 2,
126         ConfigureTextTrackDisplay = 1 << 3,
127     };
128     void scheduleDelayedAction(DelayedActionType);
129     
130     MediaPlayer::MovieLoadType movieLoadType() const;
131     
132     bool inActiveDocument() const { return m_inActiveDocument; }
133     
134 // DOM API
135 // error state
136     PassRefPtr<MediaError> error() const;
137
138 // network state
139     void setSrc(const String&);
140     const KURL& currentSrc() const { return m_currentSrc; }
141
142     enum NetworkState { NETWORK_EMPTY, NETWORK_IDLE, NETWORK_LOADING, NETWORK_NO_SOURCE };
143     NetworkState networkState() const;
144
145     String preload() const;    
146     void setPreload(const String&);
147
148     PassRefPtr<TimeRanges> buffered() const;
149     void load();
150     String canPlayType(const String& mimeType, const String& keySystem = String(), const KURL& = KURL()) const;
151
152 // ready state
153     ReadyState readyState() const;
154     bool seeking() const;
155
156 // playback state
157     double currentTime() const;
158     void setCurrentTime(double, ExceptionCode&);
159     double initialTime() const;
160     double startTime() const;
161     double duration() const;
162     bool paused() const;
163     double defaultPlaybackRate() const;
164     void setDefaultPlaybackRate(double);
165     double playbackRate() const;
166     void setPlaybackRate(double);
167     void updatePlaybackRate();
168     bool webkitPreservesPitch() const;
169     void setWebkitPreservesPitch(bool);
170     PassRefPtr<TimeRanges> played();
171     PassRefPtr<TimeRanges> seekable() const;
172     bool ended() const;
173     bool autoplay() const;    
174     void setAutoplay(bool b);
175     bool loop() const;    
176     void setLoop(bool b);
177     void play();
178     void pause();
179
180 // captions
181     bool webkitHasClosedCaptions() const;
182     bool webkitClosedCaptionsVisible() const;
183     void setWebkitClosedCaptionsVisible(bool);
184
185 #if ENABLE(MEDIA_STATISTICS)
186 // Statistics
187     unsigned webkitAudioDecodedByteCount() const;
188     unsigned webkitVideoDecodedByteCount() const;
189 #endif
190
191 #if ENABLE(MEDIA_SOURCE)
192 //  Media Source.
193     void setSourceState(const String&);
194 #endif 
195
196 #if ENABLE(ENCRYPTED_MEDIA)
197     void webkitGenerateKeyRequest(const String& keySystem, PassRefPtr<Uint8Array> initData, ExceptionCode&);
198     void webkitGenerateKeyRequest(const String& keySystem, ExceptionCode&);
199     void webkitAddKey(const String& keySystem, PassRefPtr<Uint8Array> key, PassRefPtr<Uint8Array> initData, const String& sessionId, ExceptionCode&);
200     void webkitAddKey(const String& keySystem, PassRefPtr<Uint8Array> key, ExceptionCode&);
201     void webkitCancelKeyRequest(const String& keySystem, const String& sessionId, ExceptionCode&);
202
203     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitkeyadded);
204     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitkeyerror);
205     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitkeymessage);
206 #endif
207 #if ENABLE(ENCRYPTED_MEDIA) || ENABLE(ENCRYPTED_MEDIA_V2)
208     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitneedkey);
209 #endif
210
211 #if ENABLE(ENCRYPTED_MEDIA_V2)
212     MediaKeys* keys() const { return m_mediaKeys.get(); }
213     void setMediaKeys(MediaKeys*);
214 #endif
215
216 // controls
217     bool controls() const;
218     void setControls(bool);
219     double volume() const;
220     void setVolume(double, ExceptionCode&);
221     bool muted() const;
222     void setMuted(bool);
223
224     void togglePlayState();
225     void beginScrubbing();
226     void endScrubbing();
227     
228     bool canPlay() const;
229
230     double percentLoaded() const;
231
232 #if ENABLE(VIDEO_TRACK)
233     PassRefPtr<TextTrack> addTextTrack(const String& kind, const String& label, const String& language, ExceptionCode&);
234     PassRefPtr<TextTrack> addTextTrack(const String& kind, const String& label, ExceptionCode& ec) { return addTextTrack(kind, label, emptyString(), ec); }
235     PassRefPtr<TextTrack> addTextTrack(const String& kind, ExceptionCode& ec) { return addTextTrack(kind, emptyString(), emptyString(), ec); }
236
237     AudioTrackList* audioTracks();
238     TextTrackList* textTracks();
239     VideoTrackList* videoTracks();
240
241     CueList currentlyActiveCues() const { return m_currentlyActiveCues; }
242
243     void addAudioTrack(PassRefPtr<AudioTrack>);
244     void addTextTrack(PassRefPtr<TextTrack>);
245     void addVideoTrack(PassRefPtr<VideoTrack>);
246     void removeAudioTrack(AudioTrack*);
247     void removeTextTrack(TextTrack*);
248     void removeVideoTrack(VideoTrack*);
249     void removeAllInbandTracks();
250     void closeCaptionTracksChanged();
251     void notifyMediaPlayerOfTextTrackChanges();
252
253     virtual void didAddTextTrack(HTMLTrackElement*);
254     virtual void didRemoveTextTrack(HTMLTrackElement*);
255
256     virtual void mediaPlayerDidAddAudioTrack(PassRefPtr<AudioTrackPrivate>) OVERRIDE;
257     virtual void mediaPlayerDidAddTextTrack(PassRefPtr<InbandTextTrackPrivate>) OVERRIDE;
258     virtual void mediaPlayerDidAddVideoTrack(PassRefPtr<VideoTrackPrivate>) OVERRIDE;
259     virtual void mediaPlayerDidRemoveAudioTrack(PassRefPtr<AudioTrackPrivate>) OVERRIDE;
260     virtual void mediaPlayerDidRemoveTextTrack(PassRefPtr<InbandTextTrackPrivate>) OVERRIDE;
261     virtual void mediaPlayerDidRemoveVideoTrack(PassRefPtr<VideoTrackPrivate>) OVERRIDE;
262
263 #if USE(PLATFORM_TEXT_TRACK_MENU)
264     virtual void setSelectedTextTrack(PassRefPtr<PlatformTextTrack>) OVERRIDE;
265     virtual Vector<RefPtr<PlatformTextTrack> > platformTextTracks() OVERRIDE;
266     PlatformTextTrackMenuInterface* platformTextTrackMenu();
267 #endif
268
269     struct TrackGroup {
270         enum GroupKind { CaptionsAndSubtitles, Description, Chapter, Metadata, Other };
271
272         TrackGroup(GroupKind kind)
273             : visibleTrack(0)
274             , defaultTrack(0)
275             , kind(kind)
276             , hasSrcLang(false)
277         {
278         }
279
280         Vector<RefPtr<TextTrack> > tracks;
281         RefPtr<TextTrack> visibleTrack;
282         RefPtr<TextTrack> defaultTrack;
283         GroupKind kind;
284         bool hasSrcLang;
285     };
286
287     void configureTextTrackGroupForLanguage(const TrackGroup&) const;
288     void configureTextTracks();
289     void configureTextTrackGroup(const TrackGroup&);
290
291     void setSelectedTextTrack(TextTrack*);
292
293     bool textTracksAreReady() const;
294     enum TextTrackVisibilityCheckType { CheckTextTrackVisibility, AssumeTextTrackVisibilityChanged };
295     void configureTextTrackDisplay(TextTrackVisibilityCheckType checkType = CheckTextTrackVisibility);
296     void updateTextTrackDisplay();
297
298     // AudioTrackClient
299     virtual void audioTrackEnabledChanged(AudioTrack*);
300
301     // TextTrackClient
302     virtual void textTrackReadyStateChanged(TextTrack*);
303     virtual void textTrackKindChanged(TextTrack*);
304     virtual void textTrackModeChanged(TextTrack*);
305     virtual void textTrackAddCues(TextTrack*, const TextTrackCueList*);
306     virtual void textTrackRemoveCues(TextTrack*, const TextTrackCueList*);
307     virtual void textTrackAddCue(TextTrack*, PassRefPtr<TextTrackCue>);
308     virtual void textTrackRemoveCue(TextTrack*, PassRefPtr<TextTrackCue>);
309
310     // VideoTrackClient
311     virtual void videoTrackSelectedChanged(VideoTrack*);
312
313     bool requiresTextTrackRepresentation() const;
314     void setTextTrackRepresentation(TextTrackRepresentation*);
315 #endif
316
317 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
318     void allocateMediaPlayerIfNecessary();
319     void setNeedWidgetUpdate(bool needWidgetUpdate) { m_needWidgetUpdate = needWidgetUpdate; }
320     void deliverNotification(MediaPlayerProxyNotificationType notification);
321     void setMediaPlayerProxy(WebMediaPlayerProxy* proxy);
322     void getPluginProxyParams(KURL& url, Vector<String>& names, Vector<String>& values);
323     void createMediaPlayerProxy();
324     void updateWidget(PluginCreationOption);
325 #endif
326
327     // EventTarget function.
328     // Both Node (via HTMLElement) and ActiveDOMObject define this method, which
329     // causes an ambiguity error at compile time. This class's constructor
330     // ensures that both implementations return document, so return the result
331     // of one of them here.
332     virtual ScriptExecutionContext* scriptExecutionContext() const OVERRIDE { return HTMLElement::scriptExecutionContext(); }
333
334     bool hasSingleSecurityOrigin() const { return !m_player || m_player->hasSingleSecurityOrigin(); }
335     
336     bool isFullscreen() const;
337     void toggleFullscreenState();
338     void enterFullscreen();
339     void exitFullscreen();
340
341     bool hasClosedCaptions() const;
342     bool closedCaptionsVisible() const;
343     void setClosedCaptionsVisible(bool);
344
345     MediaControls* mediaControls() const;
346
347     void sourceWasRemoved(HTMLSourceElement*);
348     void sourceWasAdded(HTMLSourceElement*);
349
350     void privateBrowsingStateDidChange();
351
352     // Media cache management.
353     static void getSitesInMediaCache(Vector<String>&);
354     static void clearMediaCache();
355     static void clearMediaCacheForSite(const String&);
356     static void resetMediaEngines();
357
358     bool isPlaying() const { return m_playing; }
359
360     virtual bool hasPendingActivity() const;
361
362 #if ENABLE(WEB_AUDIO)
363     MediaElementAudioSourceNode* audioSourceNode() { return m_audioSourceNode; }
364     void setAudioSourceNode(MediaElementAudioSourceNode*);
365
366     AudioSourceProvider* audioSourceProvider();
367 #endif
368
369     enum InvalidURLAction { DoNothing, Complain };
370     bool isSafeToLoadURL(const KURL&, InvalidURLAction);
371
372     const String& mediaGroup() const;
373     void setMediaGroup(const String&);
374
375     MediaController* controller() const;
376     void setController(PassRefPtr<MediaController>);
377
378     virtual bool dispatchEvent(PassRefPtr<Event>) OVERRIDE;
379
380     virtual bool willRespondToMouseClickEvents() OVERRIDE;
381
382 protected:
383     HTMLMediaElement(const QualifiedName&, Document*, bool);
384     virtual ~HTMLMediaElement();
385
386     virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
387     virtual void finishParsingChildren();
388     virtual bool isURLAttribute(const Attribute&) const OVERRIDE;
389     virtual void willAttachRenderers() OVERRIDE;
390     virtual void didAttachRenderers() OVERRIDE;
391
392     virtual void didMoveToNewDocument(Document* oldDocument) OVERRIDE;
393
394     enum DisplayMode { Unknown, None, Poster, PosterWaitingForVideo, Video };
395     DisplayMode displayMode() const { return m_displayMode; }
396     virtual void setDisplayMode(DisplayMode mode) { m_displayMode = mode; }
397     
398     virtual bool isMediaElement() const { return true; }
399
400     // Restrictions to change default behaviors.
401     enum BehaviorRestrictionFlags {
402         NoRestrictions = 0,
403         RequireUserGestureForLoadRestriction = 1 << 0,
404         RequireUserGestureForRateChangeRestriction = 1 << 1,
405         RequireUserGestureForFullscreenRestriction = 1 << 2,
406         RequirePageConsentToLoadMediaRestriction = 1 << 3,
407         RequirePageConsentToResumeMediaRestriction = 1 << 4,
408     };
409     typedef unsigned BehaviorRestrictions;
410     
411     bool userGestureRequiredForLoad() const { return m_restrictions & RequireUserGestureForLoadRestriction; }
412     bool userGestureRequiredForRateChange() const { return m_restrictions & RequireUserGestureForRateChangeRestriction; }
413     bool userGestureRequiredForFullscreen() const { return m_restrictions & RequireUserGestureForFullscreenRestriction; }
414     bool pageConsentRequiredForLoad() const { return m_restrictions & RequirePageConsentToLoadMediaRestriction; }
415     bool pageConsentRequiredForResume() const { return m_restrictions & RequirePageConsentToResumeMediaRestriction; }
416     
417     void addBehaviorRestriction(BehaviorRestrictions restriction) { m_restrictions |= restriction; }
418     void removeBehaviorRestriction(BehaviorRestrictions restriction) { m_restrictions &= ~restriction; }
419
420 #if ENABLE(VIDEO_TRACK)
421     bool ignoreTrackDisplayUpdateRequests() const { return m_ignoreTrackDisplayUpdate > 0 || !m_textTracks || !m_cueTree.size(); }
422     void beginIgnoringTrackDisplayUpdateRequests();
423     void endIgnoringTrackDisplayUpdateRequests();
424 #endif
425
426 private:
427     void createMediaPlayer();
428
429     virtual bool alwaysCreateUserAgentShadowRoot() const OVERRIDE { return true; }
430     virtual bool areAuthorShadowsAllowed() const OVERRIDE { return false; }
431
432     virtual bool hasCustomFocusLogic() const OVERRIDE;
433     virtual bool supportsFocus() const OVERRIDE;
434     virtual bool isMouseFocusable() const OVERRIDE;
435     virtual bool rendererIsNeeded(const RenderStyle&);
436     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
437     virtual bool childShouldCreateRenderer(const Node*) const OVERRIDE;
438     virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE;
439     virtual void removedFrom(ContainerNode*) OVERRIDE;
440     virtual void didRecalcStyle(Style::Change);
441
442     virtual void defaultEventHandler(Event*);
443
444     virtual void didBecomeFullscreenElement();
445     virtual void willStopBeingFullscreenElement();
446
447     // ActiveDOMObject functions.
448     virtual bool canSuspend() const OVERRIDE;
449     virtual void suspend(ReasonForSuspension) OVERRIDE;
450     virtual void resume() OVERRIDE;
451     virtual void stop() OVERRIDE;
452     
453     virtual void mediaVolumeDidChange();
454
455     virtual void updateDisplayState() { }
456     
457     void setReadyState(MediaPlayer::ReadyState);
458     void setNetworkState(MediaPlayer::NetworkState);
459
460     virtual Document* mediaPlayerOwningDocument();
461     virtual void mediaPlayerNetworkStateChanged(MediaPlayer*);
462     virtual void mediaPlayerReadyStateChanged(MediaPlayer*);
463     virtual void mediaPlayerTimeChanged(MediaPlayer*);
464     virtual void mediaPlayerVolumeChanged(MediaPlayer*);
465     virtual void mediaPlayerMuteChanged(MediaPlayer*);
466     virtual void mediaPlayerDurationChanged(MediaPlayer*);
467     virtual void mediaPlayerRateChanged(MediaPlayer*);
468     virtual void mediaPlayerPlaybackStateChanged(MediaPlayer*);
469     virtual void mediaPlayerSawUnsupportedTracks(MediaPlayer*);
470     virtual void mediaPlayerResourceNotSupported(MediaPlayer*);
471     virtual void mediaPlayerRepaint(MediaPlayer*);
472     virtual void mediaPlayerSizeChanged(MediaPlayer*);
473 #if USE(ACCELERATED_COMPOSITING)
474     virtual bool mediaPlayerRenderingCanBeAccelerated(MediaPlayer*);
475     virtual void mediaPlayerRenderingModeChanged(MediaPlayer*);
476 #endif
477     virtual void mediaPlayerEngineUpdated(MediaPlayer*);
478     
479     virtual void mediaPlayerFirstVideoFrameAvailable(MediaPlayer*);
480     virtual void mediaPlayerCharacteristicChanged(MediaPlayer*);
481
482 #if ENABLE(ENCRYPTED_MEDIA)
483     virtual void mediaPlayerKeyAdded(MediaPlayer*, const String& keySystem, const String& sessionId) OVERRIDE;
484     virtual void mediaPlayerKeyError(MediaPlayer*, const String& keySystem, const String& sessionId, MediaPlayerClient::MediaKeyErrorCode, unsigned short systemCode) OVERRIDE;
485     virtual void mediaPlayerKeyMessage(MediaPlayer*, const String& keySystem, const String& sessionId, const unsigned char* message, unsigned messageLength, const KURL& defaultURL) OVERRIDE;
486     virtual bool mediaPlayerKeyNeeded(MediaPlayer*, const String& keySystem, const String& sessionId, const unsigned char* initData, unsigned initDataLength) OVERRIDE;
487 #endif
488
489 #if ENABLE(ENCRYPTED_MEDIA_V2)
490     virtual bool mediaPlayerKeyNeeded(MediaPlayer*, Uint8Array*);
491 #endif
492
493     virtual String mediaPlayerReferrer() const OVERRIDE;
494     virtual String mediaPlayerUserAgent() const OVERRIDE;
495     virtual CORSMode mediaPlayerCORSMode() const OVERRIDE;
496
497     virtual bool mediaPlayerNeedsSiteSpecificHacks() const OVERRIDE;
498     virtual String mediaPlayerDocumentHost() const OVERRIDE;
499
500     virtual void mediaPlayerEnterFullscreen() OVERRIDE;
501     virtual void mediaPlayerExitFullscreen() OVERRIDE;
502     virtual bool mediaPlayerIsFullscreen() const OVERRIDE;
503     virtual bool mediaPlayerIsFullscreenPermitted() const OVERRIDE;
504     virtual bool mediaPlayerIsVideo() const OVERRIDE;
505     virtual LayoutRect mediaPlayerContentBoxRect() const OVERRIDE;
506     virtual void mediaPlayerSetSize(const IntSize&) OVERRIDE;
507     virtual void mediaPlayerPause() OVERRIDE;
508     virtual void mediaPlayerPlay() OVERRIDE;
509     virtual bool mediaPlayerIsPaused() const OVERRIDE;
510     virtual bool mediaPlayerIsLooping() const OVERRIDE;
511     virtual HostWindow* mediaPlayerHostWindow() OVERRIDE;
512     virtual IntRect mediaPlayerWindowClipRect() OVERRIDE;
513     virtual CachedResourceLoader* mediaPlayerCachedResourceLoader() OVERRIDE;
514
515 #if PLATFORM(WIN) && USE(AVFOUNDATION)
516     virtual GraphicsDeviceAdapter* mediaPlayerGraphicsDeviceAdapter(const MediaPlayer*) const OVERRIDE;
517 #endif
518
519     void loadTimerFired(Timer<HTMLMediaElement>*);
520     void progressEventTimerFired(Timer<HTMLMediaElement>*);
521     void playbackProgressTimerFired(Timer<HTMLMediaElement>*);
522     void startPlaybackProgressTimer();
523     void startProgressEventTimer();
524     void stopPeriodicTimers();
525
526     void seek(double time, ExceptionCode&);
527     void finishSeek();
528     void checkIfSeekNeeded();
529     void addPlayedRange(double start, double end);
530     
531     void scheduleTimeupdateEvent(bool periodicEvent);
532     void scheduleEvent(const AtomicString& eventName);
533     
534     // loading
535     void selectMediaResource();
536     void loadResource(const KURL&, ContentType&, const String& keySystem);
537     void scheduleNextSourceChild();
538     void loadNextSourceChild();
539     void userCancelledLoad();
540     void clearMediaPlayer(int flags);
541     bool havePotentialSourceChild();
542     void noneSupported();
543     void mediaEngineError(PassRefPtr<MediaError> err);
544     void cancelPendingEventsAndCallbacks();
545     void waitForSourceChange();
546     void prepareToPlay();
547
548     KURL selectNextSourceChild(ContentType*, String* keySystem, InvalidURLAction);
549
550     void mediaLoadingFailed(MediaPlayer::NetworkState);
551
552 #if ENABLE(VIDEO_TRACK)
553     void updateActiveTextTrackCues(double);
554     HTMLTrackElement* showingTrackWithSameKind(HTMLTrackElement*) const;
555
556     enum ReconfigureMode {
557         Immediately,
558         AfterDelay,
559     };
560     void markCaptionAndSubtitleTracksAsUnconfigured(ReconfigureMode);
561     virtual void captionPreferencesChanged() OVERRIDE;
562 #endif
563
564     // These "internal" functions do not check user gesture restrictions.
565     void loadInternal();
566     void playInternal();
567     void pauseInternal();
568
569     void prepareForLoad();
570     void allowVideoRendering();
571
572     bool processingMediaPlayerCallback() const { return m_processingMediaPlayerCallback > 0; }
573     void beginProcessingMediaPlayerCallback() { ++m_processingMediaPlayerCallback; }
574     void endProcessingMediaPlayerCallback() { ASSERT(m_processingMediaPlayerCallback); --m_processingMediaPlayerCallback; }
575
576     void updateVolume();
577     void updatePlayState();
578     bool potentiallyPlaying() const;
579     bool endedPlayback() const;
580     bool stoppedDueToErrors() const;
581     bool pausedForUserInteraction() const;
582     bool couldPlayIfEnoughData() const;
583
584     double minTimeSeekable() const;
585     double maxTimeSeekable() const;
586
587     // Pauses playback without changing any states or generating events
588     void setPausedInternal(bool);
589
590     void setPlaybackRateInternal(double);
591
592     virtual void mediaCanStart();
593
594     void setShouldDelayLoadEvent(bool);
595     void invalidateCachedTime();
596     void refreshCachedTime() const;
597
598     bool hasMediaControls() const;
599     bool createMediaControls();
600     void configureMediaControls();
601
602     void prepareMediaFragmentURI();
603     void applyMediaFragmentURI();
604
605     virtual void* preDispatchEventHandler(Event*);
606
607     void changeNetworkStateFromLoadingToIdle();
608
609     void removeBehaviorsRestrictionsAfterFirstUserGesture();
610
611     void updateMediaController();
612     bool isBlocked() const;
613     bool isBlockedOnMediaController() const;
614     bool hasCurrentSrc() const { return !m_currentSrc.isEmpty(); }
615     bool isLiveStream() const { return movieLoadType() == MediaPlayer::LiveStream; }
616     bool isAutoplaying() const { return m_autoplaying; }
617
618 #if PLATFORM(MAC)
619     void updateDisableSleep();
620     bool shouldDisableSleep() const;
621 #endif
622
623     Timer<HTMLMediaElement> m_loadTimer;
624     Timer<HTMLMediaElement> m_progressEventTimer;
625     Timer<HTMLMediaElement> m_playbackProgressTimer;
626     RefPtr<TimeRanges> m_playedTimeRanges;
627     OwnPtr<GenericEventQueue> m_asyncEventQueue;
628
629     double m_playbackRate;
630     double m_defaultPlaybackRate;
631     bool m_webkitPreservesPitch;
632     NetworkState m_networkState;
633     ReadyState m_readyState;
634     ReadyState m_readyStateMaximum;
635     KURL m_currentSrc;
636
637     RefPtr<MediaError> m_error;
638
639     double m_volume;
640     double m_lastSeekTime;
641     
642     unsigned m_previousProgress;
643     double m_previousProgressTime;
644
645     // The last time a timeupdate event was sent (based on monotonic clock).
646     double m_clockTimeAtLastUpdateEvent;
647
648     // The last time a timeupdate event was sent in movie time.
649     double m_lastTimeUpdateEventMovieTime;
650     
651     // Loading state.
652     enum LoadState { WaitingForSource, LoadingFromSrcAttr, LoadingFromSourceElement };
653     LoadState m_loadState;
654     RefPtr<HTMLSourceElement> m_currentSourceNode;
655     RefPtr<Node> m_nextChildNodeToConsider;
656
657     OwnPtr<MediaPlayer> m_player;
658 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
659     RefPtr<Widget> m_proxyWidget;
660 #endif
661
662     BehaviorRestrictions m_restrictions;
663     
664     MediaPlayer::Preload m_preload;
665
666     DisplayMode m_displayMode;
667
668     // Counter incremented while processing a callback from the media player, so we can avoid
669     // calling the media engine recursively.
670     int m_processingMediaPlayerCallback;
671
672 #if ENABLE(MEDIA_SOURCE)
673     RefPtr<MediaSource> m_mediaSource;
674 #endif
675
676     mutable double m_cachedTime;
677     mutable double m_clockTimeAtLastCachedTimeUpdate;
678     mutable double m_minimumClockTimeToUpdateCachedTime;
679
680     double m_fragmentStartTime;
681     double m_fragmentEndTime;
682
683     typedef unsigned PendingActionFlags;
684     PendingActionFlags m_pendingActionFlags;
685
686     bool m_playing : 1;
687     bool m_isWaitingUntilMediaCanStart : 1;
688     bool m_shouldDelayLoadEvent : 1;
689     bool m_haveFiredLoadedData : 1;
690     bool m_inActiveDocument : 1;
691     bool m_autoplaying : 1;
692     bool m_muted : 1;
693     bool m_paused : 1;
694     bool m_seeking : 1;
695
696     // data has not been loaded since sending a "stalled" event
697     bool m_sentStalledEvent : 1;
698
699     // time has not changed since sending an "ended" event
700     bool m_sentEndEvent : 1;
701
702     bool m_pausedInternal : 1;
703
704     // Not all media engines provide enough information about a file to be able to
705     // support progress events so setting m_sendProgressEvents disables them 
706     bool m_sendProgressEvents : 1;
707
708     bool m_isFullscreen : 1;
709     bool m_closedCaptionsVisible : 1;
710     bool m_webkitLegacyClosedCaptionOverride : 1;
711
712 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
713     bool m_needWidgetUpdate : 1;
714 #endif
715
716     bool m_dispatchingCanPlayEvent : 1;
717     bool m_loadInitiatedByUserGesture : 1;
718     bool m_completelyLoaded : 1;
719     bool m_havePreparedToPlay : 1;
720     bool m_parsingInProgress : 1;
721
722 #if ENABLE(VIDEO_TRACK)
723     bool m_tracksAreReady : 1;
724     bool m_haveVisibleTextTrack : 1;
725     bool m_processingPreferenceChange : 1;
726
727     String m_subtitleTrackLanguage;
728     float m_lastTextTrackUpdateTime;
729
730     CaptionUserPreferences::CaptionDisplayMode m_captionDisplayMode;
731
732     RefPtr<AudioTrackList> m_audioTracks;
733     RefPtr<TextTrackList> m_textTracks;
734     RefPtr<VideoTrackList> m_videoTracks;
735     Vector<RefPtr<TextTrack> > m_textTracksWhenResourceSelectionBegan;
736
737     CueIntervalTree m_cueTree;
738
739     CueList m_currentlyActiveCues;
740     int m_ignoreTrackDisplayUpdate;
741 #endif
742
743 #if ENABLE(WEB_AUDIO)
744     // This is a weak reference, since m_audioSourceNode holds a reference to us.
745     // The value is set just after the MediaElementAudioSourceNode is created.
746     // The value is cleared in MediaElementAudioSourceNode::~MediaElementAudioSourceNode().
747     MediaElementAudioSourceNode* m_audioSourceNode;
748 #endif
749
750     String m_mediaGroup;
751     friend class MediaController;
752     RefPtr<MediaController> m_mediaController;
753
754 #if PLATFORM(MAC)
755     OwnPtr<DisplaySleepDisabler> m_sleepDisabler;
756 #endif
757
758     friend class TrackDisplayUpdateScope;
759
760 #if ENABLE(ENCRYPTED_MEDIA_V2)
761     RefPtr<MediaKeys> m_mediaKeys;
762 #endif
763
764 #if USE(PLATFORM_TEXT_TRACK_MENU)
765     RefPtr<PlatformTextTrackMenuInterface> m_platformMenu;
766 #endif
767
768 #if USE(AUDIO_SESSION)
769     OwnPtr<AudioSessionManagerToken> m_audioSessionManagerToken;
770 #endif
771
772     OwnPtr<PageActivityAssertionToken> m_activityToken;
773     size_t m_reportedExtraMemoryCost;
774 };
775
776 #if ENABLE(VIDEO_TRACK)
777 #ifndef NDEBUG
778 // Template specializations required by PodIntervalTree in debug mode.
779 template <>
780 struct ValueToString<double> {
781     static String string(const double value)
782     {
783         return String::number(value);
784     }
785 };
786
787 template <>
788 struct ValueToString<TextTrackCue*> {
789     static String string(TextTrackCue* const& cue)
790     {
791         return String::format("%p id=%s interval=%f-->%f cue=%s)", cue, cue->id().utf8().data(), cue->startTime(), cue->endTime(), cue->text().utf8().data());
792     }
793 };
794 #endif
795 #endif
796
797 inline bool isMediaElement(Node* node)
798 {
799     return node && node->isElementNode() && toElement(node)->isMediaElement();
800 }
801
802 inline HTMLMediaElement* toHTMLMediaElement(Node* node)
803 {
804     ASSERT_WITH_SECURITY_IMPLICATION(!node || isMediaElement(node));
805     return static_cast<HTMLMediaElement*>(node);
806 }
807
808 } //namespace
809
810 #endif
811 #endif