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

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

Issue 2524443002: Adding Rappor metrics for disabling cross-origin autoplay with sound experiment (Closed)
Patch Set: s/CrossOriginExperiment/CrossOrigin Created 4 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
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 f8d3bfc94308a85f3f12c0e604d1c97baa06ad1d..17275228b0924dd208e874671d6a1c1e739141e8 100644
--- a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
@@ -394,6 +394,7 @@ HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName,
m_fragmentEndTime(std::numeric_limits<double>::quiet_NaN()),
m_pendingActionFlags(0),
m_lockedPendingUserGesture(false),
+ m_lockedPendingUserGestureIfCrossOriginExperimentEnabled(true),
m_playing(false),
m_shouldDelayLoadEvent(false),
m_haveFiredLoadedData(false),
@@ -422,6 +423,8 @@ HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName,
BLINK_MEDIA_LOG << "HTMLMediaElement(" << (void*)this << ")";
m_lockedPendingUserGesture = computeLockedPendingUserGesture(document);
+ m_lockedPendingUserGestureIfCrossOriginExperimentEnabled =
+ isDocumentCrossOrigin(document);
LocalFrame* frame = document.frame();
if (frame) {
@@ -468,9 +471,8 @@ void HTMLMediaElement::didMoveToNewDocument(Document& oldDocument) {
computeLockedPendingUserGesture(oldDocument);
bool newDocumentRequiresUserGesture =
computeLockedPendingUserGesture(document());
- if (newDocumentRequiresUserGesture && !oldDocumentRequiresUserGesture) {
+ if (newDocumentRequiresUserGesture && !oldDocumentRequiresUserGesture)
m_lockedPendingUserGesture = true;
- }
if (m_shouldDelayLoadEvent) {
document().incrementLoadEventDelayCount();
@@ -483,6 +485,9 @@ void HTMLMediaElement::didMoveToNewDocument(Document& oldDocument) {
oldDocument.incrementLoadEventDelayCount();
}
+ if (isDocumentCrossOrigin(document()) && !isDocumentCrossOrigin(oldDocument))
+ m_lockedPendingUserGestureIfCrossOriginExperimentEnabled = true;
+
removeElementFromDocumentMap(this, &oldDocument);
addElementToDocumentMap(this, &document());
@@ -1330,6 +1335,10 @@ bool HTMLMediaElement::isMediaDataCORSSameOrigin(SecurityOrigin* origin) const {
!origin->taintsCanvas(currentSrc()));
}
+bool HTMLMediaElement::isInCrossOriginFrame() const {
+ return isDocumentCrossOrigin(document());
+}
+
void HTMLMediaElement::startProgressEventTimer() {
if (m_progressEventTimer.isActive())
return;
@@ -1691,6 +1700,13 @@ void HTMLMediaElement::setReadyState(ReadyState state) {
m_autoplayUmaHelper->onAutoplayInitiated(AutoplaySource::Attribute);
if (!isGestureNeededForPlayback()) {
+ if (isGestureNeededForPlaybackIfCrossOriginExperimentEnabled()) {
+ m_autoplayUmaHelper->recordCrossOriginAutoplayResult(
+ CrossOriginAutoplayResult::AutoplayBlocked);
+ } else {
+ m_autoplayUmaHelper->recordCrossOriginAutoplayResult(
+ CrossOriginAutoplayResult::AutoplayAllowed);
+ }
if (isHTMLVideoElement() && muted() &&
RuntimeEnabledFeatures::autoplayMutedVideosEnabled()) {
// We might end up in a situation where the previous
@@ -1709,6 +1725,9 @@ void HTMLMediaElement::setReadyState(ReadyState state) {
scheduleNotifyPlaying();
m_autoplaying = false;
}
+ } else {
+ m_autoplayUmaHelper->recordCrossOriginAutoplayResult(
+ CrossOriginAutoplayResult::AutoplayBlocked);
}
}
@@ -2185,14 +2204,26 @@ Nullable<ExceptionCode> HTMLMediaElement::play() {
return nullptr;
}
+ m_autoplayUmaHelper->recordCrossOriginAutoplayResult(
+ CrossOriginAutoplayResult::AutoplayBlocked);
String message = ExceptionMessages::failedToExecute(
"play", "HTMLMediaElement",
"API can only be initiated by a user gesture.");
document().addConsoleMessage(ConsoleMessage::create(
JSMessageSource, WarningMessageLevel, message));
return NotAllowedError;
+ } else {
+ if (isGestureNeededForPlaybackIfCrossOriginExperimentEnabled()) {
+ m_autoplayUmaHelper->recordCrossOriginAutoplayResult(
+ CrossOriginAutoplayResult::AutoplayBlocked);
+ } else {
+ m_autoplayUmaHelper->recordCrossOriginAutoplayResult(
+ CrossOriginAutoplayResult::AutoplayAllowed);
+ }
}
} else {
+ m_autoplayUmaHelper->recordCrossOriginAutoplayResult(
+ CrossOriginAutoplayResult::PlayedWithGesture);
UserGestureIndicator::utilizeUserGesture();
unlockUserGesture();
}
@@ -3786,6 +3817,7 @@ bool HTMLMediaElement::isLockedPendingUserGesture() const {
void HTMLMediaElement::unlockUserGesture() {
m_lockedPendingUserGesture = false;
+ m_lockedPendingUserGestureIfCrossOriginExperimentEnabled = false;
}
bool HTMLMediaElement::isGestureNeededForPlayback() const {
@@ -3812,6 +3844,31 @@ bool HTMLMediaElement::isGestureNeededForPlayback() const {
return true;
}
+bool HTMLMediaElement::
+ isGestureNeededForPlaybackIfCrossOriginExperimentEnabled() const {
+ if (!m_lockedPendingUserGestureIfCrossOriginExperimentEnabled)
+ return false;
+
+ if (loadType() == WebMediaPlayer::LoadTypeMediaStream)
+ return false;
mlamouri (slow - plz ping) 2016/12/08 17:17:06 What's that for?
Zhiqiang Zhang (Slow) 2016/12/08 17:35:29 This mostly copied from isGestureNeededForPlayback
+
+ // We want to allow muted video to autoplay if:
+ // - the flag is enabled;
+ // - Data Saver is not enabled;
+ // - Preload was not disabled (low end devices);
+ // - Autoplay is enabled in settings;
+ if (isHTMLVideoElement() && muted() &&
+ RuntimeEnabledFeatures::autoplayMutedVideosEnabled() &&
+ !(document().settings() && document().settings()->dataSaverEnabled()) &&
+ !(document().settings() &&
+ document().settings()->forcePreloadNoneForMediaElements()) &&
+ isAutoplayAllowedPerSettings()) {
+ return false;
+ }
+
+ return true;
+}
+
bool HTMLMediaElement::isAutoplayAllowedPerSettings() const {
LocalFrame* frame = document().frame();
if (!frame)

Powered by Google App Engine
This is Rietveld 408576698