Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(941)

Unified Diff: Source/core/html/AutoplayExperimentHelper.h

Issue 1179223002: Implement autoplay gesture override experiment. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Refactored into AutoplayExperimentHelper. Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..029dbe88007d2bd9991e3e888455b62b4a77caf8
--- /dev/null
+++ b/Source/core/html/AutoplayExperimentHelper.h
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2015 Google Inc. All rights reserved.
philipj_slow 2015/08/13 10:15:40 This is new code, so I think you can use the short
liberato (no reviews please) 2015/09/01 06:54:20 thanks, forgot about the short one.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef AutoplayExperimentHelper_h
+#define AutoplayExperimentHelper_h
+
+#include "platform/Timer.h"
+
+namespace blink {
philipj_slow 2015/08/13 10:15:40 Hmm, merge this into the below namespace blink blo
liberato (no reviews please) 2015/09/01 06:54:20 done.
+class Document;
+class HTMLMediaElement;
+class EventListener;
+} // namespace blink
+
+namespace blink {
+
+// 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,
+
+ // These metrics indicate "no gesture but gesture requirement was
+ // overridden by experiment". They do not include cases where no
+ // user gesture is required (!m_userGestureRequiredForPlay).
+ // Gestureless playback when media scrolled into view. We don't
philipj_slow 2015/08/13 10:15:40 I can't parse "Gestureless playback when media scr
liberato (no reviews please) 2015/09/01 06:54:20 Done.
+ // record whether it was a javascript or attribute autoplay request.
+ GesturelessPlaybackStartedByScroll = 6,
+ // Autoplay started by experiment override during initial load.
philipj_slow 2015/08/13 10:15:40 If I'm reading this right, GesturelessPlaybackStar
liberato (no reviews please) 2015/09/01 06:54:20 i renamed these. i also separated GesturelessPlay
+ GesturelessPlaybackStartedByLoad = 7,
+ // Autoplay started by experiment override in play() call.
+ GesturelessPlaybackStartedByPlayMethod = 8,
+
+ // play() failed to play due to gesture requirement.
+ PlayMethodFailed = 9,
+
+ // Some play, whether user initiated or not, started.
+ AnyPlaybackStarted = 10,
+ // Some play, whether user initiated or not, stopped.
+ AnyPlaybackStopped = 11,
+ // Some playback, whether user initiated or not, bailed out early.
+ AnyPlaybackBailout = 12,
+
+ // This enum value must be last.
+ NumberOfAutoplayMetrics,
+};
+
+class AutoplayExperimentHelper {
+public:
+ AutoplayExperimentHelper(HTMLMediaElement&);
+ ~AutoplayExperimentHelper();
+
+ void onReadyToPlay();
philipj_slow 2015/08/13 10:15:40 The name had me thinking it was a callback based o
liberato (no reviews please) 2015/09/01 06:54:20 Done.
+ void onPlayMethodCalled();
+ void onPauseMethodCalled();
+ void onMuteChanged();
+
+private:
+ // Install an event listener to check for changes in visibility. If a
+ // listener is already installed, then this does nothing.
+ void installEventListenerIfNeeded();
+
+ // Remove any event listener. It's okay to call this if one isn't
+ // installed already.
+ void clearEventListenerIfNeeded();
+
+ // 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;
+
+ // Return true if and only if the player is visible.
+ bool isInViewportIfNeeded();
+
+ // Set the mute flag on the media if we're in an experiment mode that
philipj_slow 2015/08/13 10:15:40 s/mute/muted/
liberato (no reviews please) 2015/09/01 06:54:20 Done.
+ // 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);
+
+ // Begin (or start over) a periodic check for visibility. We will poll
+ // during this check to see if the video is in the viewport.
+ void notifyScrolled();
+
+ // Process a timer for checking visibility.
+ void viewportTimerFired(Timer<AutoplayExperimentHelper>*);
+
+ // Return our media player's document.
philipj_slow 2015/08/13 10:15:40 s/player/element/
liberato (no reviews please) 2015/09/01 06:54:20 Done.
+ Document& document() const;
+
+private:
+ HTMLMediaElement& m_element;
+
+ enum AutoplayExperimentMode {
+ ExperimentOff = 0,
+ ExperimentEnabled = 1 << 0,
+ ExperimentIfViewport = 1 << 1,
+ ExperimentIfMuted = 1 << 2,
+ ExperimentIfMobile = 1 << 3,
+ ExperimentPlayMuted = 1 << 4
+ };
+ int m_mode; // Bitwise-or of AutoplayExperimentMode
+
+ // Autoplay experiment state.
+ // True if we've received a play() without a pause().
+ bool m_playPending : 1;
+
+ // Scroll listener for the autoplay experiment, to help us determine when
+ // the user has scrolled the player into the viewport.
philipj_slow 2015/08/13 10:15:40 To be pedantic, it could also be scripts driving t
liberato (no reviews please) 2015/09/01 06:54:20 listener was removed, as part of Ojan's suggested
+ class ScrollListener;
+ friend class AutoplayExperimentScrollListener;
+ RefPtrWillBeMember<EventListener> m_scrollListener;
+ Timer<AutoplayExperimentHelper> m_viewportTimer;
+};
+
+} // namespace blink
+
+#endif // AutoplayExperimentHelper_h

Powered by Google App Engine
This is Rietveld 408576698