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

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

Issue 2780403004: Create core/html/media/ and move auxiliary media files in it. (Closed)
Patch Set: actually add autoplay files Created 3 years, 9 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: third_party/WebKit/Source/core/html/AutoplayUmaHelper.cpp
diff --git a/third_party/WebKit/Source/core/html/AutoplayUmaHelper.cpp b/third_party/WebKit/Source/core/html/AutoplayUmaHelper.cpp
deleted file mode 100644
index 8c936f50d2e747dd554c18f81614491bbf226a39..0000000000000000000000000000000000000000
--- a/third_party/WebKit/Source/core/html/AutoplayUmaHelper.cpp
+++ /dev/null
@@ -1,395 +0,0 @@
-// Copyright 2016 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.
-
-#include "core/html/AutoplayUmaHelper.h"
-
-#include "core/dom/Document.h"
-#include "core/dom/ElementVisibilityObserver.h"
-#include "core/events/Event.h"
-#include "core/frame/Settings.h"
-#include "core/html/HTMLMediaElement.h"
-#include "platform/Histogram.h"
-#include "public/platform/Platform.h"
-#include "wtf/CurrentTime.h"
-
-namespace blink {
-
-namespace {
-
-const int32_t maxOffscreenDurationUmaMS = 60 * 60 * 1000;
-const int32_t offscreenDurationUmaBucketCount = 50;
-
-} // namespace
-
-AutoplayUmaHelper* AutoplayUmaHelper::create(HTMLMediaElement* element) {
- return new AutoplayUmaHelper(element);
-}
-
-AutoplayUmaHelper::AutoplayUmaHelper(HTMLMediaElement* element)
- : EventListener(CPPEventListenerType),
- ContextLifecycleObserver(nullptr),
- m_element(element),
- m_mutedVideoPlayMethodVisibilityObserver(nullptr),
- m_mutedVideoAutoplayOffscreenStartTimeMS(0),
- m_mutedVideoAutoplayOffscreenDurationMS(0),
- m_isVisible(false),
- m_mutedVideoOffscreenDurationVisibilityObserver(nullptr) {}
-
-AutoplayUmaHelper::~AutoplayUmaHelper() = default;
-
-bool AutoplayUmaHelper::operator==(const EventListener& other) const {
- return this == &other;
-}
-
-void AutoplayUmaHelper::onAutoplayInitiated(AutoplaySource source) {
- DEFINE_STATIC_LOCAL(EnumerationHistogram, videoHistogram,
- ("Media.Video.Autoplay",
- static_cast<int>(AutoplaySource::NumberOfUmaSources)));
- DEFINE_STATIC_LOCAL(EnumerationHistogram, mutedVideoHistogram,
- ("Media.Video.Autoplay.Muted",
- static_cast<int>(AutoplaySource::NumberOfUmaSources)));
- DEFINE_STATIC_LOCAL(EnumerationHistogram, audioHistogram,
- ("Media.Audio.Autoplay",
- static_cast<int>(AutoplaySource::NumberOfUmaSources)));
- DEFINE_STATIC_LOCAL(
- EnumerationHistogram, blockedMutedVideoHistogram,
- ("Media.Video.Autoplay.Muted.Blocked", AutoplayBlockedReasonMax));
-
- // Autoplay already initiated
- if (m_sources.count(source))
- return;
-
- m_sources.insert(source);
-
- // Record the source.
- if (m_element->isHTMLVideoElement()) {
- videoHistogram.count(static_cast<int>(source));
- if (m_element->muted())
- mutedVideoHistogram.count(static_cast<int>(source));
- } else {
- audioHistogram.count(static_cast<int>(source));
- }
-
- // Record dual source.
- if (m_sources.size() ==
- static_cast<size_t>(AutoplaySource::NumberOfSources)) {
- if (m_element->isHTMLVideoElement()) {
- videoHistogram.count(static_cast<int>(AutoplaySource::DualSource));
- if (m_element->muted())
- mutedVideoHistogram.count(static_cast<int>(AutoplaySource::DualSource));
- } else {
- audioHistogram.count(static_cast<int>(AutoplaySource::DualSource));
- }
- }
-
- // Record the child frame and top-level frame URLs for autoplay muted videos
- // by attribute.
- if (m_element->isHTMLVideoElement() && m_element->muted()) {
- if (m_sources.size() ==
- static_cast<size_t>(AutoplaySource::NumberOfSources)) {
- Platform::current()->recordRapporURL(
- "Media.Video.Autoplay.Muted.DualSource.Frame",
- m_element->document().url());
- } else if (source == AutoplaySource::Attribute) {
- Platform::current()->recordRapporURL(
- "Media.Video.Autoplay.Muted.Attribute.Frame",
- m_element->document().url());
- } else {
- DCHECK(source == AutoplaySource::Method);
- Platform::current()->recordRapporURL(
- "Media.Video.Autoplay.Muted.PlayMethod.Frame",
- m_element->document().url());
- }
- }
-
- // Record if it will be blocked by Data Saver or Autoplay setting.
- if (m_element->isHTMLVideoElement() && m_element->muted() &&
- RuntimeEnabledFeatures::autoplayMutedVideosEnabled()) {
- bool dataSaverEnabled =
- m_element->document().settings() &&
- m_element->document().settings()->getDataSaverEnabled();
- bool blockedBySetting = !m_element->isAutoplayAllowedPerSettings();
-
- if (dataSaverEnabled && blockedBySetting) {
- blockedMutedVideoHistogram.count(
- AutoplayBlockedReasonDataSaverAndSetting);
- } else if (dataSaverEnabled) {
- blockedMutedVideoHistogram.count(AutoplayBlockedReasonDataSaver);
- } else if (blockedBySetting) {
- blockedMutedVideoHistogram.count(AutoplayBlockedReasonSetting);
- }
- }
-
- m_element->addEventListener(EventTypeNames::playing, this, false);
-}
-
-void AutoplayUmaHelper::recordCrossOriginAutoplayResult(
- CrossOriginAutoplayResult result) {
- DEFINE_STATIC_LOCAL(
- EnumerationHistogram, autoplayResultHistogram,
- ("Media.Autoplay.CrossOrigin.Result",
- static_cast<int>(CrossOriginAutoplayResult::NumberOfResults)));
-
- if (!m_element->isHTMLVideoElement())
- return;
- if (!m_element->isInCrossOriginFrame())
- return;
-
- // Record each metric only once per element, since the metric focuses on the
- // site distribution. If a page calls play() multiple times, it will be
- // recorded only once.
- if (m_recordedCrossOriginAutoplayResults.count(result))
- return;
-
- switch (result) {
- case CrossOriginAutoplayResult::AutoplayAllowed:
- // Record metric
- Platform::current()->recordRapporURL(
- "Media.Autoplay.CrossOrigin.Allowed.ChildFrame",
- m_element->document().url());
- Platform::current()->recordRapporURL(
- "Media.Autoplay.CrossOrigin.Allowed.TopLevelFrame",
- m_element->document().topDocument().url());
- autoplayResultHistogram.count(static_cast<int>(result));
- m_recordedCrossOriginAutoplayResults.insert(result);
- break;
- case CrossOriginAutoplayResult::AutoplayBlocked:
- Platform::current()->recordRapporURL(
- "Media.Autoplay.CrossOrigin.Blocked.ChildFrame",
- m_element->document().url());
- Platform::current()->recordRapporURL(
- "Media.Autoplay.CrossOrigin.Blocked.TopLevelFrame",
- m_element->document().topDocument().url());
- autoplayResultHistogram.count(static_cast<int>(result));
- m_recordedCrossOriginAutoplayResults.insert(result);
- break;
- case CrossOriginAutoplayResult::PlayedWithGesture:
- // Record this metric only when the video has been blocked from autoplay
- // previously. This is to record the sites having videos that are blocked
- // to autoplay but the user starts the playback by gesture.
- if (!m_recordedCrossOriginAutoplayResults.count(
- CrossOriginAutoplayResult::AutoplayBlocked)) {
- return;
- }
- Platform::current()->recordRapporURL(
- "Media.Autoplay.CrossOrigin.PlayedWithGestureAfterBlock.ChildFrame",
- m_element->document().url());
- Platform::current()->recordRapporURL(
- "Media.Autoplay.CrossOrigin.PlayedWithGestureAfterBlock."
- "TopLevelFrame",
- m_element->document().topDocument().url());
- autoplayResultHistogram.count(static_cast<int>(result));
- m_recordedCrossOriginAutoplayResults.insert(result);
- break;
- case CrossOriginAutoplayResult::UserPaused:
- if (!shouldRecordUserPausedAutoplayingCrossOriginVideo())
- return;
- if (m_element->ended() || m_element->seeking())
- return;
- Platform::current()->recordRapporURL(
- "Media.Autoplay.CrossOrigin.UserPausedAutoplayingVideo.ChildFrame",
- m_element->document().url());
- Platform::current()->recordRapporURL(
- "Media.Autoplay.CrossOrigin.UserPausedAutoplayingVideo."
- "TopLevelFrame",
- m_element->document().topDocument().url());
- autoplayResultHistogram.count(static_cast<int>(result));
- m_recordedCrossOriginAutoplayResults.insert(result);
- break;
- default:
- NOTREACHED();
- }
-}
-
-void AutoplayUmaHelper::recordAutoplayUnmuteStatus(
- AutoplayUnmuteActionStatus status) {
- DEFINE_STATIC_LOCAL(
- EnumerationHistogram, autoplayUnmuteHistogram,
- ("Media.Video.Autoplay.Muted.UnmuteAction",
- static_cast<int>(AutoplayUnmuteActionStatus::NumberOfStatus)));
-
- autoplayUnmuteHistogram.count(static_cast<int>(status));
-}
-
-void AutoplayUmaHelper::didMoveToNewDocument(Document& oldDocument) {
- if (!shouldListenToContextDestroyed())
- return;
-
- setContext(&m_element->document());
-}
-
-void AutoplayUmaHelper::onVisibilityChangedForMutedVideoPlayMethodBecomeVisible(
- bool isVisible) {
- if (!isVisible || !m_mutedVideoPlayMethodVisibilityObserver)
- return;
-
- maybeStopRecordingMutedVideoPlayMethodBecomeVisible(true);
-}
-
-void AutoplayUmaHelper::onVisibilityChangedForMutedVideoOffscreenDuration(
- bool isVisible) {
- if (isVisible == m_isVisible)
- return;
-
- if (isVisible)
- m_mutedVideoAutoplayOffscreenDurationMS +=
- static_cast<int64_t>(monotonicallyIncreasingTimeMS()) -
- m_mutedVideoAutoplayOffscreenStartTimeMS;
- else
- m_mutedVideoAutoplayOffscreenStartTimeMS =
- static_cast<int64_t>(monotonicallyIncreasingTimeMS());
-
- m_isVisible = isVisible;
-}
-
-void AutoplayUmaHelper::handleEvent(ExecutionContext* executionContext,
- Event* event) {
- if (event->type() == EventTypeNames::playing)
- handlePlayingEvent();
- else if (event->type() == EventTypeNames::pause)
- handlePauseEvent();
- else
- NOTREACHED();
-}
-
-void AutoplayUmaHelper::handlePlayingEvent() {
- maybeStartRecordingMutedVideoPlayMethodBecomeVisible();
- maybeStartRecordingMutedVideoOffscreenDuration();
-
- m_element->removeEventListener(EventTypeNames::playing, this, false);
-}
-
-void AutoplayUmaHelper::handlePauseEvent() {
- maybeStopRecordingMutedVideoOffscreenDuration();
- maybeRecordUserPausedAutoplayingCrossOriginVideo();
-}
-
-void AutoplayUmaHelper::contextDestroyed(ExecutionContext*) {
- handleContextDestroyed();
-}
-
-void AutoplayUmaHelper::handleContextDestroyed() {
- maybeStopRecordingMutedVideoPlayMethodBecomeVisible(false);
- maybeStopRecordingMutedVideoOffscreenDuration();
-}
-
-void AutoplayUmaHelper::maybeStartRecordingMutedVideoPlayMethodBecomeVisible() {
- if (!m_sources.count(AutoplaySource::Method) ||
- !m_element->isHTMLVideoElement() || !m_element->muted())
- return;
-
- m_mutedVideoPlayMethodVisibilityObserver = new ElementVisibilityObserver(
- m_element,
- WTF::bind(&AutoplayUmaHelper::
- onVisibilityChangedForMutedVideoPlayMethodBecomeVisible,
- wrapWeakPersistent(this)));
- m_mutedVideoPlayMethodVisibilityObserver->start();
- setContext(&m_element->document());
-}
-
-void AutoplayUmaHelper::maybeStopRecordingMutedVideoPlayMethodBecomeVisible(
- bool visible) {
- if (!m_mutedVideoPlayMethodVisibilityObserver)
- return;
-
- DEFINE_STATIC_LOCAL(BooleanHistogram, histogram,
- ("Media.Video.Autoplay.Muted.PlayMethod.BecomesVisible"));
-
- histogram.count(visible);
- m_mutedVideoPlayMethodVisibilityObserver->stop();
- m_mutedVideoPlayMethodVisibilityObserver = nullptr;
- maybeUnregisterContextDestroyedObserver();
-}
-
-void AutoplayUmaHelper::maybeStartRecordingMutedVideoOffscreenDuration() {
- if (!m_element->isHTMLVideoElement() || !m_element->muted() ||
- !m_sources.count(AutoplaySource::Method))
- return;
-
- // Start recording muted video playing offscreen duration.
- m_mutedVideoAutoplayOffscreenStartTimeMS =
- static_cast<int64_t>(monotonicallyIncreasingTimeMS());
- m_isVisible = false;
- m_mutedVideoOffscreenDurationVisibilityObserver =
- new ElementVisibilityObserver(
- m_element,
- WTF::bind(&AutoplayUmaHelper::
- onVisibilityChangedForMutedVideoOffscreenDuration,
- wrapWeakPersistent(this)));
- m_mutedVideoOffscreenDurationVisibilityObserver->start();
- m_element->addEventListener(EventTypeNames::pause, this, false);
- setContext(&m_element->document());
-}
-
-void AutoplayUmaHelper::maybeStopRecordingMutedVideoOffscreenDuration() {
- if (!m_mutedVideoOffscreenDurationVisibilityObserver)
- return;
-
- if (!m_isVisible)
- m_mutedVideoAutoplayOffscreenDurationMS +=
- static_cast<int64_t>(monotonicallyIncreasingTimeMS()) -
- m_mutedVideoAutoplayOffscreenStartTimeMS;
-
- // Since histograms uses int32_t, the duration needs to be limited to
- // std::numeric_limits<int32_t>::max().
- int32_t boundedTime = static_cast<int32_t>(
- std::min<int64_t>(m_mutedVideoAutoplayOffscreenDurationMS,
- std::numeric_limits<int32_t>::max()));
-
- DCHECK(m_sources.count(AutoplaySource::Method));
-
- DEFINE_STATIC_LOCAL(
- CustomCountHistogram, durationHistogram,
- ("Media.Video.Autoplay.Muted.PlayMethod.OffscreenDuration", 1,
- maxOffscreenDurationUmaMS, offscreenDurationUmaBucketCount));
- durationHistogram.count(boundedTime);
-
- m_mutedVideoOffscreenDurationVisibilityObserver->stop();
- m_mutedVideoOffscreenDurationVisibilityObserver = nullptr;
- m_mutedVideoAutoplayOffscreenDurationMS = 0;
- maybeUnregisterMediaElementPauseListener();
- maybeUnregisterContextDestroyedObserver();
-}
-
-void AutoplayUmaHelper::maybeRecordUserPausedAutoplayingCrossOriginVideo() {
- recordCrossOriginAutoplayResult(CrossOriginAutoplayResult::UserPaused);
- maybeUnregisterMediaElementPauseListener();
-}
-
-void AutoplayUmaHelper::maybeUnregisterContextDestroyedObserver() {
- if (!shouldListenToContextDestroyed()) {
- setContext(nullptr);
- }
-}
-
-void AutoplayUmaHelper::maybeUnregisterMediaElementPauseListener() {
- if (m_mutedVideoOffscreenDurationVisibilityObserver)
- return;
- if (shouldRecordUserPausedAutoplayingCrossOriginVideo())
- return;
- m_element->removeEventListener(EventTypeNames::pause, this, false);
-}
-
-bool AutoplayUmaHelper::shouldListenToContextDestroyed() const {
- return m_mutedVideoPlayMethodVisibilityObserver ||
- m_mutedVideoOffscreenDurationVisibilityObserver;
-}
-
-bool AutoplayUmaHelper::shouldRecordUserPausedAutoplayingCrossOriginVideo()
- const {
- return m_element->isInCrossOriginFrame() && m_element->isHTMLVideoElement() &&
- !m_sources.empty() &&
- !m_recordedCrossOriginAutoplayResults.count(
- CrossOriginAutoplayResult::UserPaused);
-}
-
-DEFINE_TRACE(AutoplayUmaHelper) {
- EventListener::trace(visitor);
- ContextLifecycleObserver::trace(visitor);
- visitor->trace(m_element);
- visitor->trace(m_mutedVideoPlayMethodVisibilityObserver);
- visitor->trace(m_mutedVideoOffscreenDurationVisibilityObserver);
-}
-
-} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698