| Index: Source/core/html/AutoplayExperimentHelper.h
|
| diff --git a/Source/core/html/AutoplayExperimentHelper.h b/Source/core/html/AutoplayExperimentHelper.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c9d015f062bce1126923f2ec3613ad7067c92219
|
| --- /dev/null
|
| +++ b/Source/core/html/AutoplayExperimentHelper.h
|
| @@ -0,0 +1,123 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef AutoplayExperimentHelper_h
|
| +#define AutoplayExperimentHelper_h
|
| +
|
| +#include "core/html/AutoplayExperimentConfig.h"
|
| +#include "core/page/Page.h"
|
| +#include "platform/Timer.h"
|
| +#include "platform/geometry/IntRect.h"
|
| +
|
| +namespace blink {
|
| +class Document;
|
| +class HTMLMediaElement;
|
| +class EventListener;
|
| +
|
| +// 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.
|
| + AutoplayPaused = 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,
|
| +
|
| + // These metrics indicate "no gesture detected, but the gesture
|
| + // requirement was overridden by experiment". They do not include cases
|
| + // where no user gesture is required (!m_userGestureRequiredForPlay).
|
| +
|
| + // User gesture requirement was bypassed, and playback started, during
|
| + // initial load via the autoplay flag. If playback was deferred due to
|
| + // visibility requirements, then this does not apply.
|
| + GesturelessPlaybackStartedByAutoplayFlagImmediately = 6,
|
| +
|
| + // User gesture requirement was bypassed, and playback started, when
|
| + // the play() method was called. If playback is deferred due to
|
| + // visibility requirements, then this does not apply.
|
| + GesturelessPlaybackStartedByPlayMethodImmediately = 7,
|
| +
|
| + // User gesture requirement was bypassed, and playback started, after
|
| + // an element with the autoplay flag moved into the viewport. Playback
|
| + // was deferred earlier due to visibility requirements.
|
| + GesturelessPlaybackStartedByAutoplayFlagAfterScroll = 8,
|
| +
|
| + // User gesture requirement was bypassed, and playback started, after
|
| + // an element on which the play() method was called was moved into the
|
| + // viewport. Playback had been deferred due to visibility requirements.
|
| + GesturelessPlaybackStartedByPlayMethodAfterScroll = 9,
|
| +
|
| + // play() failed to play due to gesture requirement.
|
| + PlayMethodFailed = 10,
|
| +
|
| + // Some play, whether user initiated or not, started.
|
| + AnyPlaybackStarted = 11,
|
| + // Some play, whether user initiated or not, paused.
|
| + AnyPlaybackPaused = 12,
|
| + // Some playback, whether user initiated or not, bailed out early.
|
| + AnyPlaybackBailout = 13,
|
| +
|
| + // This enum value must be last.
|
| + NumberOfAutoplayMetrics,
|
| +};
|
| +
|
| +class AutoplayExperimentHelper {
|
| +public:
|
| + AutoplayExperimentHelper(HTMLMediaElement&);
|
| + ~AutoplayExperimentHelper();
|
| +
|
| + void becameReadyToPlay();
|
| + void playMethodCalled();
|
| + void pauseMethodCalled();
|
| + void mutedChanged();
|
| + void positionChanged();
|
| +
|
| +private:
|
| + // 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 isEligible() const;
|
| +
|
| + // Set the muted flag on the media if we're in an experiment mode that
|
| + // requires it, else do nothing.
|
| + void muteIfNeeded();
|
| +
|
| + // Maybe override the requirement for a user gesture, and start playing
|
| + // autoplay media. Returns true if only if it starts playback.
|
| + bool maybeStartPlaying();
|
| +
|
| + // 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 prepareToPlay(AutoplayMetrics);
|
| +
|
| + // Return our media element's document.
|
| + Document& document() const;
|
| +
|
| + inline bool enabled(AutoplayExperimentConfig::Mode mode) const
|
| + {
|
| + return ((int)m_mode) & ((int)mode);
|
| + }
|
| +
|
| +private:
|
| + HTMLMediaElement& m_element;
|
| +
|
| + AutoplayExperimentConfig::Mode m_mode;
|
| +
|
| + // Autoplay experiment state.
|
| + // True if we've received a play() without a pause().
|
| + bool m_playPending : 1;
|
| +
|
| + friend class Internals;
|
| +};
|
| +
|
| +} // namespace blink
|
| +
|
| +#endif // AutoplayExperimentHelper_h
|
|
|