TEST_F(BaseAudioContextTest, AutoplayMetrics_CreateNoGesture) { HistogramTester histogramTester; createChildFrame(); childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); BaseAudioContext* audioContext = BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); recordAutoplayStatus(audioContext); histogramTester.expectBucketCount(kCrossOriginMetric, AutoplayStatus::AutoplayStatusFailed, 1); histogramTester.expectTotalCount(kCrossOriginMetric, 1); }
TEST_F(BaseAudioContextTest, AutoplayMetrics_NodeStartGesture) { HistogramTester histogramTester; createChildFrame(); childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); BaseAudioContext* audioContext = BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); UserGestureIndicator userGestureScope(DocumentUserGestureToken::create( &childDocument(), UserGestureToken::NewGesture)); audioContext->maybeRecordStartAttempt(); recordAutoplayStatus(audioContext); histogramTester.expectBucketCount( kCrossOriginMetric, AutoplayStatus::AutoplayStatusFailedWithStart, 1); histogramTester.expectTotalCount(kCrossOriginMetric, 1); }
TEST_F(BaseAudioContextTest, AutoplayMetrics_CallResumeNoGesture) { HistogramTester histogramTester; createChildFrame(); childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); ScriptState::Scope scope(getScriptStateFrom(childDocument())); BaseAudioContext* audioContext = BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); audioContext->resumeContext(getScriptStateFrom(childDocument())); rejectPendingResolvers(audioContext); recordAutoplayStatus(audioContext); histogramTester.expectBucketCount(kCrossOriginMetric, AutoplayStatus::AutoplayStatusFailed, 1); histogramTester.expectTotalCount(kCrossOriginMetric, 1); }
TEST_F(BaseAudioContextTest, AutoplayMetrics_NodeStartGestureThenSucces) { HistogramTester histogramTester; createChildFrame(); childDocument().settings()->setMediaPlaybackRequiresUserGesture(true); ScriptState::Scope scope(getScriptStateFrom(childDocument())); BaseAudioContext* audioContext = BaseAudioContext::create(childDocument(), ASSERT_NO_EXCEPTION); UserGestureIndicator userGestureScope(DocumentUserGestureToken::create( &childDocument(), UserGestureToken::NewGesture)); audioContext->maybeRecordStartAttempt(); audioContext->resumeContext(getScriptStateFrom(childDocument())); rejectPendingResolvers(audioContext); recordAutoplayStatus(audioContext); histogramTester.expectBucketCount(kCrossOriginMetric, AutoplayStatus::AutoplayStatusSucceeded, 1); histogramTester.expectTotalCount(kCrossOriginMetric, 1); }
TEST(UseCounterTest, SVGImageContext) { UseCounter useCounter(UseCounter::SVGImageContext); HistogramTester histogramTester; // Verify that SVGImage related feature counters get recorded in a separate // histogram. EXPECT_FALSE( useCounter.hasRecordedMeasurement(UseCounter::SVGSMILAdditiveAnimation)); useCounter.recordMeasurement(UseCounter::SVGSMILAdditiveAnimation); EXPECT_TRUE( useCounter.hasRecordedMeasurement(UseCounter::SVGSMILAdditiveAnimation)); histogramTester.expectUniqueSample(kSVGFeaturesHistogramName, UseCounter::SVGSMILAdditiveAnimation, 1); // And for the CSS counters EXPECT_FALSE(useCounter.isCounted(CSSPropertyFont)); useCounter.count(HTMLStandardMode, CSSPropertyFont); EXPECT_TRUE(useCounter.isCounted(CSSPropertyFont)); histogramTester.expectUniqueSample( kSVGCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyFont), 1); // After a page load, the histograms will be updated useCounter.didCommitLoad(); histogramTester.expectBucketCount(kSVGFeaturesHistogramName, UseCounter::PageVisits, 1); histogramTester.expectTotalCount(kSVGFeaturesHistogramName, 2); histogramTester.expectBucketCount(kSVGCSSHistogramName, 1, 1); histogramTester.expectTotalCount(kSVGCSSHistogramName, 2); // And the legacy histogram will be updated to include these histogramTester.expectBucketCount(kLegacyFeaturesHistogramName, UseCounter::SVGSMILAdditiveAnimation, 1); histogramTester.expectBucketCount(kLegacyFeaturesHistogramName, UseCounter::PageVisits, 1); histogramTester.expectTotalCount(kLegacyFeaturesHistogramName, 2); histogramTester.expectBucketCount( kLegacyCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyFont), 1); histogramTester.expectBucketCount(kLegacyCSSHistogramName, 1, 1); histogramTester.expectTotalCount(kLegacyCSSHistogramName, 2); // None of this should update the non-legacy non-SVG histograms histogramTester.expectTotalCount(kCSSHistogramName, 0); histogramTester.expectTotalCount(kFeaturesHistogramName, 0); }
TEST(UseCounterTest, RecordingCSSProperties) { UseCounter useCounter; HistogramTester histogramTester; // Test recording a single (arbitrary) property EXPECT_FALSE(useCounter.isCounted(CSSPropertyFont)); useCounter.count(HTMLStandardMode, CSSPropertyFont); EXPECT_TRUE(useCounter.isCounted(CSSPropertyFont)); histogramTester.expectUniqueSample( kCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyFont), 1); histogramTester.expectTotalCount(kLegacyCSSHistogramName, 0); // Test that repeated measurements have no effect useCounter.count(HTMLStandardMode, CSSPropertyFont); histogramTester.expectUniqueSample( kCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyFont), 1); histogramTester.expectTotalCount(kLegacyCSSHistogramName, 0); // Test recording a different sample EXPECT_FALSE(useCounter.isCounted(CSSPropertyZoom)); useCounter.count(HTMLStandardMode, CSSPropertyZoom); EXPECT_TRUE(useCounter.isCounted(CSSPropertyZoom)); histogramTester.expectBucketCount( kCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyFont), 1); histogramTester.expectBucketCount( kCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyZoom), 1); histogramTester.expectTotalCount(kCSSHistogramName, 2); histogramTester.expectTotalCount(kLegacyCSSHistogramName, 0); // Test the impact of page load on the new histogram useCounter.didCommitLoad(); histogramTester.expectBucketCount( kCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyFont), 1); histogramTester.expectBucketCount( kCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyZoom), 1); histogramTester.expectBucketCount(kCSSHistogramName, 1, 1); histogramTester.expectTotalCount(kCSSHistogramName, 3); // And verify the legacy histogram now looks the same histogramTester.expectBucketCount( kLegacyCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyFont), 1); histogramTester.expectBucketCount( kLegacyCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyZoom), 1); histogramTester.expectBucketCount(kLegacyCSSHistogramName, 1, 1); histogramTester.expectTotalCount(kLegacyCSSHistogramName, 3); // Now a repeat measurement should get recorded again, exactly once EXPECT_FALSE(useCounter.isCounted(CSSPropertyFont)); useCounter.count(HTMLStandardMode, CSSPropertyFont); useCounter.count(HTMLStandardMode, CSSPropertyFont); EXPECT_TRUE(useCounter.isCounted(CSSPropertyFont)); histogramTester.expectBucketCount( kCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyFont), 2); histogramTester.expectTotalCount(kCSSHistogramName, 4); // And on the next page load, the legacy histogram will again be updated useCounter.didCommitLoad(); histogramTester.expectBucketCount( kLegacyCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyFont), 2); histogramTester.expectBucketCount( kLegacyCSSHistogramName, UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyZoom), 1); histogramTester.expectBucketCount(kLegacyCSSHistogramName, 1, 2); histogramTester.expectTotalCount(kLegacyCSSHistogramName, 5); // None of this should update any of the SVG histograms histogramTester.expectTotalCount(kSVGFeaturesHistogramName, 0); histogramTester.expectTotalCount(kSVGCSSHistogramName, 0); }
TEST(UseCounterTest, RecordingFeatures) { UseCounter useCounter; HistogramTester histogramTester; // Test recording a single (arbitrary) counter EXPECT_FALSE(useCounter.hasRecordedMeasurement(UseCounter::Fetch)); useCounter.recordMeasurement(UseCounter::Fetch); EXPECT_TRUE(useCounter.hasRecordedMeasurement(UseCounter::Fetch)); histogramTester.expectUniqueSample(kFeaturesHistogramName, UseCounter::Fetch, 1); histogramTester.expectTotalCount(kLegacyFeaturesHistogramName, 0); // Test that repeated measurements have no effect useCounter.recordMeasurement(UseCounter::Fetch); histogramTester.expectUniqueSample(kFeaturesHistogramName, UseCounter::Fetch, 1); histogramTester.expectTotalCount(kLegacyFeaturesHistogramName, 0); // Test recording a different sample EXPECT_FALSE(useCounter.hasRecordedMeasurement(UseCounter::FetchBodyStream)); useCounter.recordMeasurement(UseCounter::FetchBodyStream); EXPECT_TRUE(useCounter.hasRecordedMeasurement(UseCounter::FetchBodyStream)); histogramTester.expectBucketCount(kFeaturesHistogramName, UseCounter::Fetch, 1); histogramTester.expectBucketCount(kFeaturesHistogramName, UseCounter::FetchBodyStream, 1); histogramTester.expectTotalCount(kFeaturesHistogramName, 2); histogramTester.expectTotalCount(kLegacyFeaturesHistogramName, 0); // Test the impact of page load on the new histogram useCounter.didCommitLoad(); histogramTester.expectBucketCount(kFeaturesHistogramName, UseCounter::Fetch, 1); histogramTester.expectBucketCount(kFeaturesHistogramName, UseCounter::FetchBodyStream, 1); histogramTester.expectBucketCount(kFeaturesHistogramName, UseCounter::PageVisits, 1); histogramTester.expectTotalCount(kFeaturesHistogramName, 3); // And verify the legacy histogram now looks the same histogramTester.expectBucketCount(kLegacyFeaturesHistogramName, UseCounter::Fetch, 1); histogramTester.expectBucketCount(kLegacyFeaturesHistogramName, UseCounter::FetchBodyStream, 1); histogramTester.expectBucketCount(kLegacyFeaturesHistogramName, UseCounter::PageVisits, 1); histogramTester.expectTotalCount(kLegacyFeaturesHistogramName, 3); // Now a repeat measurement should get recorded again, exactly once EXPECT_FALSE(useCounter.hasRecordedMeasurement(UseCounter::Fetch)); useCounter.recordMeasurement(UseCounter::Fetch); useCounter.recordMeasurement(UseCounter::Fetch); EXPECT_TRUE(useCounter.hasRecordedMeasurement(UseCounter::Fetch)); histogramTester.expectBucketCount(kFeaturesHistogramName, UseCounter::Fetch, 2); histogramTester.expectTotalCount(kFeaturesHistogramName, 4); // And on the next page load, the legacy histogram will again be updated useCounter.didCommitLoad(); histogramTester.expectBucketCount(kLegacyFeaturesHistogramName, UseCounter::Fetch, 2); histogramTester.expectBucketCount(kLegacyFeaturesHistogramName, UseCounter::FetchBodyStream, 1); histogramTester.expectBucketCount(kLegacyFeaturesHistogramName, UseCounter::PageVisits, 2); histogramTester.expectTotalCount(kLegacyFeaturesHistogramName, 5); // None of this should update any of the SVG histograms histogramTester.expectTotalCount(kSVGFeaturesHistogramName, 0); histogramTester.expectTotalCount(kSVGCSSHistogramName, 0); }