| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <map> | 5 #include <map> |
| 6 #include <memory> | 6 #include <memory> |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 "SubresourceFilter.PageLoad.SubresourceEvaluation.TotalCPUDuration"; | 83 "SubresourceFilter.PageLoad.SubresourceEvaluation.TotalCPUDuration"; |
| 84 constexpr const char kEvaluationTotalWallDurationForDocument[] = | 84 constexpr const char kEvaluationTotalWallDurationForDocument[] = |
| 85 "SubresourceFilter.DocumentLoad.SubresourceEvaluation.TotalWallDuration"; | 85 "SubresourceFilter.DocumentLoad.SubresourceEvaluation.TotalWallDuration"; |
| 86 constexpr const char kEvaluationTotalCPUDurationForDocument[] = | 86 constexpr const char kEvaluationTotalCPUDurationForDocument[] = |
| 87 "SubresourceFilter.DocumentLoad.SubresourceEvaluation.TotalCPUDuration"; | 87 "SubresourceFilter.DocumentLoad.SubresourceEvaluation.TotalCPUDuration"; |
| 88 constexpr const char kEvaluationWallDuration[] = | 88 constexpr const char kEvaluationWallDuration[] = |
| 89 "SubresourceFilter.SubresourceLoad.Evaluation.WallDuration"; | 89 "SubresourceFilter.SubresourceLoad.Evaluation.WallDuration"; |
| 90 constexpr const char kEvaluationCPUDuration[] = | 90 constexpr const char kEvaluationCPUDuration[] = |
| 91 "SubresourceFilter.SubresourceLoad.Evaluation.CPUDuration"; | 91 "SubresourceFilter.SubresourceLoad.Evaluation.CPUDuration"; |
| 92 | 92 |
| 93 // Names of navigation chain patterns diagram. |
| 94 const char kMatchesPatternHistogramName[] = |
| 95 "SubresourceFilter.PageLoad.RedirectChainMatchPattern"; |
| 96 const char kNavigationChainSize[] = |
| 97 "SubresourceFilter.PageLoad.RedirectChainLength"; |
| 98 const char kSubresourceFilterOnlySuffix[] = ".SubresourceFilterOnly"; |
| 99 |
| 93 // Other histograms. | 100 // Other histograms. |
| 94 const char kSubresourceFilterPromptHistogram[] = | 101 const char kSubresourceFilterPromptHistogram[] = |
| 95 "SubresourceFilter.Prompt.NumVisibility"; | 102 "SubresourceFilter.Prompt.NumVisibility"; |
| 96 | 103 |
| 104 // Human readable representation of expected redirect chain match patterns. |
| 105 // The explanations for the buckets given for the following redirect chain: |
| 106 // A->B->C->D, where A is initial URL and D is a final URL. |
| 107 enum RedirectChainMatchPattern { |
| 108 EMPTY, // No histograms were recorded. |
| 109 F0M0L1, // D is a Safe Browsing match. |
| 110 F0M1L0, // B or C, or both are Safe Browsing matches. |
| 111 F0M1L1, // B or C, or both and D are Safe Browsing matches. |
| 112 F1M0L0, // A is Safe Browsing match |
| 113 F1M0L1, // A and D are Safe Browsing matches. |
| 114 F1M1L0, // B and/or C and A are Safe Browsing matches. |
| 115 F1M1L1, // B and/or C and A and D are Safe Browsing matches. |
| 116 NO_REDIRECTS_HIT, // Redirect chain consists of single URL, aka no redirects |
| 117 // has happened, and this URL was a Safe Browsing hit. |
| 118 NUM_HIT_PATTERNS, |
| 119 }; |
| 120 |
| 97 // Database manager that allows any URL to be configured as blacklisted for | 121 // Database manager that allows any URL to be configured as blacklisted for |
| 98 // testing. | 122 // testing. |
| 99 class FakeSafeBrowsingDatabaseManager | 123 class FakeSafeBrowsingDatabaseManager |
| 100 : public safe_browsing::TestSafeBrowsingDatabaseManager { | 124 : public safe_browsing::TestSafeBrowsingDatabaseManager { |
| 101 public: | 125 public: |
| 102 FakeSafeBrowsingDatabaseManager() {} | 126 FakeSafeBrowsingDatabaseManager() {} |
| 103 | 127 |
| 104 void AddBlacklistedURL(const GURL& url, | 128 void AddBlacklistedURL(const GURL& url, |
| 105 safe_browsing::SBThreatType threat_type) { | 129 safe_browsing::SBThreatType threat_type) { |
| 106 url_to_threat_type_[url] = threat_type; | 130 url_to_threat_type_[url] = threat_type; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 118 base::Bind(&Client::OnCheckBrowseUrlResult, base::Unretained(client), | 142 base::Bind(&Client::OnCheckBrowseUrlResult, base::Unretained(client), |
| 119 url, url_to_threat_type_[url], | 143 url, url_to_threat_type_[url], |
| 120 safe_browsing::ThreatMetadata())); | 144 safe_browsing::ThreatMetadata())); |
| 121 return false; | 145 return false; |
| 122 } | 146 } |
| 123 | 147 |
| 124 bool CheckResourceUrl(const GURL& url, Client* client) override { | 148 bool CheckResourceUrl(const GURL& url, Client* client) override { |
| 125 return true; | 149 return true; |
| 126 } | 150 } |
| 127 | 151 |
| 152 bool CheckUrlForSubresourceFilter(const GURL& url, Client* client) override { |
| 153 if (!url_to_threat_type_.count(url)) |
| 154 return true; |
| 155 content::BrowserThread::PostTask( |
| 156 content::BrowserThread::IO, FROM_HERE, |
| 157 base::Bind(&Client::OnCheckBrowseUrlResult, base::Unretained(client), |
| 158 url, url_to_threat_type_[url], |
| 159 safe_browsing::ThreatMetadata())); |
| 160 return false; |
| 161 } |
| 162 |
| 128 bool IsSupported() const override { return true; } | 163 bool IsSupported() const override { return true; } |
| 129 bool ChecksAreAlwaysAsync() const override { return false; } | 164 bool ChecksAreAlwaysAsync() const override { return false; } |
| 130 bool CanCheckResourceType( | 165 bool CanCheckResourceType( |
| 131 content::ResourceType /* resource_type */) const override { | 166 content::ResourceType /* resource_type */) const override { |
| 132 return true; | 167 return true; |
| 133 } | 168 } |
| 134 | 169 |
| 135 safe_browsing::ThreatSource GetThreatSource() const override { | 170 safe_browsing::ThreatSource GetThreatSource() const override { |
| 136 return safe_browsing::ThreatSource::LOCAL_PVER4; | 171 return safe_browsing::ThreatSource::LOCAL_PVER4; |
| 137 } | 172 } |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 // called after ChromeBrowserMainParts::PreBrowserStart(), which instantiates | 245 // called after ChromeBrowserMainParts::PreBrowserStart(), which instantiates |
| 211 // the RulesetService. | 246 // the RulesetService. |
| 212 // | 247 // |
| 213 // On the other hand, setting up field trials in this method would be too | 248 // On the other hand, setting up field trials in this method would be too |
| 214 // early, as it is called before BrowserMain, which expects no FieldTrialList | 249 // early, as it is called before BrowserMain, which expects no FieldTrialList |
| 215 // singleton to exist. There are no other hooks we could use either. | 250 // singleton to exist. There are no other hooks we could use either. |
| 216 // | 251 // |
| 217 // As a workaround, enable the feature here, then enable the feature once | 252 // As a workaround, enable the feature here, then enable the feature once |
| 218 // again + set up the field trials later. | 253 // again + set up the field trials later. |
| 219 void SetUpCommandLine(base::CommandLine* command_line) override { | 254 void SetUpCommandLine(base::CommandLine* command_line) override { |
| 220 command_line->AppendSwitchASCII(switches::kEnableFeatures, | 255 command_line->AppendSwitchASCII( |
| 221 kSafeBrowsingSubresourceFilter.name); | 256 switches::kEnableFeatures, |
| 257 std::string(kSafeBrowsingSubresourceFilter.name) + |
| 258 ", SafeBrowsingV4OnlyEnabled"); |
| 222 } | 259 } |
| 223 | 260 |
| 224 void SetUpInProcessBrowserTestFixture() override { | 261 void SetUpInProcessBrowserTestFixture() override { |
| 225 fake_safe_browsing_database_ = new FakeSafeBrowsingDatabaseManager(); | 262 fake_safe_browsing_database_ = new FakeSafeBrowsingDatabaseManager(); |
| 226 test_safe_browsing_factory_.SetTestDatabaseManager( | 263 test_safe_browsing_factory_.SetTestDatabaseManager( |
| 227 fake_safe_browsing_database_.get()); | 264 fake_safe_browsing_database_.get()); |
| 228 test_safe_browsing_factory_.SetTestUIManager(new FakeSafeBrowsingUIManager); | 265 test_safe_browsing_factory_.SetTestUIManager(new FakeSafeBrowsingUIManager); |
| 229 safe_browsing::SafeBrowsingService::RegisterFactory( | 266 safe_browsing::SafeBrowsingService::RegisterFactory( |
| 230 &test_safe_browsing_factory_); | 267 &test_safe_browsing_factory_); |
| 231 } | 268 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 247 | 284 |
| 248 GURL GetTestUrl(const std::string& path) { | 285 GURL GetTestUrl(const std::string& path) { |
| 249 return embedded_test_server()->base_url().Resolve(path); | 286 return embedded_test_server()->base_url().Resolve(path); |
| 250 } | 287 } |
| 251 | 288 |
| 252 void ConfigureAsPhishingURL(const GURL& url) { | 289 void ConfigureAsPhishingURL(const GURL& url) { |
| 253 fake_safe_browsing_database_->AddBlacklistedURL( | 290 fake_safe_browsing_database_->AddBlacklistedURL( |
| 254 url, safe_browsing::SB_THREAT_TYPE_URL_PHISHING); | 291 url, safe_browsing::SB_THREAT_TYPE_URL_PHISHING); |
| 255 } | 292 } |
| 256 | 293 |
| 294 void ConfigureAsSubresourceFilterOnlyURL(const GURL& url) { |
| 295 fake_safe_browsing_database_->AddBlacklistedURL( |
| 296 url, safe_browsing::SB_THREAT_TYPE_SUBRESOURCE_FILTER); |
| 297 } |
| 298 |
| 257 content::WebContents* web_contents() { | 299 content::WebContents* web_contents() { |
| 258 return browser()->tab_strip_model()->GetActiveWebContents(); | 300 return browser()->tab_strip_model()->GetActiveWebContents(); |
| 259 } | 301 } |
| 260 | 302 |
| 261 content::RenderFrameHost* FindFrameByName(const std::string& name) { | 303 content::RenderFrameHost* FindFrameByName(const std::string& name) { |
| 262 for (content::RenderFrameHost* frame : web_contents()->GetAllFrames()) { | 304 for (content::RenderFrameHost* frame : web_contents()->GetAllFrames()) { |
| 263 if (frame->GetFrameName() == name) | 305 if (frame->GetFrameName() == name) |
| 264 return frame; | 306 return frame; |
| 265 } | 307 } |
| 266 return nullptr; | 308 return nullptr; |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 719 tester.ExpectTotalCount(kSubresourceLoadsEvaluated, 0); | 761 tester.ExpectTotalCount(kSubresourceLoadsEvaluated, 0); |
| 720 tester.ExpectTotalCount(kSubresourceLoadsMatchedRules, 0); | 762 tester.ExpectTotalCount(kSubresourceLoadsMatchedRules, 0); |
| 721 tester.ExpectTotalCount(kSubresourceLoadsDisallowed, 0); | 763 tester.ExpectTotalCount(kSubresourceLoadsDisallowed, 0); |
| 722 | 764 |
| 723 // Although SubresourceFilterAgents still record the activation decision. | 765 // Although SubresourceFilterAgents still record the activation decision. |
| 724 tester.ExpectUniqueSample( | 766 tester.ExpectUniqueSample( |
| 725 kDocumentLoadActivationState, | 767 kDocumentLoadActivationState, |
| 726 static_cast<base::Histogram::Sample>(ActivationState::DISABLED), 6); | 768 static_cast<base::Histogram::Sample>(ActivationState::DISABLED), 6); |
| 727 } | 769 } |
| 728 | 770 |
| 771 IN_PROC_BROWSER_TEST_F( |
| 772 SubresourceFilterBrowserTest, |
| 773 ExpectRedirectPatternHistogramsAreRecordedForSubresourceFilterOnlyMatch) { |
| 774 ASSERT_NO_FATAL_FAILURE(SetRulesetToDisallowURLsWithPathSuffix( |
| 775 "suffix-that-does-not-match-anything")); |
| 776 |
| 777 GURL url(GetTestUrl("subresource_filter/frame_with_included_script.html")); |
| 778 ConfigureAsSubresourceFilterOnlyURL(url); |
| 779 |
| 780 base::HistogramTester tester; |
| 781 ui_test_utils::NavigateToURL(browser(), url); |
| 782 |
| 783 EXPECT_THAT(tester.GetAllSamples(std::string(kMatchesPatternHistogramName) + |
| 784 std::string(kSubresourceFilterOnlySuffix)), |
| 785 ::testing::ElementsAre(base::Bucket(NO_REDIRECTS_HIT, 1))); |
| 786 EXPECT_THAT(tester.GetAllSamples(std::string(kNavigationChainSize) + |
| 787 std::string(kSubresourceFilterOnlySuffix)), |
| 788 ::testing::ElementsAre(base::Bucket(1, 1))); |
| 789 } |
| 790 |
| 791 IN_PROC_BROWSER_TEST_F( |
| 792 SubresourceFilterBrowserTest, |
| 793 ExpectRedirectPatternHistogramsAreRecordedForSubresourceFilterOnlyWithRedire
cts) { |
| 794 ASSERT_NO_FATAL_FAILURE( |
| 795 SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); |
| 796 std::string initial_host("a.com"); |
| 797 std::string redirected_host("b.com"); |
| 798 |
| 799 GURL redirect_url(embedded_test_server()->GetURL(redirected_host, "/")); |
| 800 GURL url(embedded_test_server()->GetURL( |
| 801 initial_host, "/client-redirect?" + redirect_url.spec())); |
| 802 |
| 803 ConfigureAsSubresourceFilterOnlyURL(redirect_url); |
| 804 base::HistogramTester tester; |
| 805 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), url, 2); |
| 806 EXPECT_THAT(tester.GetAllSamples(std::string(kMatchesPatternHistogramName) + |
| 807 std::string(kSubresourceFilterOnlySuffix)), |
| 808 ::testing::ElementsAre(base::Bucket(NO_REDIRECTS_HIT, 1))); |
| 809 |
| 810 EXPECT_THAT(tester.GetAllSamples(std::string(kNavigationChainSize) + |
| 811 std::string(kSubresourceFilterOnlySuffix)), |
| 812 ::testing::ElementsAre(base::Bucket(1, 1))); |
| 813 } |
| 814 |
| 815 IN_PROC_BROWSER_TEST_F( |
| 816 SubresourceFilterBrowserTest, |
| 817 ExpectRedirectPatternHistogramsAreRecordedForSubresourceFilterOnlyRedirectMa
tch) { |
| 818 ASSERT_NO_FATAL_FAILURE( |
| 819 SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); |
| 820 std::string initial_host("a.com"); |
| 821 std::string redirected_host("b.com"); |
| 822 |
| 823 GURL redirect_url(embedded_test_server()->GetURL( |
| 824 redirected_host, "/subresource_filter/frame_with_included_script.html")); |
| 825 GURL url(embedded_test_server()->GetURL( |
| 826 initial_host, "/client-redirect?" + redirect_url.spec())); |
| 827 |
| 828 ConfigureAsSubresourceFilterOnlyURL(GURL(url.host())); |
| 829 base::HistogramTester tester; |
| 830 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), url, 2); |
| 831 EXPECT_THAT(tester.GetAllSamples(std::string(kMatchesPatternHistogramName) + |
| 832 std::string(kSubresourceFilterOnlySuffix)), |
| 833 ::testing::IsEmpty()); |
| 834 |
| 835 EXPECT_THAT(tester.GetAllSamples(std::string(kNavigationChainSize) + |
| 836 std::string(kSubresourceFilterOnlySuffix)), |
| 837 ::testing::IsEmpty()); |
| 838 } |
| 839 |
| 729 } // namespace subresource_filter | 840 } // namespace subresource_filter |
| OLD | NEW |