Index: chrome/browser/subresource_filter/subresource_filter_browsertest.cc |
diff --git a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc |
index 4e1cd2e849524152e0418c7b73c74fb33f35e966..23a82fadd9f62fff6e02110ba3742545b72b63d0 100644 |
--- a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc |
+++ b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc |
@@ -7,6 +7,7 @@ |
#include "base/command_line.h" |
#include "base/files/file_path.h" |
+#include "base/macros.h" |
#include "base/path_service.h" |
#include "base/strings/string_piece.h" |
#include "base/test/histogram_tester.h" |
@@ -20,6 +21,8 @@ |
#include "chrome/test/base/ui_test_utils.h" |
#include "components/subresource_filter/core/browser/subresource_filter_features.h" |
#include "components/subresource_filter/core/browser/subresource_filter_features_test_support.h" |
+#include "components/subresource_filter/core/common/activation_state.h" |
+#include "components/subresource_filter/core/common/scoped_timers.h" |
#include "content/public/browser/render_frame_host.h" |
#include "content/public/browser/web_contents.h" |
#include "content/public/common/content_switches.h" |
@@ -30,6 +33,41 @@ |
namespace { |
+// The path to a multi-frame document used for tests. |
+static constexpr const char kTestFrameSetPath[] = |
+ "subresource_filter/frame_set.html"; |
+ |
+// Names of DocumentLoad histograms. |
+constexpr const char kDocumentLoadActivationState[] = |
+ "SubresourceFilter.DocumentLoad.ActivationState"; |
+constexpr const char kSubresourceLoadsTotal[] = |
+ "SubresourceFilter.DocumentLoad.NumSubresourceLoads.Total"; |
+constexpr const char kSubresourceLoadsEvaluated[] = |
+ "SubresourceFilter.DocumentLoad.NumSubresourceLoads.Evaluated"; |
+constexpr const char kSubresourceLoadsMatchedRules[] = |
+ "SubresourceFilter.DocumentLoad.NumSubresourceLoads.MatchedRules"; |
+constexpr const char kSubresourceLoadsDisallowed[] = |
+ "SubresourceFilter.DocumentLoad.NumSubresourceLoads.Disallowed"; |
+ |
+// Names of the performance measurement histograms. |
+constexpr const char kActivationWallDuration[] = |
+ "SubresourceFilter.DocumentLoad.Activation.WallDuration"; |
+constexpr const char kActivationCPUDuration[] = |
+ "SubresourceFilter.DocumentLoad.Activation.CPUDuration"; |
+constexpr const char kEvaluationTotalWallDurationForPage[] = |
+ "SubresourceFilter.PageLoad.SubresourceEvaluation.TotalWallDuration"; |
+constexpr const char kEvaluationTotalCPUDurationForPage[] = |
+ "SubresourceFilter.PageLoad.SubresourceEvaluation.TotalCPUDuration"; |
+constexpr const char kEvaluationTotalWallDurationForDocument[] = |
+ "SubresourceFilter.DocumentLoad.SubresourceEvaluation.TotalWallDuration"; |
+constexpr const char kEvaluationTotalCPUDurationForDocument[] = |
+ "SubresourceFilter.DocumentLoad.SubresourceEvaluation.TotalCPUDuration"; |
+constexpr const char kEvaluationWallDuration[] = |
+ "SubresourceFilter.SubresourceLoad.Evaluation.WallDuration"; |
+constexpr const char kEvaluationCPUDuration[] = |
+ "SubresourceFilter.SubresourceLoad.Evaluation.CPUDuration"; |
+ |
+// Other histograms. |
const char kSubresourceFilterPromptHistogram[] = |
"SubresourceFilter.Prompt.NumVisibility"; |
@@ -57,10 +95,12 @@ IN_PROC_BROWSER_TEST_F(SubresourceFilterDisabledBrowserTest, |
// SubresourceFilterBrowserTest ----------------------------------------------- |
-class SubresourceFilterBrowserTest : public InProcessBrowserTest { |
+class SubresourceFilterBrowserTestImpl : public InProcessBrowserTest { |
public: |
- SubresourceFilterBrowserTest() {} |
- ~SubresourceFilterBrowserTest() override {} |
+ explicit SubresourceFilterBrowserTestImpl(bool measure_performance) |
+ : measure_performance_(measure_performance) {} |
+ |
+ ~SubresourceFilterBrowserTestImpl() override {} |
protected: |
// It would be too late to enable the feature in SetUpOnMainThread(), as it is |
@@ -81,7 +121,9 @@ class SubresourceFilterBrowserTest : public InProcessBrowserTest { |
void SetUpOnMainThread() override { |
scoped_feature_toggle_.reset(new ScopedSubresourceFilterFeatureToggle( |
base::FeatureList::OVERRIDE_ENABLE_FEATURE, kActivationStateEnabled, |
- kActivationScopeAllSites)); |
+ kActivationScopeAllSites, std::string(), |
+ measure_performance_ ? "1" : "0")); |
+ |
base::FilePath test_data_dir; |
PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir); |
embedded_test_server()->ServeFilesFromDirectory(test_data_dir); |
@@ -138,10 +180,30 @@ class SubresourceFilterBrowserTest : public InProcessBrowserTest { |
private: |
std::unique_ptr<ScopedSubresourceFilterFeatureToggle> scoped_feature_toggle_; |
TestRulesetPublisher test_ruleset_publisher_; |
+ bool measure_performance_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SubresourceFilterBrowserTestImpl); |
+}; |
- DISALLOW_COPY_AND_ASSIGN(SubresourceFilterBrowserTest); |
+class SubresourceFilterBrowserTest : public SubresourceFilterBrowserTestImpl { |
+ public: |
+ SubresourceFilterBrowserTest() : SubresourceFilterBrowserTestImpl(false) {} |
}; |
+// TODO(pkalinnikov): It should be possible to have only one fixture, i.e., |
+// SubresourceFilterBrowserTest, unsetting |measure_performance| by default, and |
+// providing a method to switch it on. However, the current implementation of |
+// ScopedSubresourceFilterFeatureToggle in use pollutes the global |
+// FieldTrialList in such a way that variation parameters can not be reassigned. |
+class SubresourceFilterWithPerformanceMeasurementBrowserTest |
+ : public SubresourceFilterBrowserTestImpl { |
+ public: |
+ SubresourceFilterWithPerformanceMeasurementBrowserTest() |
+ : SubresourceFilterBrowserTestImpl(true) {} |
+}; |
+ |
+// Tests ----------------------------------------------------------------------- |
+ |
IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, MainFrameActivation) { |
GURL url(GetTestUrl("subresource_filter/frame_with_included_script.html")); |
ASSERT_NO_FATAL_FAILURE(SetRulesetToDisallowURLsWithPathSuffix( |
@@ -181,18 +243,22 @@ IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, |
} |
IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, SubFrameActivation) { |
- GURL url(GetTestUrl("subresource_filter/frame_set.html")); |
+ GURL url(GetTestUrl(kTestFrameSetPath)); |
ASSERT_NO_FATAL_FAILURE( |
SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); |
base::HistogramTester tester; |
ui_test_utils::NavigateToURL(browser(), url); |
- const char* kSubframeNames[] = {"one", "two"}; |
- for (const char* subframe_name : kSubframeNames) { |
- content::RenderFrameHost* frame = FindFrameByName(subframe_name); |
+ const char* kSubframeNames[] = {"one", "two", "three"}; |
+ const bool kExpectScriptElementToLoad[arraysize(kSubframeNames)] = { |
+ false, true, false}; |
+ for (size_t i = 0; i < arraysize(kSubframeNames); ++i) { |
+ content::RenderFrameHost* frame = FindFrameByName(kSubframeNames[i]); |
ASSERT_TRUE(frame); |
- EXPECT_FALSE(WasParsedScriptElementLoaded(frame)); |
+ EXPECT_EQ(kExpectScriptElementToLoad[i], |
+ WasParsedScriptElementLoaded(frame)); |
} |
+ |
tester.ExpectBucketCount(kSubresourceFilterPromptHistogram, true, 1); |
} |
@@ -201,7 +267,7 @@ IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, SubFrameActivation) { |
// inserting a subframe afterwards, and still expecting activation. |
IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, |
PageLevelActivationOutlivesSamePageNavigation) { |
- GURL url(GetTestUrl("subresource_filter/frame_set.html")); |
+ GURL url(GetTestUrl(kTestFrameSetPath)); |
ASSERT_NO_FATAL_FAILURE( |
SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); |
ui_test_utils::NavigateToURL(browser(), url); |
@@ -259,16 +325,89 @@ IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, |
PromptShownAgainOnNextNavigation) { |
ASSERT_NO_FATAL_FAILURE( |
SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); |
- GURL url(GetTestUrl("subresource_filter/frame_set.html")); |
+ GURL url(GetTestUrl(kTestFrameSetPath)); |
base::HistogramTester tester; |
ui_test_utils::NavigateToURL(browser(), url); |
tester.ExpectBucketCount(kSubresourceFilterPromptHistogram, true, 1); |
// Check that the bubble is not shown again for this navigation. |
- EXPECT_FALSE(IsDynamicScriptElementLoaded(FindFrameByName("three"))); |
+ EXPECT_FALSE(IsDynamicScriptElementLoaded(FindFrameByName("five"))); |
tester.ExpectBucketCount(kSubresourceFilterPromptHistogram, true, 1); |
// Check that bubble is shown for new navigation. |
ui_test_utils::NavigateToURL(browser(), url); |
tester.ExpectBucketCount(kSubresourceFilterPromptHistogram, true, 2); |
} |
+// Tests checking how histograms are recorded. --------------------------------- |
+ |
+namespace { |
+ |
+void ExpectHistogramsAreRecordedForTestFrameSet( |
+ const base::HistogramTester& tester, |
+ bool expect_performance_measurements) { |
+ const bool time_recorded = |
+ expect_performance_measurements && ScopedThreadTimers::IsSupported(); |
+ |
+ // The following histograms are generated on the browser side. |
+ tester.ExpectTotalCount(kEvaluationTotalWallDurationForPage, time_recorded); |
+ tester.ExpectTotalCount(kEvaluationTotalCPUDurationForPage, time_recorded); |
+ |
+ // The rest is produced by renderers, therefore needs to be merged here. |
+ content::FetchHistogramsFromChildProcesses(); |
+ SubprocessMetricsProvider::MergeHistogramDeltasForTesting(); |
+ |
+ tester.ExpectTotalCount(kEvaluationTotalWallDurationForDocument, |
+ time_recorded ? 6 : 0); |
+ tester.ExpectTotalCount(kEvaluationTotalCPUDurationForDocument, |
+ time_recorded ? 6 : 0); |
+ |
+ tester.ExpectTotalCount(kEvaluationWallDuration, time_recorded ? 7 : 0); |
+ tester.ExpectTotalCount(kEvaluationCPUDuration, time_recorded ? 7 : 0); |
+ |
+ // Activation timing histograms are always recorded. |
+ tester.ExpectTotalCount(kActivationWallDuration, 6); |
+ tester.ExpectTotalCount(kActivationCPUDuration, 6); |
+ |
+ tester.ExpectUniqueSample( |
+ kDocumentLoadActivationState, |
+ static_cast<base::Histogram::Sample>(ActivationState::ENABLED), 6); |
+ |
+ EXPECT_THAT(tester.GetAllSamples(kSubresourceLoadsTotal), |
+ ::testing::ElementsAre(base::Bucket(0, 3), base::Bucket(2, 3))); |
+ EXPECT_THAT(tester.GetAllSamples(kSubresourceLoadsEvaluated), |
+ ::testing::ElementsAre(base::Bucket(0, 3), base::Bucket(2, 3))); |
+ |
+ EXPECT_THAT(tester.GetAllSamples(kSubresourceLoadsMatchedRules), |
+ ::testing::ElementsAre(base::Bucket(0, 4), base::Bucket(2, 2))); |
+ EXPECT_THAT(tester.GetAllSamples(kSubresourceLoadsDisallowed), |
+ ::testing::ElementsAre(base::Bucket(0, 4), base::Bucket(2, 2))); |
+} |
+ |
+} // namespace |
+ |
+IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, |
+ ExpectHistogramsAreRecorded) { |
+ ASSERT_NO_FATAL_FAILURE( |
+ SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); |
+ const GURL url = GetTestUrl(kTestFrameSetPath); |
+ |
+ base::HistogramTester tester; |
+ ui_test_utils::NavigateToURL(browser(), url); |
+ |
+ ExpectHistogramsAreRecordedForTestFrameSet( |
+ tester, false /* expect_performance_measurements */); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(SubresourceFilterWithPerformanceMeasurementBrowserTest, |
+ ExpectHistogramsAreRecorded) { |
+ ASSERT_NO_FATAL_FAILURE( |
+ SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); |
+ const GURL url = GetTestUrl(kTestFrameSetPath); |
+ |
+ base::HistogramTester tester; |
+ ui_test_utils::NavigateToURL(browser(), url); |
+ |
+ ExpectHistogramsAreRecordedForTestFrameSet( |
+ tester, true /* expect_performance_measurements */); |
+} |
+ |
} // namespace subresource_filter |