diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/modules/webaudio/base_audio_context_test.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/modules/webaudio/base_audio_context_test.cc | 732 |
1 files changed, 0 insertions, 732 deletions
diff --git a/chromium/third_party/blink/renderer/modules/webaudio/base_audio_context_test.cc b/chromium/third_party/blink/renderer/modules/webaudio/base_audio_context_test.cc deleted file mode 100644 index b2104c786ca..00000000000 --- a/chromium/third_party/blink/renderer/modules/webaudio/base_audio_context_test.cc +++ /dev/null @@ -1,732 +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 "third_party/blink/renderer/modules/webaudio/base_audio_context.h" - -#include <memory> - -#include "build/build_config.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/public/platform/platform.h" -#include "third_party/blink/public/platform/web_audio_device.h" -#include "third_party/blink/public/platform/web_audio_latency_hint.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" -#include "third_party/blink/renderer/core/dom/document.h" -#include "third_party/blink/renderer/core/dom/user_gesture_indicator.h" -#include "third_party/blink/renderer/core/frame/frame_owner.h" -#include "third_party/blink/renderer/core/frame/frame_types.h" -#include "third_party/blink/renderer/core/frame/local_frame.h" -#include "third_party/blink/renderer/core/frame/local_frame_view.h" -#include "third_party/blink/renderer/core/frame/settings.h" -#include "third_party/blink/renderer/core/html/media/autoplay_policy.h" -#include "third_party/blink/renderer/core/loader/document_loader.h" -#include "third_party/blink/renderer/core/loader/empty_clients.h" -#include "third_party/blink/renderer/core/testing/dummy_page_holder.h" -#include "third_party/blink/renderer/modules/webaudio/audio_context_options.h" -#include "third_party/blink/renderer/modules/webaudio/audio_worklet_thread.h" -#include "third_party/blink/renderer/platform/testing/histogram_tester.h" -#include "third_party/blink/renderer/platform/testing/testing_platform_support.h" - -namespace blink { - -namespace { - -const char* const kAutoplayMetric = "WebAudio.Autoplay"; -const char* const kAutoplayCrossOriginMetric = "WebAudio.Autoplay.CrossOrigin"; - -class MockCrossOriginLocalFrameClient final : public EmptyLocalFrameClient { - public: - static MockCrossOriginLocalFrameClient* Create(Frame* parent) { - return new MockCrossOriginLocalFrameClient(parent); - } - - void Trace(blink::Visitor* visitor) override { - visitor->Trace(parent_); - EmptyLocalFrameClient::Trace(visitor); - } - - Frame* Parent() const override { return parent_.Get(); } - Frame* Top() const override { return parent_.Get(); } - - private: - explicit MockCrossOriginLocalFrameClient(Frame* parent) : parent_(parent) {} - - Member<Frame> parent_; -}; - -class MockWebAudioDeviceForBaseAudioContext : public WebAudioDevice { - public: - explicit MockWebAudioDeviceForBaseAudioContext(double sample_rate, - int frames_per_buffer) - : sample_rate_(sample_rate), frames_per_buffer_(frames_per_buffer) {} - ~MockWebAudioDeviceForBaseAudioContext() override = default; - - void Start() override {} - void Stop() override {} - double SampleRate() override { return sample_rate_; } - int FramesPerBuffer() override { return frames_per_buffer_; } - - private: - double sample_rate_; - int frames_per_buffer_; -}; - -class BaseAudioContextTestPlatform : public TestingPlatformSupport { - public: - std::unique_ptr<WebAudioDevice> CreateAudioDevice( - unsigned number_of_input_channels, - unsigned number_of_channels, - const WebAudioLatencyHint& latency_hint, - WebAudioDevice::RenderCallback*, - const WebString& device_id) override { - return std::make_unique<MockWebAudioDeviceForBaseAudioContext>( - AudioHardwareSampleRate(), AudioHardwareBufferSize()); - } - - std::unique_ptr<WebThread> CreateThread( - const WebThreadCreationParams& params) override { - return old_platform_->CreateThread(params); - } - - double AudioHardwareSampleRate() override { return 44100; } - size_t AudioHardwareBufferSize() override { return 128; } -}; - -} // anonymous namespace - -class BaseAudioContextAutoplayTest - : public testing::TestWithParam<AutoplayPolicy::Type> { - protected: - using AutoplayStatus = BaseAudioContext::AutoplayStatus; - - void SetUp() override { - dummy_page_holder_ = DummyPageHolder::Create(); - dummy_frame_owner_ = DummyFrameOwner::Create(); - GetDocument().UpdateSecurityOrigin( - SecurityOrigin::Create("https", "example.com", 80)); - - CreateChildFrame(); - - GetDocument().GetSettings()->SetAutoplayPolicy(GetParam()); - ChildDocument().GetSettings()->SetAutoplayPolicy(GetParam()); - - histogram_tester_ = std::make_unique<HistogramTester>(); - } - - void TearDown() override { - if (child_frame_) - child_frame_->Detach(FrameDetachType::kRemove); - } - - void CreateChildFrame() { - child_frame_ = LocalFrame::Create( - MockCrossOriginLocalFrameClient::Create(GetDocument().GetFrame()), - *GetDocument().GetFrame()->GetPage(), dummy_frame_owner_.Get()); - child_frame_->SetView( - LocalFrameView::Create(*child_frame_, IntSize(500, 500))); - child_frame_->Init(); - - ChildDocument().UpdateSecurityOrigin( - SecurityOrigin::Create("https", "cross-origin.com", 80)); - } - - Document& GetDocument() { return dummy_page_holder_->GetDocument(); } - - Document& ChildDocument() { return *child_frame_->GetDocument(); } - - ScriptState* GetScriptStateFrom(const Document& document) { - return ToScriptStateForMainWorld(document.GetFrame()); - } - - void RejectPendingResolvers(BaseAudioContext* audio_context) { - audio_context->RejectPendingResolvers(); - } - - void RecordAutoplayStatus(BaseAudioContext* audio_context) { - audio_context->RecordAutoplayStatus(); - } - - HistogramTester* GetHistogramTester() { - return histogram_tester_.get(); - } - - private: - std::unique_ptr<DummyPageHolder> dummy_page_holder_; - Persistent<DummyFrameOwner> dummy_frame_owner_; - Persistent<LocalFrame> child_frame_; - std::unique_ptr<HistogramTester> histogram_tester_; - ScopedTestingPlatformSupport<BaseAudioContextTestPlatform> platform_; -}; - -// Creates an AudioContext without a gesture inside a x-origin child frame. -TEST_P(BaseAudioContextAutoplayTest, AutoplayMetrics_CreateNoGesture_Child) { - BaseAudioContext* audio_context = BaseAudioContext::Create( - ChildDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusFailed, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectBucketCount( - kAutoplayCrossOriginMetric, AutoplayStatus::kAutoplayStatusFailed, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 1); - break; - } -} - -// Creates an AudioContext without a gesture inside a main frame. -TEST_P(BaseAudioContextAutoplayTest, AutoplayMetrics_CreateNoGesture_Main) { - BaseAudioContext* audio_context = BaseAudioContext::Create( - GetDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusFailed, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - } -} - -// Creates an AudioContext then call resume without a gesture in a x-origin -// child frame. -TEST_P(BaseAudioContextAutoplayTest, - AutoplayMetrics_CallResumeNoGesture_Child) { - ScriptState::Scope scope(GetScriptStateFrom(ChildDocument())); - - BaseAudioContext* audio_context = BaseAudioContext::Create( - ChildDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - audio_context->resumeContext(GetScriptStateFrom(ChildDocument())); - RejectPendingResolvers(audio_context); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusFailed, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectBucketCount( - kAutoplayCrossOriginMetric, AutoplayStatus::kAutoplayStatusFailed, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 1); - break; - } -} - -// Creates an AudioContext then call resume without a gesture in a main frame. -TEST_P(BaseAudioContextAutoplayTest, AutoplayMetrics_CallResumeNoGesture_Main) { - ScriptState::Scope scope(GetScriptStateFrom(GetDocument())); - - BaseAudioContext* audio_context = BaseAudioContext::Create( - GetDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - audio_context->resumeContext(GetScriptStateFrom(ChildDocument())); - RejectPendingResolvers(audio_context); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusFailed, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - } -} - -// Creates an AudioContext with a user gesture inside a x-origin child frame. -TEST_P(BaseAudioContextAutoplayTest, AutoplayMetrics_CreateGesture_Child) { - std::unique_ptr<UserGestureIndicator> user_gesture_scope = - Frame::NotifyUserActivation(ChildDocument().GetFrame(), - UserGestureToken::kNewGesture); - - BaseAudioContext* audio_context = BaseAudioContext::Create( - ChildDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusSucceeded, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectBucketCount( - kAutoplayCrossOriginMetric, AutoplayStatus::kAutoplayStatusSucceeded, - 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 1); - break; - } -} - -// Creates an AudioContext with a user gesture inside a main frame. -TEST_P(BaseAudioContextAutoplayTest, AutoplayMetrics_CreateGesture_Main) { - std::unique_ptr<UserGestureIndicator> user_gesture_scope = - Frame::NotifyUserActivation(GetDocument().GetFrame(), - UserGestureToken::kNewGesture); - - BaseAudioContext* audio_context = BaseAudioContext::Create( - GetDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusSucceeded, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - } -} - -// Creates an AudioContext then calls resume with a user gesture inside a -// x-origin child frame. -TEST_P(BaseAudioContextAutoplayTest, AutoplayMetrics_CallResumeGesture_Child) { - ScriptState::Scope scope(GetScriptStateFrom(ChildDocument())); - - BaseAudioContext* audio_context = BaseAudioContext::Create( - ChildDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - - std::unique_ptr<UserGestureIndicator> user_gesture_scope = - Frame::NotifyUserActivation(ChildDocument().GetFrame(), - UserGestureToken::kNewGesture); - - audio_context->resumeContext(GetScriptStateFrom(ChildDocument())); - RejectPendingResolvers(audio_context); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusSucceeded, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectBucketCount( - kAutoplayCrossOriginMetric, AutoplayStatus::kAutoplayStatusSucceeded, - 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 1); - break; - } -} - -// Creates an AudioContext then calls resume with a user gesture inside a main -// frame. -TEST_P(BaseAudioContextAutoplayTest, AutoplayMetrics_CallResumeGesture_Main) { - ScriptState::Scope scope(GetScriptStateFrom(GetDocument())); - - BaseAudioContext* audio_context = BaseAudioContext::Create( - GetDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - - std::unique_ptr<UserGestureIndicator> user_gesture_scope = - Frame::NotifyUserActivation(GetDocument().GetFrame(), - UserGestureToken::kNewGesture); - - audio_context->resumeContext(GetScriptStateFrom(GetDocument())); - RejectPendingResolvers(audio_context); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusSucceeded, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - } -} - -// Creates an AudioContext then calls start on a node without a gesture inside a -// x-origin child frame. -TEST_P(BaseAudioContextAutoplayTest, AutoplayMetrics_NodeStartNoGesture_Child) { - BaseAudioContext* audio_context = BaseAudioContext::Create( - ChildDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - audio_context->MaybeRecordStartAttempt(); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusFailed, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectBucketCount( - kAutoplayCrossOriginMetric, AutoplayStatus::kAutoplayStatusFailed, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 1); - break; - } -} - -// Creates an AudioContext then calls start on a node without a gesture inside a -// main frame. -TEST_P(BaseAudioContextAutoplayTest, AutoplayMetrics_NodeStartNoGesture_Main) { - BaseAudioContext* audio_context = BaseAudioContext::Create( - GetDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - audio_context->MaybeRecordStartAttempt(); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusFailed, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - } -} - -// Creates an AudioContext then calls start on a node with a gesture inside a -// x-origin child frame. -TEST_P(BaseAudioContextAutoplayTest, AutoplayMetrics_NodeStartGesture_Child) { - BaseAudioContext* audio_context = BaseAudioContext::Create( - ChildDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - - std::unique_ptr<UserGestureIndicator> user_gesture_scope = - Frame::NotifyUserActivation(ChildDocument().GetFrame(), - UserGestureToken::kNewGesture); - audio_context->MaybeRecordStartAttempt(); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusFailedWithStart, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectBucketCount( - kAutoplayCrossOriginMetric, - AutoplayStatus::kAutoplayStatusFailedWithStart, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 1); - break; - } -} - -// Creates an AudioContext then calls start on a node with a gesture inside a -// main frame. -TEST_P(BaseAudioContextAutoplayTest, AutoplayMetrics_NodeStartGesture_Main) { - BaseAudioContext* audio_context = BaseAudioContext::Create( - GetDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - - std::unique_ptr<UserGestureIndicator> user_gesture_scope = - Frame::NotifyUserActivation(GetDocument().GetFrame(), - UserGestureToken::kNewGesture); - audio_context->MaybeRecordStartAttempt(); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusFailedWithStart, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - } -} - -// Creates an AudioContext then calls start on a node without a gesture and -// finally allows the AudioContext to produce sound inside x-origin child frame. -TEST_P(BaseAudioContextAutoplayTest, - AutoplayMetrics_NodeStartNoGestureThenSuccess_Child) { - ScriptState::Scope scope(GetScriptStateFrom(ChildDocument())); - - BaseAudioContext* audio_context = BaseAudioContext::Create( - ChildDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - audio_context->MaybeRecordStartAttempt(); - - std::unique_ptr<UserGestureIndicator> user_gesture_scope = - Frame::NotifyUserActivation(ChildDocument().GetFrame(), - UserGestureToken::kNewGesture); - audio_context->resumeContext(GetScriptStateFrom(ChildDocument())); - RejectPendingResolvers(audio_context); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusSucceeded, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectBucketCount( - kAutoplayCrossOriginMetric, AutoplayStatus::kAutoplayStatusSucceeded, - 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 1); - break; - } -} - -// Creates an AudioContext then calls start on a node without a gesture and -// finally allows the AudioContext to produce sound inside a main frame. -TEST_P(BaseAudioContextAutoplayTest, - AutoplayMetrics_NodeStartNoGestureThenSuccess_Main) { - ScriptState::Scope scope(GetScriptStateFrom(GetDocument())); - - BaseAudioContext* audio_context = BaseAudioContext::Create( - GetDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - audio_context->MaybeRecordStartAttempt(); - - std::unique_ptr<UserGestureIndicator> user_gesture_scope = - Frame::NotifyUserActivation(GetDocument().GetFrame(), - UserGestureToken::kNewGesture); - audio_context->resumeContext(GetScriptStateFrom(GetDocument())); - RejectPendingResolvers(audio_context); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusSucceeded, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - } -} - -// Creates an AudioContext then calls start on a node with a gesture and -// finally allows the AudioContext to produce sound inside x-origin child frame. -TEST_P(BaseAudioContextAutoplayTest, - AutoplayMetrics_NodeStartGestureThenSucces_Child) { - ScriptState::Scope scope(GetScriptStateFrom(ChildDocument())); - - BaseAudioContext* audio_context = BaseAudioContext::Create( - ChildDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - - std::unique_ptr<UserGestureIndicator> user_gesture_scope = - Frame::NotifyUserActivation(ChildDocument().GetFrame(), - UserGestureToken::kNewGesture); - audio_context->MaybeRecordStartAttempt(); - audio_context->resumeContext(GetScriptStateFrom(ChildDocument())); - RejectPendingResolvers(audio_context); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusSucceeded, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectBucketCount( - kAutoplayCrossOriginMetric, AutoplayStatus::kAutoplayStatusSucceeded, - 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 1); - break; - } -} - -// Creates an AudioContext then calls start on a node with a gesture and -// finally allows the AudioContext to produce sound inside a main frame. -TEST_P(BaseAudioContextAutoplayTest, - AutoplayMetrics_NodeStartGestureThenSucces_Main) { - ScriptState::Scope scope(GetScriptStateFrom(GetDocument())); - - BaseAudioContext* audio_context = BaseAudioContext::Create( - GetDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - - std::unique_ptr<UserGestureIndicator> user_gesture_scope = - Frame::NotifyUserActivation(GetDocument().GetFrame(), - UserGestureToken::kNewGesture); - audio_context->MaybeRecordStartAttempt(); - audio_context->resumeContext(GetScriptStateFrom(GetDocument())); - RejectPendingResolvers(audio_context); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusSucceeded, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - } -} - -// Attempts to autoplay an AudioContext in a x-origin child frame when the -// document previous received a user gesture. -TEST_P(BaseAudioContextAutoplayTest, - AutoplayMetrics_DocumentReceivedGesture_Child) { - Frame::NotifyUserActivation(ChildDocument().GetFrame(), - UserGestureToken::kNewGesture); - - BaseAudioContext* audio_context = BaseAudioContext::Create( - ChildDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusFailed, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectBucketCount( - kAutoplayCrossOriginMetric, AutoplayStatus::kAutoplayStatusFailed, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 1); - break; - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusSucceeded, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectBucketCount( - kAutoplayCrossOriginMetric, AutoplayStatus::kAutoplayStatusSucceeded, - 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 1); - break; - } -} - -// Attempts to autoplay an AudioContext in a main child frame when the -// document previous received a user gesture. -TEST_P(BaseAudioContextAutoplayTest, - AutoplayMetrics_DocumentReceivedGesture_Main) { - Frame::NotifyUserActivation(ChildDocument().GetFrame(), - UserGestureToken::kNewGesture); - - BaseAudioContext* audio_context = BaseAudioContext::Create( - GetDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusSucceeded, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - } -} - -// Attempts to autoplay an AudioContext in a main child frame when the -// document received a user gesture before navigation. -TEST_P(BaseAudioContextAutoplayTest, - AutoplayMetrics_DocumentReceivedGesture_BeforeNavigation) { - GetDocument().GetFrame()->SetDocumentHasReceivedUserGestureBeforeNavigation( - true); - - BaseAudioContext* audio_context = BaseAudioContext::Create( - GetDocument(), AudioContextOptions(), ASSERT_NO_EXCEPTION); - RecordAutoplayStatus(audio_context); - - switch (GetParam()) { - case AutoplayPolicy::Type::kNoUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequired: - case AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin: - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 0); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - case AutoplayPolicy::Type::kDocumentUserActivationRequired: - GetHistogramTester()->ExpectBucketCount( - kAutoplayMetric, AutoplayStatus::kAutoplayStatusSucceeded, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayMetric, 1); - GetHistogramTester()->ExpectTotalCount(kAutoplayCrossOriginMetric, 0); - break; - } -} - -INSTANTIATE_TEST_CASE_P( - BaseAudioContextAutoplayTest, - BaseAudioContextAutoplayTest, - testing::Values(AutoplayPolicy::Type::kNoUserGestureRequired, - AutoplayPolicy::Type::kUserGestureRequired, - AutoplayPolicy::Type::kUserGestureRequiredForCrossOrigin, - AutoplayPolicy::Type::kDocumentUserActivationRequired)); - -} // namespace blink |