Chromium Code Reviews| 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) |