#include "core/html/track/TextTrackCue.h"
#include "core/html/track/vtt/VTTCue.h"
#include "platform/PODIntervalTree.h"
+#include "platform/Supplementable.h"
#include "platform/graphics/media/MediaPlayer.h"
#include "public/platform/WebMediaPlayerClient.h"
#include "public/platform/WebMimeRegistry.h"
namespace blink {
-class WebContentDecryptionModule;
class WebInbandTextTrack;
class WebLayer;
}
-namespace WebCore {
+namespace blink {
#if ENABLE(WEB_AUDIO)
class AudioSourceProvider;
// But it can't be until the Chromium WebMediaPlayerClientImpl class is fixed so it
// no longer depends on typecasting a MediaPlayerClient to an HTMLMediaElement.
-class HTMLMediaElement : public HTMLElement, public WillBeHeapSupplementable<HTMLMediaElement>, public MediaPlayerClient, public ActiveDOMObject
-{
+class HTMLMediaElement : public HTMLElement, public WillBeHeapSupplementable<HTMLMediaElement>, public MediaPlayerClient, public ActiveDOMObject {
+ DEFINE_WRAPPERTYPEINFO();
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(HTMLMediaElement);
public:
static blink::WebMimeRegistry::SupportsType supportsType(const ContentType&, const String& keySystem = String());
static void setMediaStreamRegistry(URLRegistry*);
static bool isMediaStreamURL(const String& url);
- virtual void trace(Visitor*) OVERRIDE;
+ virtual void trace(Visitor*) override;
#if ENABLE(WEB_AUDIO)
void clearWeakMembers(Visitor*);
#endif
-
- // Do not use player().
- // FIXME: Replace all uses with webMediaPlayer() and remove this API.
- MediaPlayer* player() const { return m_player.get(); }
blink::WebMediaPlayer* webMediaPlayer() const { return m_player ? m_player->webMediaPlayer() : 0; }
virtual bool hasVideo() const { return false; }
bool isActive() const { return m_active; }
+ bool hasRemoteRoutes() const { return m_remoteRoutesAvailable; }
+ bool isPlayingRemotely() const { return m_playingRemotely; }
+
// error state
PassRefPtrWillBeRawPtr<MediaError> error() const;
String preload() const;
void setPreload(const AtomicString&);
- PassRefPtr<TimeRanges> buffered() const;
+ PassRefPtrWillBeRawPtr<TimeRanges> buffered() const;
void load();
String canPlayType(const String& mimeType, const String& keySystem = String()) const;
double playbackRate() const;
void setPlaybackRate(double);
void updatePlaybackRate();
- PassRefPtr<TimeRanges> played();
- PassRefPtr<TimeRanges> seekable() const;
+ PassRefPtrWillBeRawPtr<TimeRanges> played();
+ PassRefPtrWillBeRawPtr<TimeRanges> seekable() const;
bool ended() const;
bool autoplay() const;
bool loop() const;
- void setLoop(bool b);
+ void setLoop(bool);
void play();
void pause();
+ void requestRemotePlayback();
+ void requestRemotePlaybackControl();
// statistics
unsigned webkitAudioDecodedByteCount() const;
void durationChanged(double duration, bool requestSeek);
// controls
- bool controls() const;
- void setControls(bool);
+ bool shouldShowControls() const;
double volume() const;
void setVolume(double, ExceptionState&);
bool muted() const;
void addTextTrack(TextTrack*);
void removeTextTrack(TextTrack*);
- void closeCaptionTracksChanged();
+ void textTracksChanged();
void notifyMediaPlayerOfTextTrackChanges();
// Implements the "forget the media element's media-resource-specific tracks" algorithm in the HTML5 spec.
blink::WebMediaPlayer::TrackId addVideoTrack(const String& id, blink::WebMediaPlayerClient::VideoTrackKind, const AtomicString& label, const AtomicString& language, bool selected);
void removeVideoTrack(blink::WebMediaPlayer::TrackId);
- virtual void mediaPlayerDidAddTextTrack(blink::WebInbandTextTrack*) OVERRIDE FINAL;
- virtual void mediaPlayerDidRemoveTextTrack(blink::WebInbandTextTrack*) OVERRIDE FINAL;
+ virtual void mediaPlayerDidAddTextTrack(blink::WebInbandTextTrack*) override final;
+ virtual void mediaPlayerDidRemoveTextTrack(blink::WebInbandTextTrack*) override final;
// FIXME: Remove this when WebMediaPlayerClientImpl::loadInternal does not depend on it.
- virtual KURL mediaPlayerPosterURL() OVERRIDE { return KURL(); }
+ virtual KURL mediaPlayerPosterURL() override { return KURL(); }
class TrackGroup {
STACK_ALLOCATED();
{
}
- WillBeHeapVector<RefPtrWillBeMember<TextTrack> > tracks;
+ WillBeHeapVector<RefPtrWillBeMember<TextTrack>> tracks;
RefPtrWillBeMember<TextTrack> visibleTrack;
RefPtrWillBeMember<TextTrack> defaultTrack;
GroupKind kind;
// of one of them here.
using HTMLElement::executionContext;
- bool hasSingleSecurityOrigin() const { return !m_player || m_player->hasSingleSecurityOrigin(); }
+ bool hasSingleSecurityOrigin() const { return !m_player || (webMediaPlayer() && webMediaPlayer()->hasSingleSecurityOrigin()); }
bool isFullscreen() const;
void enterFullscreen();
bool closedCaptionsVisible() const;
void setClosedCaptionsVisible(bool);
+ void remoteRouteAvailabilityChanged(bool);
+ void connectedToRemoteDevice();
+ void disconnectedFromRemoteDevice();
+
MediaControls* mediaControls() const;
void sourceWasRemoved(HTMLSourceElement*);
void sourceWasAdded(HTMLSourceElement*);
- bool isPlaying() const { return m_playing; }
-
// ActiveDOMObject functions.
- virtual bool hasPendingActivity() const OVERRIDE FINAL;
- virtual void contextDestroyed() OVERRIDE FINAL;
+ virtual bool hasPendingActivity() const override final;
+ virtual void contextDestroyed() override final;
#if ENABLE(WEB_AUDIO)
AudioSourceProviderClient* audioSourceNode() { return m_audioSourceNode; }
void scheduleEvent(PassRefPtrWillBeRawPtr<Event>);
- // Current volume that should be used by the webMediaPlayer(). This method takes muted state
- // and m_mediaController multipliers into account.
- double playerVolume() const;
+ // Returns the "effective media volume" value as specified in the HTML5 spec.
+ double effectiveMediaVolume() const;
#if ENABLE(OILPAN)
bool isFinalizing() const { return m_isFinalizing; }
+
+ // Oilpan: finalization of the media element is observable from its
+ // attached MediaSource; it entering a closed state.
+ //
+ // Express that by having the MediaSource keep a weak reference
+ // to the media element and signal that it wants to be notified
+ // of destruction if it survives a GC, but the media element
+ // doesn't.
+ void setCloseMediaSourceWhenFinalizing();
#endif
+ // Predicates also used when dispatching wrapper creation (cf. [SpecialWrapFor] IDL attribute usage.)
+ virtual bool isHTMLAudioElement() const { return false; }
+ virtual bool isHTMLVideoElement() const { return false; }
+
protected:
HTMLMediaElement(const QualifiedName&, Document&);
virtual ~HTMLMediaElement();
- virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
- virtual void finishParsingChildren() OVERRIDE FINAL;
- virtual bool isURLAttribute(const Attribute&) const OVERRIDE;
- virtual void attach(const AttachContext& = AttachContext()) OVERRIDE;
+ virtual void parseAttribute(const QualifiedName&, const AtomicString&) override;
+ virtual void finishParsingChildren() override final;
+ virtual bool isURLAttribute(const Attribute&) const override;
+ virtual void attach(const AttachContext& = AttachContext()) override;
- virtual void didMoveToNewDocument(Document& oldDocument) OVERRIDE;
+ virtual void didMoveToNewDocument(Document& oldDocument) override;
enum DisplayMode { Unknown, Poster, PosterWaitingForVideo, Video };
DisplayMode displayMode() const { return m_displayMode; }
private:
void createMediaPlayer();
- virtual bool alwaysCreateUserAgentShadowRoot() const OVERRIDE FINAL { return true; }
- virtual bool areAuthorShadowsAllowed() const OVERRIDE FINAL { return false; }
+ virtual bool alwaysCreateUserAgentShadowRoot() const override final { return true; }
+ virtual bool areAuthorShadowsAllowed() const override final { return false; }
- virtual bool supportsFocus() const OVERRIDE FINAL;
- virtual bool isMouseFocusable() const OVERRIDE FINAL;
- virtual bool rendererIsNeeded(const RenderStyle&) OVERRIDE;
- virtual RenderObject* createRenderer(RenderStyle*) OVERRIDE;
- virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE FINAL;
- virtual void didNotifySubtreeInsertionsToDocument() OVERRIDE;
- virtual void removedFrom(ContainerNode*) OVERRIDE FINAL;
- virtual void didRecalcStyle(StyleRecalcChange) OVERRIDE FINAL;
+ virtual bool supportsFocus() const override final;
+ virtual bool isMouseFocusable() const override final;
+ virtual bool rendererIsNeeded(const RenderStyle&) override;
+ virtual RenderObject* createRenderer(RenderStyle*) override;
+ virtual InsertionNotificationRequest insertedInto(ContainerNode*) override final;
+ virtual void didNotifySubtreeInsertionsToDocument() override;
+ virtual void removedFrom(ContainerNode*) override final;
+ virtual void didRecalcStyle(StyleRecalcChange) override final;
- virtual void didBecomeFullscreenElement() OVERRIDE FINAL;
- virtual void willStopBeingFullscreenElement() OVERRIDE FINAL;
- virtual bool isInteractiveContent() const OVERRIDE FINAL;
- virtual void defaultEventHandler(Event*) OVERRIDE FINAL;
+ virtual void didBecomeFullscreenElement() override final;
+ virtual void willStopBeingFullscreenElement() override final;
+ virtual bool isInteractiveContent() const override final;
+ virtual void defaultEventHandler(Event*) override final;
// ActiveDOMObject functions.
- virtual void stop() OVERRIDE FINAL;
+ virtual void stop() override final;
virtual void updateDisplayState() { }
void setReadyState(ReadyState);
- void setNetworkState(MediaPlayer::NetworkState);
-
- virtual void mediaPlayerNetworkStateChanged() OVERRIDE FINAL;
- virtual void mediaPlayerReadyStateChanged() OVERRIDE FINAL;
- virtual void mediaPlayerTimeChanged() OVERRIDE FINAL;
- virtual void mediaPlayerDurationChanged() OVERRIDE FINAL;
- virtual void mediaPlayerPlaybackStateChanged() OVERRIDE FINAL;
- virtual void mediaPlayerRequestFullscreen() OVERRIDE FINAL;
- virtual void mediaPlayerRequestSeek(double) OVERRIDE FINAL;
- virtual void mediaPlayerRepaint() OVERRIDE FINAL;
- virtual void mediaPlayerSizeChanged() OVERRIDE FINAL;
- virtual void mediaPlayerSetWebLayer(blink::WebLayer*) OVERRIDE FINAL;
- virtual void mediaPlayerMediaSourceOpened(blink::WebMediaSource*) OVERRIDE FINAL;
+ void setNetworkState(blink::WebMediaPlayer::NetworkState);
+
+ virtual void mediaPlayerNetworkStateChanged() override final;
+ virtual void mediaPlayerReadyStateChanged() override final;
+ virtual void mediaPlayerTimeChanged() override final;
+ virtual void mediaPlayerDurationChanged() override final;
+ virtual void mediaPlayerPlaybackStateChanged() override final;
+ virtual void mediaPlayerRequestFullscreen() override final;
+ virtual void mediaPlayerRequestSeek(double) override final;
+ virtual void mediaPlayerRepaint() override final;
+ virtual void mediaPlayerSizeChanged() override final;
+ virtual void mediaPlayerSetWebLayer(blink::WebLayer*) override final;
+ virtual void mediaPlayerMediaSourceOpened(blink::WebMediaSource*) override final;
void loadTimerFired(Timer<HTMLMediaElement>*);
void progressEventTimerFired(Timer<HTMLMediaElement>*);
void startProgressEventTimer();
void stopPeriodicTimers();
- void seek(double time, ExceptionState&);
+ void seek(double time);
void finishSeek();
void checkIfSeekNeeded();
void addPlayedRange(double start, double end);
KURL selectNextSourceChild(ContentType*, String* keySystem, InvalidURLAction);
- void mediaLoadingFailed(MediaPlayer::NetworkState);
+ void mediaLoadingFailed(blink::WebMediaPlayer::NetworkState);
// deferred loading (preload=none)
bool loadIsDeferred() const;
// This does not check user gesture restrictions.
void playInternal();
+ void gesturelessInitialPlayHalted();
+ void autoplayMediaEncountered();
void allowVideoRendering();
void updateVolume();
bool stoppedDueToErrors() const;
bool couldPlayIfEnoughData() const;
- // Pauses playback without changing any states or generating events
- void setPausedInternal(bool);
-
void setShouldDelayLoadEvent(bool);
void invalidateCachedTime();
void refreshCachedTime() const;
bool createMediaControls();
void configureMediaControls();
- void prepareMediaFragmentURI();
- void applyMediaFragmentURI();
-
- virtual void* preDispatchEventHandler(Event*) OVERRIDE FINAL;
+ virtual void* preDispatchEventHandler(Event*) override final;
void changeNetworkStateFromLoadingToIdle();
Timer<HTMLMediaElement> m_progressEventTimer;
Timer<HTMLMediaElement> m_playbackProgressTimer;
Timer<HTMLMediaElement> m_audioTracksTimer;
- RefPtr<TimeRanges> m_playedTimeRanges;
+ RefPtrWillBeMember<TimeRanges> m_playedTimeRanges;
OwnPtrWillBeMember<GenericEventQueue> m_asyncEventQueue;
double m_playbackRate;
// The last time a timeupdate event was sent in movie time.
double m_lastTimeUpdateEventMovieTime;
+ // The default playback start position.
+ double m_defaultPlaybackStartPosition;
+
// Loading state.
enum LoadState { WaitingForSource, LoadingFromSrcAttr, LoadingFromSourceElement };
LoadState m_loadState;
DisplayMode m_displayMode;
- RefPtr<HTMLMediaSource> m_mediaSource;
+ RefPtrWillBeMember<HTMLMediaSource> m_mediaSource;
+ // Cached time value. Only valid when ready state is HAVE_METADATA or
+ // higher, otherwise the current time is assumed to be zero.
mutable double m_cachedTime;
- mutable double m_cachedTimeWallClockUpdateTime;
- mutable double m_minimumWallClockTimeToCacheMediaTime;
- double m_fragmentStartTime;
double m_fragmentEndTime;
typedef unsigned PendingActionFlags;
// time has not changed since sending an "ended" event
bool m_sentEndEvent : 1;
- bool m_pausedInternal : 1;
-
bool m_closedCaptionsVisible : 1;
bool m_completelyLoaded : 1;
bool m_tracksAreReady : 1;
bool m_haveVisibleTextTrack : 1;
bool m_processingPreferenceChange : 1;
+ bool m_remoteRoutesAvailable : 1;
+ bool m_playingRemotely : 1;
#if ENABLE(OILPAN)
bool m_isFinalizing : 1;
+ bool m_closeMediaSourceWhenFinalizing : 1;
#endif
double m_lastTextTrackUpdateTime;
+ bool m_initialPlayWithoutUserGestures : 1;
+ bool m_autoplayMediaCounted : 1;
RefPtrWillBeMember<AudioTrackList> m_audioTracks;
RefPtrWillBeMember<VideoTrackList> m_videoTracks;
RefPtrWillBeMember<TextTrackList> m_textTracks;
- WillBeHeapVector<RefPtrWillBeMember<TextTrack> > m_textTracksWhenResourceSelectionBegan;
+ WillBeHeapVector<RefPtrWillBeMember<TextTrack>> m_textTracksWhenResourceSelectionBegan;
CueIntervalTree m_cueTree;
#if ENABLE(WEB_AUDIO)
// This is a weak reference, since m_audioSourceNode holds a reference to us.
// FIXME: Oilpan: Consider making this a strongly traced pointer with oilpan where strong cycles are not a problem.
+ GC_PLUGIN_IGNORE("http://crbug.com/404577")
RawPtrWillBeWeakMember<AudioSourceProviderClient> m_audioSourceNode;
#endif
};
#endif
-inline bool isHTMLMediaElement(const Element& element)
-{
- return isHTMLAudioElement(element) || isHTMLVideoElement(element);
-}
-
inline bool isHTMLMediaElement(const HTMLElement& element)
{
return isHTMLAudioElement(element) || isHTMLVideoElement(element);
DEFINE_HTMLELEMENT_TYPE_CASTS_WITH_FUNCTION(HTMLMediaElement);
-} //namespace
+} // namespace blink
-#endif
+#endif // HTMLMediaElement_h