MediaElementSession.h [plain text]
#ifndef MediaElementSession_h
#define MediaElementSession_h
#if ENABLE(VIDEO)
#include "MediaPlayer.h"
#include "PlatformMediaSession.h"
#include "Timer.h"
namespace WebCore {
class Document;
class HTMLMediaElement;
class SourceBuffer;
class MediaElementSession final : public PlatformMediaSession {
WTF_MAKE_FAST_ALLOCATED;
public:
explicit MediaElementSession(PlatformMediaSessionClient&);
virtual ~MediaElementSession() { }
void registerWithDocument(Document&);
void unregisterWithDocument(Document&);
bool playbackPermitted(const HTMLMediaElement&) const;
bool dataLoadingPermitted(const HTMLMediaElement&) const;
bool fullscreenPermitted(const HTMLMediaElement&) const;
bool pageAllowsDataLoading(const HTMLMediaElement&) const;
bool pageAllowsPlaybackAfterResuming(const HTMLMediaElement&) const;
#if ENABLE(WIRELESS_PLAYBACK_TARGET)
void showPlaybackTargetPicker(const HTMLMediaElement&);
bool hasWirelessPlaybackTargets(const HTMLMediaElement&) const;
bool wirelessVideoPlaybackDisabled(const HTMLMediaElement&) const;
void setWirelessVideoPlaybackDisabled(const HTMLMediaElement&, bool);
void setHasPlaybackTargetAvailabilityListeners(const HTMLMediaElement&, bool);
virtual bool canPlayToWirelessPlaybackTarget() const override;
virtual bool isPlayingToWirelessPlaybackTarget() const override;
void mediaStateDidChange(const HTMLMediaElement&, MediaProducer::MediaStateFlags);
#endif
bool requiresFullscreenForVideoPlayback(const HTMLMediaElement&) const;
WEBCORE_EXPORT bool allowsPictureInPicture(const HTMLMediaElement&) const;
MediaPlayer::Preload effectivePreloadForElement(const HTMLMediaElement&) const;
bool allowsAutomaticMediaDataLoading(const HTMLMediaElement&) const;
void mediaEngineUpdated(const HTMLMediaElement&);
enum BehaviorRestrictionFlags {
NoRestrictions = 0,
RequireUserGestureForLoad = 1 << 0,
RequireUserGestureForRateChange = 1 << 1,
RequireUserGestureForFullscreen = 1 << 2,
RequirePageConsentToLoadMedia = 1 << 3,
RequirePageConsentToResumeMedia = 1 << 4,
RequireUserGestureForAudioRateChange = 1 << 5,
#if ENABLE(WIRELESS_PLAYBACK_TARGET)
RequireUserGestureToShowPlaybackTargetPicker = 1 << 6,
WirelessVideoPlaybackDisabled = 1 << 7,
RequireUserGestureToAutoplayToExternalDevice = 1 << 8,
#endif
};
typedef unsigned BehaviorRestrictions;
WEBCORE_EXPORT BehaviorRestrictions behaviorRestrictions() const { return m_restrictions; }
WEBCORE_EXPORT void addBehaviorRestriction(BehaviorRestrictions);
WEBCORE_EXPORT void removeBehaviorRestriction(BehaviorRestrictions);
bool hasBehaviorRestriction(BehaviorRestrictions restriction) const { return restriction & m_restrictions; }
#if ENABLE(MEDIA_SOURCE)
size_t maximumMediaSourceBufferSize(const SourceBuffer&) const;
#endif
private:
#if ENABLE(WIRELESS_PLAYBACK_TARGET)
void targetAvailabilityChangedTimerFired();
virtual void setPlaybackTarget(Ref<MediaPlaybackTarget>&&) override;
virtual void externalOutputDeviceAvailableDidChange(bool) override;
virtual void setShouldPlayToPlaybackTarget(bool) override;
#endif
#if PLATFORM(IOS)
bool requiresPlaybackTargetRouteMonitoring() const override;
#endif
BehaviorRestrictions m_restrictions;
#if ENABLE(WIRELESS_PLAYBACK_TARGET)
mutable Timer m_targetAvailabilityChangedTimer;
RefPtr<MediaPlaybackTarget> m_playbackTarget;
bool m_shouldPlayToPlaybackTarget { false };
mutable bool m_hasPlaybackTargets { false };
#endif
#if PLATFORM(IOS)
bool m_hasPlaybackTargetAvailabilityListeners { false };
#endif
};
}
#endif // MediaElementSession_h
#endif // ENABLE(VIDEO)