564a60d7ce28068507d88403aeae72a486a51e05
[WebKit-https.git] / Source / WebCore / html / HTMLMediaElement.h
1 /*
2  * Copyright (C) 2007-2015 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 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 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 "GenericTaskQueue.h"
34 #include "HTMLMediaElementEnums.h"
35 #include "MediaCanStartListener.h"
36 #include "MediaControllerInterface.h"
37 #include "MediaElementSession.h"
38 #include "MediaProducer.h"
39 #include "PageThrottler.h"
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 "VTTCue.h"
48 #include "VideoTrack.h"
49 #endif
50
51 #ifndef NDEBUG
52 #include <wtf/StringPrintStream.h>
53 #endif
54
55 namespace WebCore {
56
57 #if ENABLE(WEB_AUDIO)
58 class AudioSourceProvider;
59 class MediaElementAudioSourceNode;
60 #endif
61 class DisplaySleepDisabler;
62 class Event;
63 class HTMLSourceElement;
64 class HTMLTrackElement;
65 class URL;
66 class MediaController;
67 class MediaControls;
68 class MediaControlsHost;
69 class MediaError;
70 class MediaPlayer;
71 class TimeRanges;
72 #if ENABLE(ENCRYPTED_MEDIA_V2)
73 class MediaKeys;
74 #endif
75 #if ENABLE(MEDIA_SESSION)
76 class MediaSession;
77 #endif
78 #if ENABLE(MEDIA_SOURCE)
79 class MediaSource;
80 class SourceBuffer;
81 class VideoPlaybackQuality;
82 #endif
83
84 #if ENABLE(VIDEO_TRACK)
85 class AudioTrackList;
86 class AudioTrackPrivate;
87 class InbandTextTrackPrivate;
88 class TextTrackList;
89 class VideoTrackList;
90 class VideoTrackPrivate;
91
92 typedef PODIntervalTree<MediaTime, TextTrackCue*> CueIntervalTree;
93 typedef CueIntervalTree::IntervalType CueInterval;
94 typedef Vector<CueInterval> CueList;
95 #endif
96
97 #if ENABLE(MEDIA_STREAM)
98 class MediaStream;
99 #endif
100
101 class HTMLMediaElement
102     : public HTMLElement
103     , private MediaPlayerClient, public MediaPlayerSupportsTypeClient, private MediaCanStartListener, public ActiveDOMObject, public MediaControllerInterface , public PlatformMediaSessionClient, private MediaProducer
104 #if ENABLE(VIDEO_TRACK)
105     , private AudioTrackClient
106     , private TextTrackClient
107     , private VideoTrackClient
108 #endif
109 {
110 public:
111     MediaPlayer* player() const { return m_player.get(); }
112
113     virtual bool isVideo() const { return false; }
114     virtual bool hasVideo() const override { return false; }
115     virtual bool hasAudio() const override;
116
117     static HashSet<HTMLMediaElement*>& allMediaElements();
118
119     void rewind(double timeDelta);
120     WEBCORE_EXPORT virtual void returnToRealtime() override;
121
122     // Eventually overloaded in HTMLVideoElement
123     virtual bool supportsFullscreen() const override { return false; };
124
125     virtual bool supportsScanning() const override;
126
127     bool canSaveMediaData() const;
128
129     virtual bool doesHaveAttribute(const AtomicString&, AtomicString* value = nullptr) const override;
130
131     WEBCORE_EXPORT PlatformMedia platformMedia() const;
132     PlatformLayer* platformLayer() const;
133 #if PLATFORM(IOS)
134     void setVideoFullscreenLayer(PlatformLayer*);
135     PlatformLayer* videoFullscreenLayer() const { return m_videoFullscreenLayer.get(); }
136     void setVideoFullscreenFrame(FloatRect);
137     void setVideoFullscreenGravity(MediaPlayerEnums::VideoGravity);
138     MediaPlayerEnums::VideoGravity videoFullscreenGravity() const { return m_videoFullscreenGravity; }
139 #endif
140
141     using HTMLMediaElementEnums::DelayedActionType;
142     void scheduleDelayedAction(DelayedActionType);
143     
144     MediaPlayerEnums::MovieLoadType movieLoadType() const;
145     
146     bool inActiveDocument() const { return m_inActiveDocument; }
147
148     const Document* hostingDocument() const override { return &document(); }
149
150 // DOM API
151 // error state
152     PassRefPtr<MediaError> error() const;
153
154     void setSrc(const String&);
155     const URL& currentSrc() const { return m_currentSrc; }
156
157 #if ENABLE(MEDIA_STREAM)
158     MediaStream* srcObject() const { return m_mediaStreamSrcObject.get(); }
159     void setSrcObject(MediaStream*);
160 #endif
161
162 // network state
163     using HTMLMediaElementEnums::NetworkState;
164     NetworkState networkState() const;
165
166     String preload() const;    
167     void setPreload(const String&);
168
169     virtual PassRefPtr<TimeRanges> buffered() const override;
170     void load();
171     String canPlayType(const String& mimeType, const String& keySystem = String(), const URL& = URL()) const;
172
173 // ready state
174     using HTMLMediaElementEnums::ReadyState;
175     virtual ReadyState readyState() const override;
176     bool seeking() const;
177
178 // playback state
179     WEBCORE_EXPORT virtual double currentTime() const override;
180     virtual void setCurrentTime(double) override;
181     virtual void setCurrentTime(double, ExceptionCode&);
182     virtual double getStartDate() const;
183     WEBCORE_EXPORT virtual double duration() const override;
184     WEBCORE_EXPORT virtual bool paused() const override;
185     virtual double defaultPlaybackRate() const override;
186     virtual void setDefaultPlaybackRate(double) override;
187     WEBCORE_EXPORT virtual double playbackRate() const override;
188     virtual void setPlaybackRate(double) override;
189
190 // MediaTime versions of playback state
191     MediaTime currentMediaTime() const;
192     void setCurrentTime(const MediaTime&);
193     MediaTime durationMediaTime() const;
194     void fastSeek(const MediaTime&);
195
196     void updatePlaybackRate();
197     bool webkitPreservesPitch() const;
198     void setWebkitPreservesPitch(bool);
199     virtual PassRefPtr<TimeRanges> played() override;
200     virtual PassRefPtr<TimeRanges> seekable() const override;
201     WEBCORE_EXPORT bool ended() const;
202     bool autoplay() const;
203     bool loop() const;    
204     void setLoop(bool b);
205     WEBCORE_EXPORT virtual void play() override;
206     WEBCORE_EXPORT virtual void pause() override;
207     virtual void setShouldBufferData(bool) override;
208     void fastSeek(double);
209     double minFastReverseRate() const;
210     double maxFastForwardRate() const;
211
212     void purgeBufferedDataIfPossible();
213
214 // captions
215     bool webkitHasClosedCaptions() const;
216     bool webkitClosedCaptionsVisible() const;
217     void setWebkitClosedCaptionsVisible(bool);
218
219     virtual bool elementIsHidden() const override { return m_elementIsHidden; }
220
221 #if ENABLE(MEDIA_STATISTICS)
222 // Statistics
223     unsigned webkitAudioDecodedByteCount() const;
224     unsigned webkitVideoDecodedByteCount() const;
225 #endif
226
227 #if ENABLE(MEDIA_SOURCE)
228 //  Media Source.
229     void closeMediaSource();
230     void incrementDroppedFrameCount() { ++m_droppedVideoFrames; }
231     size_t maximumSourceBufferSize(const SourceBuffer&) const;
232 #endif
233
234 #if ENABLE(ENCRYPTED_MEDIA)
235     void webkitGenerateKeyRequest(const String& keySystem, PassRefPtr<Uint8Array> initData, ExceptionCode&);
236     void webkitGenerateKeyRequest(const String& keySystem, ExceptionCode&);
237     void webkitAddKey(const String& keySystem, PassRefPtr<Uint8Array> key, PassRefPtr<Uint8Array> initData, const String& sessionId, ExceptionCode&);
238     void webkitAddKey(const String& keySystem, PassRefPtr<Uint8Array> key, ExceptionCode&);
239     void webkitCancelKeyRequest(const String& keySystem, const String& sessionId, ExceptionCode&);
240 #endif
241
242 #if ENABLE(ENCRYPTED_MEDIA_V2)
243     MediaKeys* keys() const { return m_mediaKeys.get(); }
244     void setMediaKeys(MediaKeys*);
245
246     void keyAdded();
247 #endif
248
249 // controls
250     bool controls() const;
251     void setControls(bool);
252     WEBCORE_EXPORT virtual double volume() const override;
253     virtual void setVolume(double, ExceptionCode&) override;
254     WEBCORE_EXPORT virtual bool muted() const override;
255     WEBCORE_EXPORT virtual void setMuted(bool) override;
256
257     WEBCORE_EXPORT void togglePlayState();
258     WEBCORE_EXPORT virtual void beginScrubbing() override;
259     WEBCORE_EXPORT virtual void endScrubbing() override;
260
261     virtual void beginScanning(ScanDirection) override;
262     virtual void endScanning() override;
263     double nextScanRate();
264
265     WEBCORE_EXPORT virtual bool canPlay() const override;
266
267     double percentLoaded() const;
268
269 #if ENABLE(VIDEO_TRACK)
270     PassRefPtr<TextTrack> addTextTrack(const String& kind, const String& label, const String& language, ExceptionCode&);
271     PassRefPtr<TextTrack> addTextTrack(const String& kind, const String& label, ExceptionCode& ec) { return addTextTrack(kind, label, emptyString(), ec); }
272     PassRefPtr<TextTrack> addTextTrack(const String& kind, ExceptionCode& ec) { return addTextTrack(kind, emptyString(), emptyString(), ec); }
273
274     AudioTrackList* audioTracks();
275     TextTrackList* textTracks();
276     VideoTrackList* videoTracks();
277
278     CueList currentlyActiveCues() const { return m_currentlyActiveCues; }
279
280     void addAudioTrack(PassRefPtr<AudioTrack>);
281     void addTextTrack(PassRefPtr<TextTrack>);
282     void addVideoTrack(PassRefPtr<VideoTrack>);
283     void removeAudioTrack(AudioTrack*);
284     void removeTextTrack(TextTrack*, bool scheduleEvent = true);
285     void removeVideoTrack(VideoTrack*);
286     void forgetResourceSpecificTracks();
287     void closeCaptionTracksChanged();
288     void notifyMediaPlayerOfTextTrackChanges();
289
290     virtual void didAddTextTrack(HTMLTrackElement*);
291     virtual void didRemoveTextTrack(HTMLTrackElement*);
292
293     virtual void mediaPlayerDidAddAudioTrack(PassRefPtr<AudioTrackPrivate>) override;
294     virtual void mediaPlayerDidAddTextTrack(PassRefPtr<InbandTextTrackPrivate>) override;
295     virtual void mediaPlayerDidAddVideoTrack(PassRefPtr<VideoTrackPrivate>) override;
296     virtual void mediaPlayerDidRemoveAudioTrack(PassRefPtr<AudioTrackPrivate>) override;
297     virtual void mediaPlayerDidRemoveTextTrack(PassRefPtr<InbandTextTrackPrivate>) override;
298     virtual void mediaPlayerDidRemoveVideoTrack(PassRefPtr<VideoTrackPrivate>) override;
299
300 #if ENABLE(AVF_CAPTIONS)
301     virtual Vector<RefPtr<PlatformTextTrack>> outOfBandTrackSources() override;
302 #endif
303
304     struct TrackGroup;
305     void configureTextTrackGroupForLanguage(const TrackGroup&) const;
306     void configureTextTracks();
307     void configureTextTrackGroup(const TrackGroup&);
308
309     void setSelectedTextTrack(TextTrack*);
310
311     bool textTracksAreReady() const;
312     using HTMLMediaElementEnums::TextTrackVisibilityCheckType;
313     void configureTextTrackDisplay(TextTrackVisibilityCheckType checkType = CheckTextTrackVisibility);
314     void updateTextTrackDisplay();
315
316     // AudioTrackClient
317     virtual void audioTrackEnabledChanged(AudioTrack*) override;
318
319     // TextTrackClient
320     virtual void textTrackReadyStateChanged(TextTrack*);
321     virtual void textTrackKindChanged(TextTrack*) override;
322     virtual void textTrackModeChanged(TextTrack*) override;
323     virtual void textTrackAddCues(TextTrack*, const TextTrackCueList*) override;
324     virtual void textTrackRemoveCues(TextTrack*, const TextTrackCueList*) override;
325     virtual void textTrackAddCue(TextTrack*, PassRefPtr<TextTrackCue>) override;
326     virtual void textTrackRemoveCue(TextTrack*, PassRefPtr<TextTrackCue>) override;
327
328     // VideoTrackClient
329     virtual void videoTrackSelectedChanged(VideoTrack*) override;
330
331     bool requiresTextTrackRepresentation() const;
332     void setTextTrackRepresentation(TextTrackRepresentation*);
333     void syncTextTrackBounds();
334 #endif
335
336 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
337     void webkitShowPlaybackTargetPicker();
338     virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture) override;
339     virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture) override;
340
341     virtual void wirelessRoutesAvailableDidChange() override;
342     virtual bool canPlayToWirelessPlaybackTarget() const override;
343     virtual bool isPlayingToWirelessPlaybackTarget() const override;
344     virtual void setWirelessPlaybackTarget(Ref<MediaPlaybackTarget>&&) override;
345     virtual void setShouldPlayToPlaybackTarget(bool) override;
346 #endif
347     bool webkitCurrentPlaybackTargetIsWireless() const;
348
349     // EventTarget function.
350     // Both Node (via HTMLElement) and ActiveDOMObject define this method, which
351     // causes an ambiguity error at compile time. This class's constructor
352     // ensures that both implementations return document, so return the result
353     // of one of them here.
354     using HTMLElement::scriptExecutionContext;
355
356     bool hasSingleSecurityOrigin() const { return !m_player || m_player->hasSingleSecurityOrigin(); }
357     
358     WEBCORE_EXPORT virtual bool isFullscreen() const override;
359     void toggleFullscreenState();
360
361     using MediaPlayerEnums::VideoFullscreenMode;
362     VideoFullscreenMode fullscreenMode() const { return m_videoFullscreenMode; }
363     virtual void fullscreenModeChanged(VideoFullscreenMode mode) { m_videoFullscreenMode = mode; }
364
365     void enterFullscreen(VideoFullscreenMode);
366     virtual void enterFullscreen() override;
367     WEBCORE_EXPORT void exitFullscreen();
368
369     virtual bool hasClosedCaptions() const override;
370     virtual bool closedCaptionsVisible() const override;
371     virtual void setClosedCaptionsVisible(bool) override;
372
373     MediaControls* mediaControls() const;
374
375     void sourceWasRemoved(HTMLSourceElement*);
376     void sourceWasAdded(HTMLSourceElement*);
377
378     virtual void privateBrowsingStateDidChange() override;
379
380     // Media cache management.
381     WEBCORE_EXPORT static void getSitesInMediaCache(Vector<String>&);
382     WEBCORE_EXPORT static void clearMediaCache();
383     WEBCORE_EXPORT static void clearMediaCacheForSite(const String&);
384     static void resetMediaEngines();
385
386     bool isPlaying() const { return m_playing; }
387
388     virtual bool hasPendingActivity() const override;
389
390 #if ENABLE(WEB_AUDIO)
391     MediaElementAudioSourceNode* audioSourceNode() { return m_audioSourceNode; }
392     void setAudioSourceNode(MediaElementAudioSourceNode*);
393
394     AudioSourceProvider* audioSourceProvider();
395 #endif
396
397     using HTMLMediaElementEnums::InvalidURLAction;
398     bool isSafeToLoadURL(const URL&, InvalidURLAction);
399
400     const String& mediaGroup() const;
401     void setMediaGroup(const String&);
402
403     MediaController* controller() const;
404     void setController(PassRefPtr<MediaController>);
405
406     void enteredOrExitedFullscreen() { configureMediaControls(); }
407
408     unsigned long long fileSize() const;
409
410     void mediaLoadingFailed(MediaPlayerEnums::NetworkState);
411     void mediaLoadingFailedFatally(MediaPlayerEnums::NetworkState);
412
413 #if ENABLE(MEDIA_SESSION)
414     WEBCORE_EXPORT double playerVolume() const;
415
416     const String& kind() const { return m_kind; }
417     void setKind(const String& kind) { m_kind = kind; }
418
419     MediaSession* session() const;
420     void setSession(MediaSession*);
421
422     void setShouldDuck(bool);
423
424     static HTMLMediaElement* elementWithID(uint64_t);
425     uint64_t elementID() const { return m_elementID; }
426 #endif
427
428 #if ENABLE(MEDIA_SOURCE)
429     RefPtr<VideoPlaybackQuality> getVideoPlaybackQuality();
430 #endif
431
432     MediaPlayerEnums::Preload preloadValue() const { return m_preload; }
433     MediaElementSession& mediaSession() const { return *m_mediaSession; }
434
435 #if ENABLE(MEDIA_CONTROLS_SCRIPT)
436     void pageScaleFactorChanged();
437     WEBCORE_EXPORT String getCurrentMediaControlsStatus();
438 #endif
439
440     MediaControlsHost* mediaControlsHost() { return m_mediaControlsHost.get(); }
441
442     bool isDisablingSleep() const { return m_sleepDisabler.get(); }
443
444     double maxBufferedTime() const;
445
446     virtual MediaProducer::MediaStateFlags mediaState() const override;
447
448     void layoutSizeChanged();
449
450     void allowsMediaDocumentInlinePlaybackChanged();
451
452 protected:
453     HTMLMediaElement(const QualifiedName&, Document&, bool);
454     virtual ~HTMLMediaElement();
455
456     virtual void parseAttribute(const QualifiedName&, const AtomicString&) override;
457     virtual void finishParsingChildren() override;
458     virtual bool isURLAttribute(const Attribute&) const override;
459     virtual void willAttachRenderers() override;
460     virtual void didAttachRenderers() override;
461
462     virtual void didMoveToNewDocument(Document* oldDocument) override;
463
464     enum DisplayMode { Unknown, None, Poster, PosterWaitingForVideo, Video };
465     DisplayMode displayMode() const { return m_displayMode; }
466     virtual void setDisplayMode(DisplayMode mode) { m_displayMode = mode; }
467     
468     virtual bool isMediaElement() const override final { return true; }
469
470 #if ENABLE(VIDEO_TRACK)
471     bool ignoreTrackDisplayUpdateRequests() const { return m_ignoreTrackDisplayUpdate > 0 || !m_textTracks || !m_cueTree.size(); }
472     void beginIgnoringTrackDisplayUpdateRequests();
473     void endIgnoringTrackDisplayUpdateRequests();
474 #endif
475
476     virtual RenderPtr<RenderElement> createElementRenderer(Ref<RenderStyle>&&, const RenderTreePosition&) override;
477
478 #if ENABLE(MEDIA_CONTROLS_SCRIPT)
479     bool mediaControlsDependOnPageScaleFactor() const { return m_mediaControlsDependOnPageScaleFactor; }
480     void setMediaControlsDependOnPageScaleFactor(bool);
481 #endif
482
483     void scheduleEvent(const AtomicString& eventName);
484
485 private:
486     void createMediaPlayer();
487
488     virtual bool alwaysCreateUserAgentShadowRoot() const override { return true; }
489
490     virtual bool hasCustomFocusLogic() const override;
491     virtual bool supportsFocus() const override;
492     virtual bool isMouseFocusable() const override;
493     virtual bool rendererIsNeeded(const RenderStyle&) override;
494     virtual bool childShouldCreateRenderer(const Node&) const override;
495     virtual InsertionNotificationRequest insertedInto(ContainerNode&) override;
496     virtual void removedFrom(ContainerNode&) override;
497     virtual void didRecalcStyle(Style::Change) override;
498
499     virtual void didBecomeFullscreenElement() override;
500     virtual void willStopBeingFullscreenElement() override;
501
502     // ActiveDOMObject API.
503     const char* activeDOMObjectName() const override;
504     bool canSuspendForPageCache() const override;
505     void suspend(ReasonForSuspension) override;
506     void resume() override;
507     void stop() override;
508     void stopWithoutDestroyingMediaPlayer();
509     virtual void contextDestroyed() override;
510     
511     virtual void mediaVolumeDidChange() override;
512
513     virtual void visibilityStateChanged() override;
514
515     virtual void updateDisplayState() { }
516     
517     void setReadyState(MediaPlayerEnums::ReadyState);
518     void setNetworkState(MediaPlayerEnums::NetworkState);
519
520     double effectivePlaybackRate() const;
521     double requestedPlaybackRate() const;
522
523     virtual void mediaPlayerNetworkStateChanged(MediaPlayer*) override;
524     virtual void mediaPlayerReadyStateChanged(MediaPlayer*) override;
525     virtual void mediaPlayerTimeChanged(MediaPlayer*) override;
526     virtual void mediaPlayerVolumeChanged(MediaPlayer*) override;
527     virtual void mediaPlayerMuteChanged(MediaPlayer*) override;
528     virtual void mediaPlayerDurationChanged(MediaPlayer*) override;
529     virtual void mediaPlayerRateChanged(MediaPlayer*) override;
530     virtual void mediaPlayerPlaybackStateChanged(MediaPlayer*) override;
531     virtual void mediaPlayerSawUnsupportedTracks(MediaPlayer*) override;
532     virtual void mediaPlayerResourceNotSupported(MediaPlayer*) override;
533     virtual void mediaPlayerRepaint(MediaPlayer*) override;
534     virtual void mediaPlayerSizeChanged(MediaPlayer*) override;
535     virtual bool mediaPlayerRenderingCanBeAccelerated(MediaPlayer*) override;
536     virtual void mediaPlayerRenderingModeChanged(MediaPlayer*) override;
537     virtual void mediaPlayerEngineUpdated(MediaPlayer*) override;
538     
539     virtual void mediaPlayerFirstVideoFrameAvailable(MediaPlayer*) override;
540     virtual void mediaPlayerCharacteristicChanged(MediaPlayer*) override;
541
542 #if ENABLE(ENCRYPTED_MEDIA)
543     virtual void mediaPlayerKeyAdded(MediaPlayer*, const String& keySystem, const String& sessionId) override;
544     virtual void mediaPlayerKeyError(MediaPlayer*, const String& keySystem, const String& sessionId, MediaPlayerClient::MediaKeyErrorCode, unsigned short systemCode) override;
545     virtual void mediaPlayerKeyMessage(MediaPlayer*, const String& keySystem, const String& sessionId, const unsigned char* message, unsigned messageLength, const URL& defaultURL) override;
546     virtual bool mediaPlayerKeyNeeded(MediaPlayer*, const String& keySystem, const String& sessionId, const unsigned char* initData, unsigned initDataLength) override;
547 #endif
548
549 #if ENABLE(ENCRYPTED_MEDIA_V2)
550     virtual RefPtr<ArrayBuffer> mediaPlayerCachedKeyForKeyId(const String& keyId) const override;
551     virtual bool mediaPlayerKeyNeeded(MediaPlayer*, Uint8Array*) override;
552     virtual String mediaPlayerMediaKeysStorageDirectory() const override;
553 #endif
554     
555 #if ENABLE(MEDIA_STREAM)
556     virtual String mediaPlayerMediaDeviceIdentifierStorageDirectory() const override;
557 #endif
558
559 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
560     virtual void mediaPlayerCurrentPlaybackTargetIsWirelessChanged(MediaPlayer*) override;
561     void enqueuePlaybackTargetAvailabilityChangedEvent();
562
563     using EventTarget::dispatchEvent;
564     virtual bool dispatchEvent(PassRefPtr<Event>) override;
565 #endif
566
567 #if ENABLE(MEDIA_SESSION)
568     void setSessionInternal(MediaSession&);
569 #endif
570
571     virtual String mediaPlayerReferrer() const override;
572     virtual String mediaPlayerUserAgent() const override;
573
574     virtual bool mediaPlayerNeedsSiteSpecificHacks() const override;
575     virtual String mediaPlayerDocumentHost() const override;
576
577     virtual void mediaPlayerEnterFullscreen() override;
578     virtual void mediaPlayerExitFullscreen() override;
579     virtual bool mediaPlayerIsFullscreen() const override;
580     virtual bool mediaPlayerIsFullscreenPermitted() const override;
581     virtual bool mediaPlayerIsVideo() const override;
582     virtual LayoutRect mediaPlayerContentBoxRect() const override;
583     virtual float mediaPlayerContentsScale() const override;
584     virtual void mediaPlayerSetSize(const IntSize&) override;
585     virtual void mediaPlayerPause() override;
586     virtual void mediaPlayerPlay() override;
587     virtual bool mediaPlayerPlatformVolumeConfigurationRequired() const override;
588     virtual bool mediaPlayerIsPaused() const override;
589     virtual bool mediaPlayerIsLooping() const override;
590     virtual CachedResourceLoader* mediaPlayerCachedResourceLoader() override;
591     virtual RefPtr<PlatformMediaResourceLoader> mediaPlayerCreateResourceLoader(std::unique_ptr<PlatformMediaResourceLoaderClient>) override;
592
593 #if PLATFORM(WIN) && USE(AVFOUNDATION)
594     virtual GraphicsDeviceAdapter* mediaPlayerGraphicsDeviceAdapter(const MediaPlayer*) const override;
595 #endif
596
597     virtual bool mediaPlayerShouldWaitForResponseToAuthenticationChallenge(const AuthenticationChallenge&) override;
598     virtual void mediaPlayerHandlePlaybackCommand(PlatformMediaSession::RemoteControlCommandType command) override { didReceiveRemoteControlCommand(command); }
599     virtual String mediaPlayerSourceApplicationIdentifier() const override;
600     virtual Vector<String> mediaPlayerPreferredAudioCharacteristics() const override;
601
602 #if PLATFORM(IOS)
603     virtual String mediaPlayerNetworkInterfaceName() const override;
604     virtual bool mediaPlayerGetRawCookies(const URL&, Vector<Cookie>&) const override;
605 #endif
606
607     virtual bool mediaPlayerIsInMediaDocument() const override final;
608     virtual void mediaPlayerEngineFailedToLoad() const override final;
609
610     virtual double mediaPlayerRequestedPlaybackRate() const override final;
611     virtual VideoFullscreenMode mediaPlayerFullscreenMode() const override final { return fullscreenMode(); }
612
613 #if USE(GSTREAMER)
614     virtual void requestInstallMissingPlugins(const String& details, const String& description, MediaPlayerRequestInstallMissingPluginsCallback&) override final;
615 #endif
616
617     void pendingActionTimerFired();
618     void progressEventTimerFired();
619     void playbackProgressTimerFired();
620     void scanTimerFired();
621     void seekTask();
622     void startPlaybackProgressTimer();
623     void startProgressEventTimer();
624     void stopPeriodicTimers();
625
626     void seek(const MediaTime&);
627     void seekInternal(const MediaTime&);
628     void seekWithTolerance(const MediaTime&, const MediaTime& negativeTolerance, const MediaTime& positiveTolerance, bool fromDOM);
629     void finishSeek();
630     void clearSeeking();
631     void addPlayedRange(const MediaTime& start, const MediaTime& end);
632     
633     void scheduleTimeupdateEvent(bool periodicEvent);
634
635     // loading
636     void selectMediaResource();
637     void loadResource(const URL&, ContentType&, const String& keySystem);
638     void scheduleNextSourceChild();
639     void loadNextSourceChild();
640     void userCancelledLoad();
641     void clearMediaPlayer(int flags);
642     bool havePotentialSourceChild();
643     void noneSupported();
644     void cancelPendingEventsAndCallbacks();
645     void waitForSourceChange();
646     void prepareToPlay();
647
648     URL selectNextSourceChild(ContentType*, String* keySystem, InvalidURLAction);
649
650 #if ENABLE(VIDEO_TRACK)
651     void updateActiveTextTrackCues(const MediaTime&);
652     HTMLTrackElement* showingTrackWithSameKind(HTMLTrackElement*) const;
653
654     enum ReconfigureMode {
655         Immediately,
656         AfterDelay,
657     };
658     void markCaptionAndSubtitleTracksAsUnconfigured(ReconfigureMode);
659     virtual void captionPreferencesChanged() override;
660 #endif
661
662     // These "internal" functions do not check user gesture restrictions.
663     void loadInternal();
664     void playInternal();
665     void pauseInternal();
666
667     void prepareForLoad();
668     void allowVideoRendering();
669
670     bool processingMediaPlayerCallback() const { return m_processingMediaPlayerCallback > 0; }
671     void beginProcessingMediaPlayerCallback() { ++m_processingMediaPlayerCallback; }
672     void endProcessingMediaPlayerCallback() { ASSERT(m_processingMediaPlayerCallback); --m_processingMediaPlayerCallback; }
673
674     void updateVolume();
675     void updatePlayState();
676     void setPlaying(bool);
677     bool potentiallyPlaying() const;
678     bool endedPlayback() const;
679     bool stoppedDueToErrors() const;
680     bool pausedForUserInteraction() const;
681     bool couldPlayIfEnoughData() const;
682
683     MediaTime minTimeSeekable() const;
684     MediaTime maxTimeSeekable() const;
685
686     // Pauses playback without changing any states or generating events
687     void setPausedInternal(bool);
688
689     void setPlaybackRateInternal(double);
690
691     virtual void mediaCanStart() override;
692
693     void setShouldDelayLoadEvent(bool);
694     void invalidateCachedTime() const;
695     void refreshCachedTime() const;
696
697     bool hasMediaControls() const;
698     bool createMediaControls();
699     void configureMediaControls();
700
701     void prepareMediaFragmentURI();
702     void applyMediaFragmentURI();
703
704     void changeNetworkStateFromLoadingToIdle();
705
706     void removeBehaviorsRestrictionsAfterFirstUserGesture();
707
708     void updateMediaController();
709     bool isBlocked() const;
710     bool isBlockedOnMediaController() const;
711     virtual bool hasCurrentSrc() const override { return !m_currentSrc.isEmpty(); }
712     virtual bool isLiveStream() const override { return movieLoadType() == MediaPlayerEnums::LiveStream; }
713     bool isAutoplaying() const { return m_autoplaying; }
714
715     void updateSleepDisabling();
716     bool shouldDisableSleep() const;
717
718 #if ENABLE(MEDIA_CONTROLS_SCRIPT)
719     virtual void didAddUserAgentShadowRoot(ShadowRoot*) override;
720     DOMWrapperWorld& ensureIsolatedWorld();
721     bool ensureMediaControlsInjectedScript();
722 #endif
723
724     // PlatformMediaSessionClient Overrides
725     virtual PlatformMediaSession::MediaType mediaType() const override;
726     virtual PlatformMediaSession::MediaType presentationType() const override;
727     virtual PlatformMediaSession::DisplayType displayType() const override;
728     virtual void suspendPlayback() override;
729     virtual void mayResumePlayback(bool shouldResume) override;
730     virtual String mediaSessionTitle() const override;
731     virtual double mediaSessionDuration() const override { return duration(); }
732     virtual double mediaSessionCurrentTime() const override { return currentTime(); }
733     virtual bool canReceiveRemoteControlCommands() const override { return true; }
734     virtual void didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType) override;
735     virtual bool overrideBackgroundPlaybackRestriction() const override;
736
737     virtual void pageMutedStateDidChange() override;
738
739     bool effectiveMuted() const;
740
741     void registerWithDocument(Document&);
742     void unregisterWithDocument(Document&);
743
744     void updateCaptionContainer();
745
746 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
747     virtual void documentWillSuspendForPageCache() override final;
748     virtual void documentDidResumeFromPageCache() override final;
749
750     enum class UpdateMediaState {
751         Asynchronously,
752         Synchronously,
753     };
754     void updateMediaState(UpdateMediaState updateState = UpdateMediaState::Synchronously);
755 #endif
756
757     Timer m_pendingActionTimer;
758     Timer m_progressEventTimer;
759     Timer m_playbackProgressTimer;
760     Timer m_scanTimer;
761     GenericTaskQueue<ScriptExecutionContext> m_seekTaskQueue;
762     GenericTaskQueue<ScriptExecutionContext> m_resizeTaskQueue;
763     GenericTaskQueue<ScriptExecutionContext> m_shadowDOMTaskQueue;
764     RefPtr<TimeRanges> m_playedTimeRanges;
765     GenericEventQueue m_asyncEventQueue;
766
767     double m_requestedPlaybackRate;
768     double m_reportedPlaybackRate;
769     double m_defaultPlaybackRate;
770     bool m_webkitPreservesPitch;
771     NetworkState m_networkState;
772     ReadyState m_readyState;
773     ReadyState m_readyStateMaximum;
774     URL m_currentSrc;
775
776     RefPtr<MediaError> m_error;
777
778     struct PendingSeek {
779         PendingSeek(const MediaTime& now, const MediaTime& targetTime, const MediaTime& negativeTolerance, const MediaTime& positiveTolerance)
780             : now(now)
781             , targetTime(targetTime)
782             , negativeTolerance(negativeTolerance)
783             , positiveTolerance(positiveTolerance)
784         {
785         }
786         MediaTime now;
787         MediaTime targetTime;
788         MediaTime negativeTolerance;
789         MediaTime positiveTolerance;
790     };
791     std::unique_ptr<PendingSeek> m_pendingSeek;
792     SeekType m_pendingSeekType { NoSeek };
793
794     double m_volume;
795     bool m_volumeInitialized;
796     MediaTime m_lastSeekTime;
797     
798     double m_previousProgressTime;
799
800     // The last time a timeupdate event was sent (based on monotonic clock).
801     double m_clockTimeAtLastUpdateEvent;
802
803     // The last time a timeupdate event was sent in movie time.
804     MediaTime m_lastTimeUpdateEventMovieTime;
805     
806     // Loading state.
807     enum LoadState { WaitingForSource, LoadingFromSrcAttr, LoadingFromSourceElement };
808     LoadState m_loadState;
809     RefPtr<HTMLSourceElement> m_currentSourceNode;
810     RefPtr<Node> m_nextChildNodeToConsider;
811
812     VideoFullscreenMode m_videoFullscreenMode;
813 #if PLATFORM(IOS)
814     RetainPtr<PlatformLayer> m_videoFullscreenLayer;
815     FloatRect m_videoFullscreenFrame;
816     MediaPlayerEnums::VideoGravity m_videoFullscreenGravity;
817 #endif
818
819     std::unique_ptr<MediaPlayer> m_player;
820
821     MediaPlayerEnums::Preload m_preload;
822
823     DisplayMode m_displayMode;
824
825     // Counter incremented while processing a callback from the media player, so we can avoid
826     // calling the media engine recursively.
827     int m_processingMediaPlayerCallback;
828
829 #if ENABLE(MEDIA_SESSION)
830     String m_kind;
831     RefPtr<MediaSession> m_session;
832     bool m_shouldDuck { false };
833     uint64_t m_elementID;
834 #endif
835
836 #if ENABLE(MEDIA_SOURCE)
837     RefPtr<MediaSource> m_mediaSource;
838     unsigned long m_droppedVideoFrames;
839 #endif
840
841     mutable MediaTime m_cachedTime;
842     mutable double m_clockTimeAtLastCachedTimeUpdate;
843     mutable double m_minimumClockTimeToUpdateCachedTime;
844
845     MediaTime m_fragmentStartTime;
846     MediaTime m_fragmentEndTime;
847
848     typedef unsigned PendingActionFlags;
849     PendingActionFlags m_pendingActionFlags;
850
851     enum ActionAfterScanType {
852         Nothing, Play, Pause
853     };
854     ActionAfterScanType m_actionAfterScan;
855
856     enum ScanType { Seek, Scan };
857     ScanType m_scanType;
858     ScanDirection m_scanDirection;
859
860     bool m_firstTimePlaying : 1;
861     bool m_playing : 1;
862     bool m_isWaitingUntilMediaCanStart : 1;
863     bool m_shouldDelayLoadEvent : 1;
864     bool m_haveFiredLoadedData : 1;
865     bool m_inActiveDocument : 1;
866     bool m_autoplaying : 1;
867     bool m_muted : 1;
868     bool m_explicitlyMuted : 1;
869     bool m_initiallyMuted : 1;
870     bool m_paused : 1;
871     bool m_seeking : 1;
872
873     // data has not been loaded since sending a "stalled" event
874     bool m_sentStalledEvent : 1;
875
876     // time has not changed since sending an "ended" event
877     bool m_sentEndEvent : 1;
878
879     bool m_pausedInternal : 1;
880
881     // Not all media engines provide enough information about a file to be able to
882     // support progress events so setting m_sendProgressEvents disables them 
883     bool m_sendProgressEvents : 1;
884
885     bool m_closedCaptionsVisible : 1;
886     bool m_webkitLegacyClosedCaptionOverride : 1;
887     bool m_completelyLoaded : 1;
888     bool m_havePreparedToPlay : 1;
889     bool m_parsingInProgress : 1;
890     bool m_elementIsHidden : 1;
891
892 #if ENABLE(MEDIA_CONTROLS_SCRIPT)
893     bool m_mediaControlsDependOnPageScaleFactor : 1;
894 #endif
895
896 #if ENABLE(VIDEO_TRACK)
897     bool m_tracksAreReady : 1;
898     bool m_haveVisibleTextTrack : 1;
899     bool m_processingPreferenceChange : 1;
900
901     String m_subtitleTrackLanguage;
902     MediaTime m_lastTextTrackUpdateTime;
903
904     CaptionUserPreferences::CaptionDisplayMode m_captionDisplayMode;
905
906     RefPtr<AudioTrackList> m_audioTracks;
907     RefPtr<TextTrackList> m_textTracks;
908     RefPtr<VideoTrackList> m_videoTracks;
909     Vector<RefPtr<TextTrack>> m_textTracksWhenResourceSelectionBegan;
910
911     CueIntervalTree m_cueTree;
912
913     CueList m_currentlyActiveCues;
914     int m_ignoreTrackDisplayUpdate;
915
916     bool m_requireCaptionPreferencesChangedCallbacks { false };
917 #endif
918
919 #if ENABLE(WEB_AUDIO)
920     // This is a weak reference, since m_audioSourceNode holds a reference to us.
921     // The value is set just after the MediaElementAudioSourceNode is created.
922     // The value is cleared in MediaElementAudioSourceNode::~MediaElementAudioSourceNode().
923     MediaElementAudioSourceNode* m_audioSourceNode;
924 #endif
925
926     String m_mediaGroup;
927     friend class MediaController;
928     RefPtr<MediaController> m_mediaController;
929
930     std::unique_ptr<DisplaySleepDisabler> m_sleepDisabler;
931
932     friend class TrackDisplayUpdateScope;
933
934 #if ENABLE(ENCRYPTED_MEDIA_V2)
935     RefPtr<MediaKeys> m_mediaKeys;
936 #endif
937
938     std::unique_ptr<MediaElementSession> m_mediaSession;
939     PageActivityAssertionToken m_activityToken;
940     size_t m_reportedExtraMemoryCost;
941
942 #if ENABLE(MEDIA_CONTROLS_SCRIPT)
943     friend class MediaControlsHost;
944     RefPtr<MediaControlsHost> m_mediaControlsHost;
945     RefPtr<DOMWrapperWorld> m_isolatedWorld;
946 #endif
947
948 #if ENABLE(MEDIA_STREAM)
949     RefPtr<MediaStream> m_mediaStreamSrcObject;
950 #endif
951
952 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
953     MediaProducer::MediaStateFlags m_mediaState { MediaProducer::IsNotPlaying };
954     bool m_hasPlaybackTargetAvailabilityListeners { false };
955     bool m_failedToPlayToWirelessTarget { false };
956 #endif
957 };
958
959 #if ENABLE(VIDEO_TRACK)
960 #ifndef NDEBUG
961 // Template specialization required by PodIntervalTree in debug mode.
962 template <>
963 struct ValueToString<TextTrackCue*> {
964     static String string(TextTrackCue* const& cue)
965     {
966         String text;
967         if (cue->isRenderable())
968             text = toVTTCue(cue)->text();
969         return String::format("%p id=%s interval=%s-->%s cue=%s)", cue, cue->id().utf8().data(), toString(cue->startTime()).utf8().data(), toString(cue->endTime()).utf8().data(), text.utf8().data());
970     }
971 };
972 #endif
973 #endif
974
975 #ifndef NDEBUG
976 template<>
977 struct ValueToString<MediaTime> {
978     static String string(const MediaTime& time)
979     {
980         return toString(time);
981     }
982 };
983 #endif
984
985 } // namespace WebCore
986
987 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::HTMLMediaElement)
988     static bool isType(const WebCore::Element& element) { return element.isMediaElement(); }
989     static bool isType(const WebCore::Node& node) { return is<WebCore::Element>(node) && isType(downcast<WebCore::Element>(node)); }
990 SPECIALIZE_TYPE_TRAITS_END()
991
992 #endif
993 #endif