| Index: Source/core/html/HTMLMediaElement.h
|
| diff --git a/Source/core/html/HTMLMediaElement.h b/Source/core/html/HTMLMediaElement.h
|
| index 2bb0dd6888960b964924babfdecd28d794934ca2..edfc9d8701301a22bccbbc9785a1b4f866c9318c 100644
|
| --- a/Source/core/html/HTMLMediaElement.h
|
| +++ b/Source/core/html/HTMLMediaElement.h
|
| @@ -287,6 +287,35 @@ protected:
|
| void setControllerInternal(MediaController*);
|
|
|
| private:
|
| + // These values are used for a histogram. Do not reorder.
|
| + enum AutoplayMetrics {
|
| + // Media element with autoplay seen.
|
| + AutoplayMediaFound = 0,
|
| + // Autoplay enabled and user stopped media play at any point.
|
| + AutoplayStopped = 1,
|
| + // Autoplay enabled but user bailed out on media play early.
|
| + AutoplayBailout = 2,
|
| + // Autoplay disabled but user manually started media.
|
| + AutoplayManualStart = 3,
|
| + // Autoplay was (re)enabled through a user-gesture triggered load()
|
| + AutoplayEnabledThroughLoad = 4,
|
| + // Autoplay disabled by sandbox flags.
|
| + AutoplayDisabledBySandbox = 5,
|
| + // AutoplayStopped for a media play that was started by the experiment.
|
| + AutoplayExperimentStopped = 6,
|
| + // AutoplayBailout for media a play that was started by the experiment.
|
| + AutoplayExperimentBailout = 7,
|
| + // Autoplay started by experiment when media scrolled into view. We don't
|
| + // record whether it was a javascript or attribute autoplay request.
|
| + AutoplayExperimentStartedByScroll = 8,
|
| + // Autoplay started by experiment during initial load.
|
| + AutoplayExperimentStartedByLoad = 9,
|
| + // Autoplay started by experiment in play() call.
|
| + AutoplayExperimentStartedByPlay = 10,
|
| + // This enum value must be last.
|
| + NumberOfAutoplayMetrics,
|
| + };
|
| +
|
| void resetMediaPlayerAndMediaSource();
|
|
|
| bool alwaysCreateUserAgentShadowRoot() const final { return true; }
|
| @@ -427,6 +456,47 @@ private:
|
| bool isBlockedOnMediaController() const;
|
| bool isAutoplaying() const { return m_autoplaying; }
|
|
|
| + void recordAutoplayMetric(AutoplayMetrics);
|
| +
|
| + // vvvv Helpers for clank autoplay investigation vvvv
|
| +
|
| + // Install an event listener to check for changes in visibility. If a
|
| + // listener is already installed, then this does nothing.
|
| + void autoplayExperimentInstallEventListenerIfNeeded();
|
| +
|
| + // Remove any event listener. It's okay to call this if one isn't
|
| + // installed already.
|
| + void autoplayExperimentClearEventListenerIfNeeded();
|
| +
|
| + // Return true if any only if this player meets (most) of the eligibility
|
| + // requirements for the experiment to override the need for a user
|
| + // gesture. This includes everything except the visibility test.
|
| + bool autoplayExperimentIsEligible() const;
|
| +
|
| + // Return true if and only if the player is visible.
|
| + bool autoplayExperimentIsVisible();
|
| +
|
| + // Set the mute flag on the media if we're in an experiment mode that
|
| + // requires it, else do nothing.
|
| + void autoplayExperimentMuteIfNeeded();
|
| +
|
| + // Maybe override the requirement for a user gesture, and start playing
|
| + // autoplay media. Returns true if only if it starts playback.
|
| + bool autoplayExperimentMaybeStartPlaying();
|
| +
|
| + // Configure internal state to record that the autoplay experiment is
|
| + // going to start playback. This doesn't actually start playback, since
|
| + // there are several different cases.
|
| + void autoplayExperimentPrepareToPlay(AutoplayMetrics);
|
| +
|
| + // Begin (or start over) a periodic check for visibility. We will poll
|
| + // during this check to see if the video is in view.
|
| + void beginPeriodicVisibilityCheck();
|
| +
|
| + // Process a timer for checking visibility.
|
| + void visibilityTimerFired(Timer<HTMLMediaElement>*);
|
| + // ^^^^ Helpers for clank autoplay investigation ^^^^
|
| +
|
| WebMediaPlayer::CORSMode corsMode() const;
|
|
|
| // Returns the "direction of playback" value as specified in the HTML5 spec.
|
| @@ -550,6 +620,29 @@ private:
|
| bool m_initialPlayWithoutUserGestures : 1;
|
| bool m_autoplayMediaCounted : 1;
|
|
|
| + // Autoplay experiment state.
|
| + // True if we've received a play() without a pause().
|
| + bool m_autoplayExperimentPlayPending : 1;
|
| +
|
| + // Autoplay experiment state.
|
| + // True if and only if we initiated playback because of the autoplay
|
| + // experiment. Once set, this is never unset.
|
| + bool m_autoplayExperimentStartedByExperiment : 1;
|
| +
|
| + // Autoplay experiment state.
|
| + // Touch listener for the autoplay experiment.
|
| + class AutoplayExperimentTouchListener;
|
| + friend class AutoplayExperimentTouchListener;
|
| + RefPtrWillBeMember<EventListener> m_autoplayExperimentTouchListener;
|
| +
|
| + enum AutoplayExperimentMode {
|
| + ExperimentOff,
|
| + ExperimentAlways,
|
| + ExperimentIfMuted,
|
| + ExperimentPlayMuted
|
| + };
|
| + AutoplayExperimentMode m_autoplayExperimentMode;
|
| +
|
| RefPtrWillBeMember<AudioTrackList> m_audioTracks;
|
| RefPtrWillBeMember<VideoTrackList> m_videoTracks;
|
| RefPtrWillBeMember<TextTrackList> m_textTracks;
|
| @@ -613,6 +706,11 @@ private:
|
| AudioSourceProviderImpl m_audioSourceProvider;
|
| #endif
|
|
|
| + Timer<HTMLMediaElement> m_autoplayVisibilityTimer;
|
| + double m_autoplayLastScrollX;
|
| + double m_autoplayLastScrollY;
|
| + double m_autoplayVisibilityTimerSpan;
|
| +
|
| friend class MediaController;
|
| PersistentWillBeMember<MediaController> m_mediaController;
|
|
|
|
|