Chromium Code Reviews| Index: third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp |
| diff --git a/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp b/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp |
| index cb83b9a35728164a9ca67af4e53409db1ed868a5..77fd418146e86f6c285da01900a4411e82ff1ea9 100644 |
| --- a/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp |
| +++ b/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp |
| @@ -107,6 +107,7 @@ BaseAudioContext::BaseAudioContext(Document* document) |
| if (document->settings() && |
| document->settings()->mediaPlaybackRequiresUserGesture() && |
| document->frame() && document->frame()->isCrossOriginSubframe()) { |
| + m_autoplayStatus = AutoplayStatus::AutoplayStatusFailed; |
| m_userGestureRequired = true; |
| } |
| @@ -144,6 +145,8 @@ BaseAudioContext::~BaseAudioContext() { |
| DCHECK(!m_finishedSourceHandlers.size()); |
| DCHECK(!m_isResolvingResumePromises); |
| DCHECK(!m_resumeResolvers.size()); |
| + |
| + recordAutoplayStatus(); |
|
Raymond Toy
2016/10/10 17:05:10
I think if the user closes a tab, everything goes
mlamouri (slow - plz ping)
2016/10/10 18:44:40
I guess if the object is marked as GCFinalized, it
|
| } |
| void BaseAudioContext::initialize() { |
| @@ -196,6 +199,7 @@ void BaseAudioContext::contextDestroyed() { |
| } |
| bool BaseAudioContext::hasPendingActivity() const { |
| + LOG(INFO) << "hasPendingActivity() => " << !m_isCleared; |
|
Raymond Toy
2016/10/10 17:05:10
Do you really want this log? Just asking.
mlamouri (slow - plz ping)
2016/10/10 18:44:40
No :)
|
| // There's no pending activity if the audio context has been cleared. |
| return !m_isCleared; |
| } |
| @@ -553,6 +557,15 @@ PeriodicWave* BaseAudioContext::periodicWave(int type) { |
| } |
| } |
| +void BaseAudioContext::maybeRecordStartAttempt() { |
| + if (!m_userGestureRequired || !UserGestureIndicator::processingUserGesture()) |
| + return; |
| + |
| + DCHECK(!m_autoplayStatus.has_value() || |
| + m_autoplayStatus != AutoplayStatus::AutoplayStatusSucceeded); |
| + m_autoplayStatus = AutoplayStatus::AutoplayStatusFailedWithStart; |
| +} |
| + |
| String BaseAudioContext::state() const { |
| // These strings had better match the strings for AudioContextState in |
| // AudioContext.idl. |
| @@ -775,8 +788,12 @@ void BaseAudioContext::maybeUnlockUserGesture() { |
| if (!m_userGestureRequired || !UserGestureIndicator::processingUserGesture()) |
| return; |
| + DCHECK(!m_autoplayStatus.has_value() || |
| + m_autoplayStatus != AutoplayStatus::AutoplayStatusSucceeded); |
| + |
| UserGestureIndicator::utilizeUserGesture(); |
| m_userGestureRequired = false; |
| + m_autoplayStatus = AutoplayStatus::AutoplayStatusSucceeded; |
| } |
| bool BaseAudioContext::isAllowedToStart() const { |
| @@ -807,6 +824,18 @@ void BaseAudioContext::rejectPendingResolvers() { |
| rejectPendingDecodeAudioDataResolvers(); |
| } |
| +void BaseAudioContext::recordAutoplayStatus() { |
| + if (!m_autoplayStatus.has_value()) |
| + return; |
| + |
| + DEFINE_STATIC_LOCAL( |
| + EnumerationHistogram, autoplayHistogram, |
| + ("WebAudio.Autoplay.CrossOrigin", AutoplayStatus::AutoplayStatusCount)); |
| + autoplayHistogram.count(m_autoplayStatus.value()); |
| + |
| + m_autoplayStatus.reset(); |
| +} |
| + |
| const AtomicString& BaseAudioContext::interfaceName() const { |
| return EventTargetNames::AudioContext; |
| } |