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