| 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 44d5dd81f66e6d9c730c2949fc8ddcbbb32cb367..4efabaa6e12bb231a39c718e24bc69d72d784848 100644
|
| --- a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc
|
| +++ b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc
|
| @@ -90,10 +90,34 @@ constexpr const char kEvaluationWallDuration[] =
|
| constexpr const char kEvaluationCPUDuration[] =
|
| "SubresourceFilter.SubresourceLoad.Evaluation.CPUDuration";
|
|
|
| +// Names of navigation chain patterns diagram.
|
| +const char kMatchesPatternHistogramName[] =
|
| + "SubresourceFilter.PageLoad.RedirectChainMatchPattern";
|
| +const char kNavigationChainSize[] =
|
| + "SubresourceFilter.PageLoad.RedirectChainLength";
|
| +const char kSubresourceFilterOnlySuffix[] = ".SubresourceFilterOnly";
|
| +
|
| // Other histograms.
|
| const char kSubresourceFilterPromptHistogram[] =
|
| "SubresourceFilter.Prompt.NumVisibility";
|
|
|
| +// Human readable representation of expected redirect chain match patterns.
|
| +// The explanations for the buckets given for the following redirect chain:
|
| +// A->B->C->D, where A is initial URL and D is a final URL.
|
| +enum RedirectChainMatchPattern {
|
| + EMPTY, // No histograms were recorded.
|
| + F0M0L1, // D is a Safe Browsing match.
|
| + F0M1L0, // B or C, or both are Safe Browsing matches.
|
| + F0M1L1, // B or C, or both and D are Safe Browsing matches.
|
| + F1M0L0, // A is Safe Browsing match
|
| + F1M0L1, // A and D are Safe Browsing matches.
|
| + F1M1L0, // B and/or C and A are Safe Browsing matches.
|
| + F1M1L1, // B and/or C and A and D are Safe Browsing matches.
|
| + NO_REDIRECTS_HIT, // Redirect chain consists of single URL, aka no redirects
|
| + // has happened, and this URL was a Safe Browsing hit.
|
| + NUM_HIT_PATTERNS,
|
| +};
|
| +
|
| // Database manager that allows any URL to be configured as blacklisted for
|
| // testing.
|
| class FakeSafeBrowsingDatabaseManager
|
| @@ -125,6 +149,17 @@ class FakeSafeBrowsingDatabaseManager
|
| return true;
|
| }
|
|
|
| + bool CheckUrlForSubresourceFilter(const GURL& url, Client* client) override {
|
| + if (!url_to_threat_type_.count(url))
|
| + return true;
|
| + content::BrowserThread::PostTask(
|
| + content::BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&Client::OnCheckBrowseUrlResult, base::Unretained(client),
|
| + url, url_to_threat_type_[url],
|
| + safe_browsing::ThreatMetadata()));
|
| + return false;
|
| + }
|
| +
|
| bool IsSupported() const override { return true; }
|
| bool ChecksAreAlwaysAsync() const override { return false; }
|
| bool CanCheckResourceType(
|
| @@ -217,8 +252,10 @@ class SubresourceFilterBrowserTestImpl : public InProcessBrowserTest {
|
| // As a workaround, enable the feature here, then enable the feature once
|
| // again + set up the field trials later.
|
| void SetUpCommandLine(base::CommandLine* command_line) override {
|
| - command_line->AppendSwitchASCII(switches::kEnableFeatures,
|
| - kSafeBrowsingSubresourceFilter.name);
|
| + command_line->AppendSwitchASCII(
|
| + switches::kEnableFeatures,
|
| + std::string(kSafeBrowsingSubresourceFilter.name) +
|
| + ", SafeBrowsingV4OnlyEnabled");
|
| }
|
|
|
| void SetUpInProcessBrowserTestFixture() override {
|
| @@ -254,6 +291,11 @@ class SubresourceFilterBrowserTestImpl : public InProcessBrowserTest {
|
| url, safe_browsing::SB_THREAT_TYPE_URL_PHISHING);
|
| }
|
|
|
| + void ConfigureAsSubresourceFilterOnlyURL(const GURL& url) {
|
| + fake_safe_browsing_database_->AddBlacklistedURL(
|
| + url, safe_browsing::SB_THREAT_TYPE_SUBRESOURCE_FILTER);
|
| + }
|
| +
|
| content::WebContents* web_contents() {
|
| return browser()->tab_strip_model()->GetActiveWebContents();
|
| }
|
| @@ -726,4 +768,73 @@ IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest,
|
| static_cast<base::Histogram::Sample>(ActivationState::DISABLED), 6);
|
| }
|
|
|
| +IN_PROC_BROWSER_TEST_F(
|
| + SubresourceFilterBrowserTest,
|
| + ExpectRedirectPatternHistogramsAreRecordedForSubresourceFilterOnlyMatch) {
|
| + ASSERT_NO_FATAL_FAILURE(SetRulesetToDisallowURLsWithPathSuffix(
|
| + "suffix-that-does-not-match-anything"));
|
| +
|
| + GURL url(GetTestUrl("subresource_filter/frame_with_included_script.html"));
|
| + ConfigureAsSubresourceFilterOnlyURL(url);
|
| +
|
| + base::HistogramTester tester;
|
| + ui_test_utils::NavigateToURL(browser(), url);
|
| +
|
| + EXPECT_THAT(tester.GetAllSamples(std::string(kMatchesPatternHistogramName) +
|
| + std::string(kSubresourceFilterOnlySuffix)),
|
| + ::testing::ElementsAre(base::Bucket(NO_REDIRECTS_HIT, 1)));
|
| + EXPECT_THAT(tester.GetAllSamples(std::string(kNavigationChainSize) +
|
| + std::string(kSubresourceFilterOnlySuffix)),
|
| + ::testing::ElementsAre(base::Bucket(1, 1)));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(
|
| + SubresourceFilterBrowserTest,
|
| + ExpectRedirectPatternHistogramsAreRecordedForSubresourceFilterOnlyWithRedirects) {
|
| + ASSERT_NO_FATAL_FAILURE(
|
| + SetRulesetToDisallowURLsWithPathSuffix("included_script.js"));
|
| + std::string initial_host("a.com");
|
| + std::string redirected_host("b.com");
|
| +
|
| + GURL redirect_url(embedded_test_server()->GetURL(redirected_host, "/"));
|
| + GURL url(embedded_test_server()->GetURL(
|
| + initial_host, "/client-redirect?" + redirect_url.spec()));
|
| +
|
| + ConfigureAsSubresourceFilterOnlyURL(redirect_url);
|
| + base::HistogramTester tester;
|
| + ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), url, 2);
|
| + EXPECT_THAT(tester.GetAllSamples(std::string(kMatchesPatternHistogramName) +
|
| + std::string(kSubresourceFilterOnlySuffix)),
|
| + ::testing::ElementsAre(base::Bucket(NO_REDIRECTS_HIT, 1)));
|
| +
|
| + EXPECT_THAT(tester.GetAllSamples(std::string(kNavigationChainSize) +
|
| + std::string(kSubresourceFilterOnlySuffix)),
|
| + ::testing::ElementsAre(base::Bucket(1, 1)));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(
|
| + SubresourceFilterBrowserTest,
|
| + ExpectRedirectPatternHistogramsAreRecordedForSubresourceFilterOnlyRedirectMatch) {
|
| + ASSERT_NO_FATAL_FAILURE(
|
| + SetRulesetToDisallowURLsWithPathSuffix("included_script.js"));
|
| + std::string initial_host("a.com");
|
| + std::string redirected_host("b.com");
|
| +
|
| + GURL redirect_url(embedded_test_server()->GetURL(
|
| + redirected_host, "/subresource_filter/frame_with_included_script.html"));
|
| + GURL url(embedded_test_server()->GetURL(
|
| + initial_host, "/client-redirect?" + redirect_url.spec()));
|
| +
|
| + ConfigureAsSubresourceFilterOnlyURL(GURL(url.host()));
|
| + base::HistogramTester tester;
|
| + ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), url, 2);
|
| + EXPECT_THAT(tester.GetAllSamples(std::string(kMatchesPatternHistogramName) +
|
| + std::string(kSubresourceFilterOnlySuffix)),
|
| + ::testing::IsEmpty());
|
| +
|
| + EXPECT_THAT(tester.GetAllSamples(std::string(kNavigationChainSize) +
|
| + std::string(kSubresourceFilterOnlySuffix)),
|
| + ::testing::IsEmpty());
|
| +}
|
| +
|
| } // namespace subresource_filter
|
|
|