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 |