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

Unified Diff: third_party/WebKit/Source/core/html/HTMLMediaElement.cpp

Issue 1470153004: Autoplay experiment metric fixes and additions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: cl feedback Created 5 years 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
« no previous file with comments | « third_party/WebKit/Source/core/html/HTMLMediaElement.h ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
diff --git a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
index f3c4ad3860e506678b34be4e784a8ada27ae72ed..5d6e8f79cf23bec0f9392d0d569e681ebed554ee 100644
--- a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
@@ -337,8 +337,6 @@ HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName, Document& docum
, m_remoteRoutesAvailable(false)
, m_playingRemotely(false)
, m_isFinalizing(false)
- , m_initialPlayWithoutUserGesture(false)
- , m_autoplayMediaCounted(false)
, m_inOverlayFullscreenVideo(false)
, m_audioTracks(AudioTrackList::create(*this))
, m_videoTracks(VideoTrackList::create(*this))
@@ -669,47 +667,11 @@ String HTMLMediaElement::canPlayType(const String& mimeType, const String& keySy
return canPlay;
}
-void HTMLMediaElement::recordMetricsIfPausing()
-{
- // If not playing, then nothing to record.
- // TODO(liberato): test metrics. this was m_paused.
- if (m_paused)
- return;
-
- const bool bailout = isBailout();
-
- // Record that play was paused. We don't care if it was autoplay,
- // play(), or the user manually started it.
- recordAutoplayMetric(AnyPlaybackPaused);
- if (bailout)
- recordAutoplayMetric(AnyPlaybackBailout);
-
- // If this was a gestureless play, then record that separately.
- // These cover attr and play() gestureless starts.
- if (m_initialPlayWithoutUserGesture) {
- m_initialPlayWithoutUserGesture = false;
-
- recordAutoplayMetric(AutoplayPaused);
-
- if (bailout)
- recordAutoplayMetric(AutoplayBailout);
- }
-}
-
void HTMLMediaElement::load()
{
WTF_LOG(Media, "HTMLMediaElement::load(%p)", this);
- recordMetricsIfPausing();
-
- if (UserGestureIndicator::processingUserGesture() && m_userGestureRequiredForPlay) {
- recordAutoplayMetric(AutoplayEnabledThroughLoad);
- m_userGestureRequiredForPlay = false;
- // While usergesture-initiated load()s technically count as autoplayed,
- // they don't feel like such to the users and hence we don't want to
- // count them for the purposes of metrics.
- m_autoplayMediaCounted = true;
- }
+ m_autoplayHelper.loadMethodCalled();
prepareForLoad();
loadInternal();
@@ -933,6 +895,8 @@ void HTMLMediaElement::loadResource(const KURL& url, ContentType& contentType, c
// The resource fetch algorithm
setNetworkState(NETWORK_LOADING);
+ m_autoplayHelper.loadingStarted();
+
// Set m_currentSrc *before* changing to the cache url, the fact that we are loading from the app
// cache is an internal detail not exposed through the media element API.
m_currentSrc = url;
@@ -961,7 +925,7 @@ void HTMLMediaElement::loadResource(const KURL& url, ContentType& contentType, c
if (url.protocolIs(mediaSourceBlobProtocol)) {
if (isMediaStreamURL(url.string())) {
- m_userGestureRequiredForPlay = false;
+ removeUserGestureRequirement(GesturelessPlaybackEnabledByStream);
} else {
m_mediaSource = HTMLMediaSource::lookup(url.string());
@@ -1533,20 +1497,22 @@ void HTMLMediaElement::setReadyState(ReadyState state)
bool isPotentiallyPlaying = potentiallyPlaying();
if (m_readyState == HAVE_FUTURE_DATA && oldState <= HAVE_CURRENT_DATA && tracksAreReady) {
scheduleEvent(EventTypeNames::canplay);
- if (isPotentiallyPlaying)
+ if (isPotentiallyPlaying) {
philipj_slow 2015/12/02 09:01:46 Some extra {} here and elsewhere.
liberato (no reviews please) 2015/12/30 16:58:24 Done.
scheduleEvent(EventTypeNames::playing);
+ }
shouldUpdateDisplayState = true;
}
if (m_readyState == HAVE_ENOUGH_DATA && oldState < HAVE_ENOUGH_DATA && tracksAreReady) {
if (oldState <= HAVE_CURRENT_DATA) {
scheduleEvent(EventTypeNames::canplay);
- if (isPotentiallyPlaying)
+ if (isPotentiallyPlaying) {
scheduleEvent(EventTypeNames::playing);
+ }
}
// Check for autoplay, and record metrics about it if needed.
- if (shouldAutoplay(RecordMetricsBehavior::DoRecord)) {
+ if (shouldAutoplay(RecordMetricsBehavior::RecordOnSandboxFailure)) {
// If the autoplay experiment says that it's okay to play now,
// then don't require a user gesture.
m_autoplayHelper.becameReadyToPlay();
@@ -1687,7 +1653,7 @@ void HTMLMediaElement::seek(double time)
// 11 - Set the current playback position to the given new playback position.
webMediaPlayer()->seek(time);
- m_initialPlayWithoutUserGesture = false;
+ m_autoplayHelper.initialPlayWithUserGesture();
philipj_slow 2015/12/02 09:01:46 This is the seek method, can you remind me why `m_
liberato (no reviews please) 2015/12/30 16:58:24 i'm not sure either. i think that was left over i
// 14-17 are handled, if necessary, when the engine signals a readystate change or otherwise
// satisfies seek completion and signals a time change.
@@ -1870,12 +1836,10 @@ bool HTMLMediaElement::autoplay() const
bool HTMLMediaElement::shouldAutoplay(const RecordMetricsBehavior recordMetrics)
{
if (m_autoplaying && m_paused && autoplay()) {
- if (recordMetrics == RecordMetricsBehavior::DoRecord)
- autoplayMediaEncountered();
-
if (document().isSandboxed(SandboxAutomaticFeatures)) {
- if (recordMetrics == RecordMetricsBehavior::DoRecord)
- recordAutoplayMetric(AutoplayDisabledBySandbox);
+ if (recordMetrics == RecordMetricsBehavior::RecordOnSandboxFailure) {
+ m_autoplayHelper.recordSandboxFailure();
+ }
return false;
}
@@ -1953,8 +1917,6 @@ void HTMLMediaElement::play()
m_autoplayHelper.playMethodCalled();
if (!UserGestureIndicator::processingUserGesture()) {
- autoplayMediaEncountered();
-
if (m_userGestureRequiredForPlay) {
recordAutoplayMetric(PlayMethodFailed);
String message = ExceptionMessages::failedToExecute("play", "HTMLMediaElement", "API can only be initiated by a user gesture.");
@@ -1962,9 +1924,7 @@ void HTMLMediaElement::play()
return;
}
} else if (m_userGestureRequiredForPlay) {
philipj_slow 2015/12/02 09:01:46 You could now make this a plain else branch, since
liberato (no reviews please) 2015/12/30 16:58:24 Done.
- if (m_autoplayMediaCounted)
- recordAutoplayMetric(AutoplayManualStart);
- m_userGestureRequiredForPlay = false;
+ removeUserGestureRequirement(GesturelessPlaybackEnabledByPlayMethod);
}
playInternal();
@@ -1994,31 +1954,10 @@ void HTMLMediaElement::playInternal()
else if (m_readyState >= HAVE_FUTURE_DATA)
scheduleEvent(EventTypeNames::playing);
}
- m_autoplaying = false;
philipj_slow 2015/12/02 09:01:46 Did this spill over from the other CL, or did you
liberato (no reviews please) 2015/12/30 16:58:24 spilled over, fixed.
updatePlayState();
}
-void HTMLMediaElement::autoplayMediaEncountered()
-{
- if (!m_autoplayMediaCounted) {
- m_autoplayMediaCounted = true;
- recordAutoplayMetric(AutoplayMediaFound);
-
- if (!m_userGestureRequiredForPlay)
- m_initialPlayWithoutUserGesture = true;
- }
-}
-
-bool HTMLMediaElement::isBailout() const
-{
- // We count the user as having bailed-out on the video if they watched
- // less than one minute and less than 50% of it.
- const double playedTime = currentTime();
- const double progress = playedTime / duration();
- return (playedTime < 60) && (progress < 0.5);
-}
-
void HTMLMediaElement::pause()
{
WTF_LOG(Media, "HTMLMediaElement::pause(%p)", this);
@@ -2031,8 +1970,6 @@ void HTMLMediaElement::pause()
m_autoplaying = false;
if (!m_paused) {
- recordMetricsIfPausing();
-
m_paused = true;
scheduleTimeupdateEvent(false);
scheduleEvent(EventTypeNames::pause);
@@ -2724,6 +2661,7 @@ void HTMLMediaElement::timeChanged()
// forwards, and paused is false,
if (!m_paused) {
// changes paused to true and fires a simple event named pause at the media element.
+ m_autoplayHelper.playbackEnded();
m_paused = true;
scheduleEvent(EventTypeNames::pause);
}
@@ -2732,7 +2670,6 @@ void HTMLMediaElement::timeChanged()
m_sentEndEvent = true;
scheduleEvent(EventTypeNames::ended);
}
- recordMetricsIfPausing();
}
} else {
m_sentEndEvent = false;
@@ -2939,17 +2876,18 @@ void HTMLMediaElement::updatePlayState()
webMediaPlayer()->setRate(playbackRate());
updateVolume();
webMediaPlayer()->play();
+ m_autoplayHelper.playbackStarted();
}
if (mediaControls())
mediaControls()->playbackStarted();
startPlaybackProgressTimer();
m_playing = true;
- recordAutoplayMetric(AnyPlaybackStarted);
} else { // Should not be playing right now
if (isPlaying)
webMediaPlayer()->pause();
+
refreshCachedTime();
m_playbackProgressTimer.stop();
@@ -3065,8 +3003,6 @@ void HTMLMediaElement::stop()
{
WTF_LOG(Media, "HTMLMediaElement::stop(%p)", this);
- recordMetricsIfPausing();
-
// Close the async event queue so that no events are enqueued by userCancelledLoad.
cancelPendingEventsAndCallbacks();
m_asyncEventQueue->close();
@@ -3575,14 +3511,12 @@ bool HTMLMediaElement::isUserGestureRequiredForPlay() const
return m_userGestureRequiredForPlay;
}
-void HTMLMediaElement::removeUserGestureRequirement()
+void HTMLMediaElement::removeUserGestureRequirement(AutoplayMetrics deferredMetric)
{
- m_userGestureRequiredForPlay = false;
-}
-
-void HTMLMediaElement::setInitialPlayWithoutUserGestures(bool value)
-{
- m_initialPlayWithoutUserGesture = value;
+ if (m_userGestureRequiredForPlay) {
+ m_userGestureRequiredForPlay = false;
+ m_autoplayHelper.setGestureRemovalReason(deferredMetric);
+ }
}
void HTMLMediaElement::setNetworkState(NetworkState state)
« no previous file with comments | « third_party/WebKit/Source/core/html/HTMLMediaElement.h ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698