| 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" |
| 11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 12 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
| 13 #include "base/location.h" | 13 #include "base/location.h" |
| 14 #include "base/macros.h" | 14 #include "base/macros.h" |
| 15 #include "base/memory/ptr_util.h" | 15 #include "base/memory/ptr_util.h" |
| 16 #include "base/path_service.h" | 16 #include "base/path_service.h" |
| 17 #include "base/strings/string_piece.h" | 17 #include "base/strings/string_piece.h" |
| 18 #include "base/strings/string_util.h" |
| 18 #include "base/strings/stringprintf.h" | 19 #include "base/strings/stringprintf.h" |
| 19 #include "base/test/histogram_tester.h" | 20 #include "base/test/histogram_tester.h" |
| 20 #include "chrome/browser/browser_process.h" | 21 #include "chrome/browser/browser_process.h" |
| 21 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" | 22 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" |
| 22 #include "chrome/browser/metrics/subprocess_metrics_provider.h" | 23 #include "chrome/browser/metrics/subprocess_metrics_provider.h" |
| 23 #include "chrome/browser/page_load_metrics/observers/subresource_filter_metrics_
observer.h" | 24 #include "chrome/browser/page_load_metrics/observers/subresource_filter_metrics_
observer.h" |
| 24 #include "chrome/browser/safe_browsing/test_safe_browsing_service.h" | 25 #include "chrome/browser/safe_browsing/test_safe_browsing_service.h" |
| 26 #include "chrome/browser/safe_browsing/v4_test_utils.h" |
| 25 #include "chrome/browser/subresource_filter/test_ruleset_publisher.h" | 27 #include "chrome/browser/subresource_filter/test_ruleset_publisher.h" |
| 26 #include "chrome/browser/ui/browser.h" | 28 #include "chrome/browser/ui/browser.h" |
| 27 #include "chrome/browser/ui/browser_commands.h" | 29 #include "chrome/browser/ui/browser_commands.h" |
| 28 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 30 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 29 #include "chrome/common/chrome_paths.h" | 31 #include "chrome/common/chrome_paths.h" |
| 30 #include "chrome/common/url_constants.h" | 32 #include "chrome/common/url_constants.h" |
| 31 #include "chrome/test/base/in_process_browser_test.h" | 33 #include "chrome/test/base/in_process_browser_test.h" |
| 32 #include "chrome/test/base/ui_test_utils.h" | 34 #include "chrome/test/base/ui_test_utils.h" |
| 33 #include "components/content_settings/core/browser/host_content_settings_map.h" | 35 #include "components/content_settings/core/browser/host_content_settings_map.h" |
| 34 #include "components/content_settings/core/common/content_settings.h" | 36 #include "components/content_settings/core/common/content_settings.h" |
| 35 #include "components/safe_browsing_db/test_database_manager.h" | 37 #include "components/safe_browsing_db/test_database_manager.h" |
| 36 #include "components/safe_browsing_db/util.h" | 38 #include "components/safe_browsing_db/util.h" |
| 39 #include "components/safe_browsing_db/v4_database.h" |
| 37 #include "components/security_interstitials/content/unsafe_resource.h" | 40 #include "components/security_interstitials/content/unsafe_resource.h" |
| 38 #include "components/subresource_filter/content/browser/async_document_subresour
ce_filter.h" | 41 #include "components/subresource_filter/content/browser/async_document_subresour
ce_filter.h" |
| 39 #include "components/subresource_filter/content/browser/async_document_subresour
ce_filter_test_utils.h" | 42 #include "components/subresource_filter/content/browser/async_document_subresour
ce_filter_test_utils.h" |
| 40 #include "components/subresource_filter/content/browser/content_ruleset_service.
h" | 43 #include "components/subresource_filter/content/browser/content_ruleset_service.
h" |
| 41 #include "components/subresource_filter/content/browser/content_subresource_filt
er_driver_factory.h" | 44 #include "components/subresource_filter/content/browser/content_subresource_filt
er_driver_factory.h" |
| 42 #include "components/subresource_filter/core/browser/subresource_filter_features
.h" | 45 #include "components/subresource_filter/core/browser/subresource_filter_features
.h" |
| 43 #include "components/subresource_filter/core/browser/subresource_filter_features
_test_support.h" | 46 #include "components/subresource_filter/core/browser/subresource_filter_features
_test_support.h" |
| 44 #include "components/subresource_filter/core/common/activation_level.h" | 47 #include "components/subresource_filter/core/common/activation_level.h" |
| 45 #include "components/subresource_filter/core/common/activation_state.h" | 48 #include "components/subresource_filter/core/common/activation_state.h" |
| 46 #include "components/subresource_filter/core/common/scoped_timers.h" | 49 #include "components/subresource_filter/core/common/scoped_timers.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 60 #include "net/test/spawned_test_server/spawned_test_server.h" | 63 #include "net/test/spawned_test_server/spawned_test_server.h" |
| 61 #include "net/test/test_data_directory.h" | 64 #include "net/test/test_data_directory.h" |
| 62 #include "testing/gmock/include/gmock/gmock.h" | 65 #include "testing/gmock/include/gmock/gmock.h" |
| 63 #include "testing/gtest/include/gtest/gtest.h" | 66 #include "testing/gtest/include/gtest/gtest.h" |
| 64 #include "url/gurl.h" | 67 #include "url/gurl.h" |
| 65 | 68 |
| 66 namespace { | 69 namespace { |
| 67 | 70 |
| 68 // The path to a multi-frame document used for tests. | 71 // The path to a multi-frame document used for tests. |
| 69 static constexpr const char kTestFrameSetPath[] = | 72 static constexpr const char kTestFrameSetPath[] = |
| 70 "subresource_filter/frame_set.html"; | 73 "/subresource_filter/frame_set.html"; |
| 71 | 74 |
| 72 // Names of DocumentLoad histograms. | 75 // Names of DocumentLoad histograms. |
| 73 constexpr const char kDocumentLoadActivationLevel[] = | 76 constexpr const char kDocumentLoadActivationLevel[] = |
| 74 "SubresourceFilter.DocumentLoad.ActivationState"; | 77 "SubresourceFilter.DocumentLoad.ActivationState"; |
| 75 constexpr const char kSubresourceLoadsTotal[] = | 78 constexpr const char kSubresourceLoadsTotal[] = |
| 76 "SubresourceFilter.DocumentLoad.NumSubresourceLoads.Total"; | 79 "SubresourceFilter.DocumentLoad.NumSubresourceLoads.Total"; |
| 77 constexpr const char kSubresourceLoadsEvaluated[] = | 80 constexpr const char kSubresourceLoadsEvaluated[] = |
| 78 "SubresourceFilter.DocumentLoad.NumSubresourceLoads.Evaluated"; | 81 "SubresourceFilter.DocumentLoad.NumSubresourceLoads.Evaluated"; |
| 79 constexpr const char kSubresourceLoadsMatchedRules[] = | 82 constexpr const char kSubresourceLoadsMatchedRules[] = |
| 80 "SubresourceFilter.DocumentLoad.NumSubresourceLoads.MatchedRules"; | 83 "SubresourceFilter.DocumentLoad.NumSubresourceLoads.MatchedRules"; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 101 "SubresourceFilter.PageLoad.SubresourceEvaluation.TotalCPUDuration"; | 104 "SubresourceFilter.PageLoad.SubresourceEvaluation.TotalCPUDuration"; |
| 102 constexpr const char kEvaluationTotalWallDurationForDocument[] = | 105 constexpr const char kEvaluationTotalWallDurationForDocument[] = |
| 103 "SubresourceFilter.DocumentLoad.SubresourceEvaluation.TotalWallDuration"; | 106 "SubresourceFilter.DocumentLoad.SubresourceEvaluation.TotalWallDuration"; |
| 104 constexpr const char kEvaluationTotalCPUDurationForDocument[] = | 107 constexpr const char kEvaluationTotalCPUDurationForDocument[] = |
| 105 "SubresourceFilter.DocumentLoad.SubresourceEvaluation.TotalCPUDuration"; | 108 "SubresourceFilter.DocumentLoad.SubresourceEvaluation.TotalCPUDuration"; |
| 106 constexpr const char kEvaluationWallDuration[] = | 109 constexpr const char kEvaluationWallDuration[] = |
| 107 "SubresourceFilter.SubresourceLoad.Evaluation.WallDuration"; | 110 "SubresourceFilter.SubresourceLoad.Evaluation.WallDuration"; |
| 108 constexpr const char kEvaluationCPUDuration[] = | 111 constexpr const char kEvaluationCPUDuration[] = |
| 109 "SubresourceFilter.SubresourceLoad.Evaluation.CPUDuration"; | 112 "SubresourceFilter.SubresourceLoad.Evaluation.CPUDuration"; |
| 110 | 113 |
| 114 #if defined(GOOGLE_CHROME_BUILD) |
| 115 // Names of navigation chain patterns histogram. |
| 116 const char kMatchesPatternHistogramName[] = |
| 117 "SubresourceFilter.PageLoad.RedirectChainMatchPattern"; |
| 118 const char kNavigationChainSize[] = |
| 119 "SubresourceFilter.PageLoad.RedirectChainLength"; |
| 120 const char kSubresourceFilterOnlySuffix[] = ".SubresourceFilterOnly"; |
| 121 #endif |
| 122 |
| 111 // Other histograms. | 123 // Other histograms. |
| 112 const char kSubresourceFilterPromptHistogram[] = | 124 const char kSubresourceFilterPromptHistogram[] = |
| 113 "SubresourceFilter.Prompt.NumVisibility"; | 125 "SubresourceFilter.Prompt.NumVisibility"; |
| 114 | 126 |
| 115 // Database manager that allows any URL to be configured as blacklisted for | 127 // Human readable representation of expected redirect chain match patterns. |
| 116 // testing. | 128 // The explanations for the buckets given for the following redirect chain: |
| 117 class FakeSafeBrowsingDatabaseManager | 129 // A->B->C->D, where A is initial URL and D is a final URL. |
| 118 : public safe_browsing::TestSafeBrowsingDatabaseManager { | 130 enum RedirectChainMatchPattern { |
| 119 public: | 131 EMPTY, // No histograms were recorded. |
| 120 FakeSafeBrowsingDatabaseManager() {} | 132 F0M0L1, // D is a Safe Browsing match. |
| 121 | 133 F0M1L0, // B or C, or both are Safe Browsing matches. |
| 122 void AddBlacklistedURL(const GURL& url, | 134 F0M1L1, // B or C, or both and D are Safe Browsing matches. |
| 123 safe_browsing::SBThreatType threat_type) { | 135 F1M0L0, // A is Safe Browsing match |
| 124 url_to_threat_type_[url] = threat_type; | 136 F1M0L1, // A and D are Safe Browsing matches. |
| 125 } | 137 F1M1L0, // B and/or C and A are Safe Browsing matches. |
| 126 | 138 F1M1L1, // B and/or C and A and D are Safe Browsing matches. |
| 127 protected: | 139 NO_REDIRECTS_HIT, // Redirect chain consists of single URL, aka no redirects |
| 128 ~FakeSafeBrowsingDatabaseManager() override {} | 140 // has happened, and this URL was a Safe Browsing hit. |
| 129 | 141 NUM_HIT_PATTERNS, |
| 130 bool CheckBrowseUrl(const GURL& url, Client* client) override { | |
| 131 if (!url_to_threat_type_.count(url)) | |
| 132 return true; | |
| 133 | |
| 134 content::BrowserThread::PostTask( | |
| 135 content::BrowserThread::IO, FROM_HERE, | |
| 136 base::Bind(&Client::OnCheckBrowseUrlResult, base::Unretained(client), | |
| 137 url, url_to_threat_type_[url], | |
| 138 safe_browsing::ThreatMetadata())); | |
| 139 return false; | |
| 140 } | |
| 141 | |
| 142 bool CheckResourceUrl(const GURL& url, Client* client) override { | |
| 143 return true; | |
| 144 } | |
| 145 | |
| 146 bool IsSupported() const override { return true; } | |
| 147 bool ChecksAreAlwaysAsync() const override { return false; } | |
| 148 bool CanCheckResourceType( | |
| 149 content::ResourceType /* resource_type */) const override { | |
| 150 return true; | |
| 151 } | |
| 152 | |
| 153 safe_browsing::ThreatSource GetThreatSource() const override { | |
| 154 return safe_browsing::ThreatSource::LOCAL_PVER4; | |
| 155 } | |
| 156 | |
| 157 bool CheckExtensionIDs(const std::set<std::string>& extension_ids, | |
| 158 Client* client) override { | |
| 159 return true; | |
| 160 } | |
| 161 | |
| 162 private: | |
| 163 std::map<GURL, safe_browsing::SBThreatType> url_to_threat_type_; | |
| 164 | |
| 165 DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingDatabaseManager); | |
| 166 }; | 142 }; |
| 167 | 143 |
| 168 // UI manager that never actually shows any interstitials, but emulates as if | 144 // UI manager that never actually shows any interstitials, but emulates as if |
| 169 // the user chose to proceed through them. | 145 // the user chose to proceed through them. |
| 170 class FakeSafeBrowsingUIManager | 146 class FakeSafeBrowsingUIManager |
| 171 : public safe_browsing::TestSafeBrowsingUIManager { | 147 : public safe_browsing::TestSafeBrowsingUIManager { |
| 172 public: | 148 public: |
| 173 FakeSafeBrowsingUIManager() {} | 149 FakeSafeBrowsingUIManager() {} |
| 174 | 150 |
| 175 protected: | 151 protected: |
| 176 ~FakeSafeBrowsingUIManager() override {} | 152 ~FakeSafeBrowsingUIManager() override {} |
| 177 | 153 |
| 178 void DisplayBlockingPage(const UnsafeResource& resource) override { | 154 void DisplayBlockingPage(const UnsafeResource& resource) override { |
| 179 resource.callback_thread->PostTask( | 155 resource.callback_thread->PostTask( |
| 180 FROM_HERE, base::Bind(resource.callback, true /* proceed */)); | 156 FROM_HERE, base::Bind(resource.callback, true /* proceed */)); |
| 181 } | 157 } |
| 182 | 158 |
| 183 private: | 159 private: |
| 184 DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingUIManager); | 160 DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingUIManager); |
| 185 }; | 161 }; |
| 186 | 162 |
| 187 GURL GetURLWithFragment(const GURL& url, base::StringPiece fragment) { | 163 GURL GetURLWithFragment(const GURL& url, base::StringPiece fragment) { |
| 188 GURL::Replacements replacements; | 164 GURL::Replacements replacements; |
| 189 replacements.SetRefStr(fragment); | 165 replacements.SetRefStr(fragment); |
| 190 return url.ReplaceComponents(replacements); | 166 return url.ReplaceComponents(replacements); |
| 191 } | 167 } |
| 192 | 168 |
| 193 GURL GetURLWithQuery(const GURL& url, base::StringPiece query) { | |
| 194 GURL::Replacements replacements; | |
| 195 replacements.SetQueryStr(query); | |
| 196 return url.ReplaceComponents(replacements); | |
| 197 } | |
| 198 | |
| 199 } // namespace | 169 } // namespace |
| 200 | 170 |
| 201 namespace subresource_filter { | 171 namespace subresource_filter { |
| 202 | 172 |
| 203 using subresource_filter::testing::ScopedSubresourceFilterFeatureToggle; | 173 using subresource_filter::testing::ScopedSubresourceFilterFeatureToggle; |
| 204 using subresource_filter::testing::TestRulesetPublisher; | 174 using subresource_filter::testing::TestRulesetPublisher; |
| 205 using subresource_filter::testing::TestRulesetCreator; | 175 using subresource_filter::testing::TestRulesetCreator; |
| 206 using subresource_filter::testing::TestRulesetPair; | 176 using subresource_filter::testing::TestRulesetPair; |
| 207 using ActivationDecision = | 177 using ActivationDecision = |
| 208 ContentSubresourceFilterDriverFactory::ActivationDecision; | 178 ContentSubresourceFilterDriverFactory::ActivationDecision; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 232 // called after ChromeBrowserMainParts::PreBrowserStart(), which instantiates | 202 // called after ChromeBrowserMainParts::PreBrowserStart(), which instantiates |
| 233 // the RulesetService. | 203 // the RulesetService. |
| 234 // | 204 // |
| 235 // On the other hand, setting up field trials in this method would be too | 205 // On the other hand, setting up field trials in this method would be too |
| 236 // early, as it is called before BrowserMain, which expects no FieldTrialList | 206 // early, as it is called before BrowserMain, which expects no FieldTrialList |
| 237 // singleton to exist. There are no other hooks we could use either. | 207 // singleton to exist. There are no other hooks we could use either. |
| 238 // | 208 // |
| 239 // As a workaround, enable the feature here, then enable the feature once | 209 // As a workaround, enable the feature here, then enable the feature once |
| 240 // again + set up the field trials later. | 210 // again + set up the field trials later. |
| 241 void SetUpCommandLine(base::CommandLine* command_line) override { | 211 void SetUpCommandLine(base::CommandLine* command_line) override { |
| 242 command_line->AppendSwitchASCII(switches::kEnableFeatures, | 212 command_line->AppendSwitchASCII( |
| 243 kSafeBrowsingSubresourceFilter.name); | 213 switches::kEnableFeatures, |
| 214 base::JoinString( |
| 215 {kSafeBrowsingSubresourceFilter.name, "SafeBrowsingV4OnlyEnabled", |
| 216 kSubresourceFilterSafeBrowsingActivationThrottle.name}, |
| 217 ",")); |
| 244 } | 218 } |
| 245 | 219 |
| 246 void SetUpInProcessBrowserTestFixture() override { | 220 void SetUp() override { |
| 247 fake_safe_browsing_database_ = new FakeSafeBrowsingDatabaseManager(); | 221 sb_factory_ = |
| 248 test_safe_browsing_factory_.SetTestDatabaseManager( | 222 base::MakeUnique<safe_browsing::TestSafeBrowsingServiceFactory>( |
| 249 fake_safe_browsing_database_.get()); | 223 safe_browsing::V4FeatureList::V4UsageStatus::V4_ONLY); |
| 250 test_safe_browsing_factory_.SetTestUIManager(new FakeSafeBrowsingUIManager); | 224 sb_factory_->SetTestUIManager(new FakeSafeBrowsingUIManager()); |
| 251 safe_browsing::SafeBrowsingService::RegisterFactory( | 225 safe_browsing::SafeBrowsingService::RegisterFactory(sb_factory_.get()); |
| 252 &test_safe_browsing_factory_); | 226 |
| 227 safe_browsing::V4Database::RegisterStoreFactoryForTest( |
| 228 base::WrapUnique(new safe_browsing::TestV4StoreFactory())); |
| 229 |
| 230 v4_db_factory_ = new safe_browsing::TestV4DatabaseFactory(); |
| 231 safe_browsing::V4Database::RegisterDatabaseFactoryForTest( |
| 232 base::WrapUnique(v4_db_factory_)); |
| 233 |
| 234 v4_get_hash_factory_ = |
| 235 new safe_browsing::TestV4GetHashProtocolManagerFactory(); |
| 236 safe_browsing::V4GetHashProtocolManager::RegisterFactory( |
| 237 base::WrapUnique(v4_get_hash_factory_)); |
| 238 InProcessBrowserTest::SetUp(); |
| 239 } |
| 240 |
| 241 void TearDown() override { |
| 242 InProcessBrowserTest::TearDown(); |
| 243 // Unregister test factories after InProcessBrowserTest::TearDown |
| 244 // (which destructs SafeBrowsingService). |
| 245 safe_browsing::V4GetHashProtocolManager::RegisterFactory(nullptr); |
| 246 safe_browsing::V4Database::RegisterDatabaseFactoryForTest(nullptr); |
| 247 safe_browsing::V4Database::RegisterStoreFactoryForTest(nullptr); |
| 248 safe_browsing::SafeBrowsingService::RegisterFactory(nullptr); |
| 253 } | 249 } |
| 254 | 250 |
| 255 void SetUpOnMainThread() override { | 251 void SetUpOnMainThread() override { |
| 256 scoped_feature_toggle_.reset(new ScopedSubresourceFilterFeatureToggle( | 252 SetUpActivationFeature(); |
| 257 base::FeatureList::OVERRIDE_ENABLE_FEATURE, kActivationLevelEnabled, | |
| 258 kActivationScopeActivationList, kActivationListPhishingInterstitial, | |
| 259 measure_performance_ ? "1" : "0", "" /* suppress_notifications */, | |
| 260 whitelist_site_on_reload_ ? "true" : "false")); | |
| 261 | |
| 262 base::FilePath test_data_dir; | 253 base::FilePath test_data_dir; |
| 263 PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir); | 254 PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir); |
| 264 embedded_test_server()->ServeFilesFromDirectory(test_data_dir); | 255 embedded_test_server()->ServeFilesFromDirectory(test_data_dir); |
| 265 host_resolver()->AddSimulatedFailure("host-with-dns-lookup-failure"); | 256 host_resolver()->AddSimulatedFailure("host-with-dns-lookup-failure"); |
| 266 host_resolver()->AddRule("*", "127.0.0.1"); | 257 host_resolver()->AddRule("*", "127.0.0.1"); |
| 267 content::SetupCrossSiteRedirector(embedded_test_server()); | 258 content::SetupCrossSiteRedirector(embedded_test_server()); |
| 268 ASSERT_TRUE(embedded_test_server()->Start()); | 259 ASSERT_TRUE(embedded_test_server()->Start()); |
| 269 } | 260 } |
| 270 | 261 |
| 262 virtual void SetUpActivationFeature() { |
| 263 scoped_feature_toggle_.reset(new ScopedSubresourceFilterFeatureToggle( |
| 264 base::FeatureList::OVERRIDE_ENABLE_FEATURE, kActivationLevelEnabled, |
| 265 kActivationScopeActivationList, kActivationListPhishingInterstitial, |
| 266 measure_performance_ ? "1" : "0", "" /* suppress_notifications */, |
| 267 whitelist_site_on_reload_ ? "true" : "false")); |
| 268 } |
| 269 |
| 271 GURL GetTestUrl(const std::string& relative_url) { | 270 GURL GetTestUrl(const std::string& relative_url) { |
| 272 return embedded_test_server()->base_url().Resolve(relative_url); | 271 return embedded_test_server()->base_url().Resolve(relative_url); |
| 273 } | 272 } |
| 274 | 273 |
| 274 void MarkUrlAsMatchingListWithId( |
| 275 const GURL& bad_url, |
| 276 const safe_browsing::ListIdentifier& list_id, |
| 277 safe_browsing::ThreatPatternType threat_pattern_type) { |
| 278 safe_browsing::FullHashInfo full_hash_info = |
| 279 GetFullHashInfoWithMetadata(bad_url, list_id, threat_pattern_type); |
| 280 v4_db_factory_->MarkPrefixAsBad(list_id, full_hash_info.full_hash); |
| 281 v4_get_hash_factory_->AddToFullHashCache(full_hash_info); |
| 282 } |
| 283 |
| 275 void ConfigureAsPhishingURL(const GURL& url) { | 284 void ConfigureAsPhishingURL(const GURL& url) { |
| 276 fake_safe_browsing_database_->AddBlacklistedURL( | 285 MarkUrlAsMatchingListWithId(url, safe_browsing::GetUrlSocEngId(), |
| 277 url, safe_browsing::SB_THREAT_TYPE_URL_PHISHING); | 286 safe_browsing::ThreatPatternType::NONE); |
| 287 } |
| 288 |
| 289 void ConfigureAsSubresourceFilterOnlyURL(const GURL& url) { |
| 290 MarkUrlAsMatchingListWithId(url, safe_browsing::GetUrlSubresourceFilterId(), |
| 291 safe_browsing::ThreatPatternType::NONE); |
| 278 } | 292 } |
| 279 | 293 |
| 280 content::WebContents* web_contents() { | 294 content::WebContents* web_contents() { |
| 281 return browser()->tab_strip_model()->GetActiveWebContents(); | 295 return browser()->tab_strip_model()->GetActiveWebContents(); |
| 282 } | 296 } |
| 283 | 297 |
| 284 content::RenderFrameHost* FindFrameByName(const std::string& name) { | 298 content::RenderFrameHost* FindFrameByName(const std::string& name) { |
| 285 for (content::RenderFrameHost* frame : web_contents()->GetAllFrames()) { | 299 for (content::RenderFrameHost* frame : web_contents()->GetAllFrames()) { |
| 286 if (frame->GetFrameName() == name) | 300 if (frame->GetFrameName() == name) |
| 287 return frame; | 301 return frame; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 test_ruleset_publisher_.SetRuleset(test_ruleset_pair.unindexed)); | 355 test_ruleset_publisher_.SetRuleset(test_ruleset_pair.unindexed)); |
| 342 } | 356 } |
| 343 | 357 |
| 344 void SetRulesetWithRules(const std::vector<proto::UrlRule>& rules) { | 358 void SetRulesetWithRules(const std::vector<proto::UrlRule>& rules) { |
| 345 TestRulesetPair test_ruleset_pair; | 359 TestRulesetPair test_ruleset_pair; |
| 346 ruleset_creator_.CreateRulesetWithRules(rules, &test_ruleset_pair); | 360 ruleset_creator_.CreateRulesetWithRules(rules, &test_ruleset_pair); |
| 347 ASSERT_NO_FATAL_FAILURE( | 361 ASSERT_NO_FATAL_FAILURE( |
| 348 test_ruleset_publisher_.SetRuleset(test_ruleset_pair.unindexed)); | 362 test_ruleset_publisher_.SetRuleset(test_ruleset_pair.unindexed)); |
| 349 } | 363 } |
| 350 | 364 |
| 365 void set_scoped_feature_toggle(ScopedSubresourceFilterFeatureToggle* toggle) { |
| 366 scoped_feature_toggle_.reset(toggle); |
| 367 } |
| 368 |
| 351 private: | 369 private: |
| 352 TestRulesetCreator ruleset_creator_; | 370 TestRulesetCreator ruleset_creator_; |
| 353 safe_browsing::TestSafeBrowsingServiceFactory test_safe_browsing_factory_; | |
| 354 scoped_refptr<FakeSafeBrowsingDatabaseManager> fake_safe_browsing_database_; | |
| 355 | 371 |
| 356 std::unique_ptr<ScopedSubresourceFilterFeatureToggle> scoped_feature_toggle_; | 372 std::unique_ptr<ScopedSubresourceFilterFeatureToggle> scoped_feature_toggle_; |
| 357 TestRulesetPublisher test_ruleset_publisher_; | 373 TestRulesetPublisher test_ruleset_publisher_; |
| 358 const bool measure_performance_; | 374 const bool measure_performance_; |
| 359 const bool whitelist_site_on_reload_; | 375 const bool whitelist_site_on_reload_; |
| 360 | 376 |
| 377 std::unique_ptr<safe_browsing::TestSafeBrowsingServiceFactory> sb_factory_; |
| 378 // Owned by the V4Database. |
| 379 safe_browsing::TestV4DatabaseFactory* v4_db_factory_; |
| 380 // Owned by the V4GetHashProtocolManager. |
| 381 safe_browsing::TestV4GetHashProtocolManagerFactory* v4_get_hash_factory_; |
| 382 |
| 361 DISALLOW_COPY_AND_ASSIGN(SubresourceFilterBrowserTestImpl); | 383 DISALLOW_COPY_AND_ASSIGN(SubresourceFilterBrowserTestImpl); |
| 362 }; | 384 }; |
| 363 | 385 |
| 364 class SubresourceFilterBrowserTest : public SubresourceFilterBrowserTestImpl { | 386 class SubresourceFilterBrowserTest : public SubresourceFilterBrowserTestImpl { |
| 365 public: | 387 public: |
| 366 SubresourceFilterBrowserTest() | 388 SubresourceFilterBrowserTest() |
| 367 : SubresourceFilterBrowserTestImpl(false, false) {} | 389 : SubresourceFilterBrowserTestImpl(false, false) {} |
| 368 }; | 390 }; |
| 369 | 391 |
| 370 // TODO(pkalinnikov): It should be possible to have only one fixture, i.e., | 392 // TODO(pkalinnikov): It should be possible to have only one fixture, i.e., |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 browser()->tab_strip_model()->GetActiveWebContents(), | 444 browser()->tab_strip_model()->GetActiveWebContents(), |
| 423 base::StringPrintf("connectWebSocket('%s');", url.spec().c_str()), | 445 base::StringPrintf("connectWebSocket('%s');", url.spec().c_str()), |
| 424 &websocket_connection_succeeded)); | 446 &websocket_connection_succeeded)); |
| 425 EXPECT_EQ(expect_connection_success, websocket_connection_succeeded); | 447 EXPECT_EQ(expect_connection_success, websocket_connection_succeeded); |
| 426 } | 448 } |
| 427 | 449 |
| 428 private: | 450 private: |
| 429 std::unique_ptr<net::SpawnedTestServer> websocket_test_server_; | 451 std::unique_ptr<net::SpawnedTestServer> websocket_test_server_; |
| 430 }; | 452 }; |
| 431 | 453 |
| 454 #if defined(GOOGLE_CHROME_BUILD) |
| 455 class SubresourceFilterListBrowserTest |
| 456 : public SubresourceFilterBrowserTestImpl { |
| 457 public: |
| 458 SubresourceFilterListBrowserTest() |
| 459 : SubresourceFilterBrowserTestImpl(false, false) {} |
| 460 |
| 461 void SetUpActivationFeature() override { |
| 462 set_scoped_feature_toggle(new ScopedSubresourceFilterFeatureToggle( |
| 463 base::FeatureList::OVERRIDE_ENABLE_FEATURE, kActivationLevelEnabled, |
| 464 kActivationScopeActivationList, kActivationListSubresourceFilter, "0", |
| 465 "" /* suppress_notifications */, "false")); |
| 466 } |
| 467 }; |
| 468 #endif |
| 469 |
| 432 // Tests ----------------------------------------------------------------------- | 470 // Tests ----------------------------------------------------------------------- |
| 433 | 471 |
| 434 IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, MainFrameActivation) { | 472 IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, MainFrameActivation) { |
| 435 GURL url(GetTestUrl("subresource_filter/frame_with_included_script.html")); | 473 GURL url(GetTestUrl("subresource_filter/frame_with_included_script.html")); |
| 436 ConfigureAsPhishingURL(url); | 474 ConfigureAsPhishingURL(url); |
| 437 ASSERT_NO_FATAL_FAILURE(SetRulesetToDisallowURLsWithPathSuffix( | 475 ASSERT_NO_FATAL_FAILURE(SetRulesetToDisallowURLsWithPathSuffix( |
| 438 "suffix-that-does-not-match-anything")); | 476 "suffix-that-does-not-match-anything")); |
| 439 ui_test_utils::NavigateToURL(browser(), url); | 477 ui_test_utils::NavigateToURL(browser(), url); |
| 440 EXPECT_TRUE(WasParsedScriptElementLoaded(web_contents()->GetMainFrame())); | 478 EXPECT_TRUE(WasParsedScriptElementLoaded(web_contents()->GetMainFrame())); |
| 441 | 479 |
| 442 ASSERT_NO_FATAL_FAILURE( | 480 ASSERT_NO_FATAL_FAILURE( |
| 443 SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); | 481 SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); |
| 444 ui_test_utils::NavigateToURL(browser(), url); | 482 ui_test_utils::NavigateToURL(browser(), url); |
| 445 EXPECT_FALSE(WasParsedScriptElementLoaded(web_contents()->GetMainFrame())); | 483 EXPECT_FALSE(WasParsedScriptElementLoaded(web_contents()->GetMainFrame())); |
| 446 | 484 |
| 447 // The main frame document should never be filtered. | 485 // The main frame document should never be filtered. |
| 448 SetRulesetToDisallowURLsWithPathSuffix("frame_with_included_script.html"); | 486 SetRulesetToDisallowURLsWithPathSuffix("frame_with_included_script.html"); |
| 449 ui_test_utils::NavigateToURL(browser(), url); | 487 ui_test_utils::NavigateToURL(browser(), url); |
| 450 EXPECT_TRUE(WasParsedScriptElementLoaded(web_contents()->GetMainFrame())); | 488 EXPECT_TRUE(WasParsedScriptElementLoaded(web_contents()->GetMainFrame())); |
| 451 } | 489 } |
| 452 | 490 |
| 491 #if defined(GOOGLE_CHROME_BUILD) |
| 492 IN_PROC_BROWSER_TEST_F(SubresourceFilterListBrowserTest, MainFrameActivation) { |
| 493 GURL url(GetTestUrl("subresource_filter/frame_with_included_script.html")); |
| 494 ConfigureAsSubresourceFilterOnlyURL(url); |
| 495 ASSERT_NO_FATAL_FAILURE(SetRulesetToDisallowURLsWithPathSuffix( |
| 496 "suffix-that-does-not-match-anything")); |
| 497 ui_test_utils::NavigateToURL(browser(), url); |
| 498 EXPECT_TRUE(WasParsedScriptElementLoaded(web_contents()->GetMainFrame())); |
| 499 |
| 500 ASSERT_NO_FATAL_FAILURE( |
| 501 SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); |
| 502 ui_test_utils::NavigateToURL(browser(), url); |
| 503 EXPECT_FALSE(WasParsedScriptElementLoaded(web_contents()->GetMainFrame())); |
| 504 |
| 505 // The main frame document should never be filtered. |
| 506 SetRulesetToDisallowURLsWithPathSuffix("frame_with_included_script.html"); |
| 507 ui_test_utils::NavigateToURL(browser(), url); |
| 508 EXPECT_TRUE(WasParsedScriptElementLoaded(web_contents()->GetMainFrame())); |
| 509 } |
| 510 #endif |
| 511 |
| 453 // There should be no document-level de-/reactivation happening on the renderer | 512 // There should be no document-level de-/reactivation happening on the renderer |
| 454 // side as a result of an in-page navigation. | 513 // side as a result of an in-page navigation. |
| 455 IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, | 514 IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, |
| 456 DocumentActivationOutlivesSamePageNavigation) { | 515 DocumentActivationOutlivesSamePageNavigation) { |
| 457 GURL url(GetTestUrl("subresource_filter/frame_with_delayed_script.html")); | 516 GURL url(GetTestUrl("subresource_filter/frame_with_delayed_script.html")); |
| 458 ConfigureAsPhishingURL(url); | 517 ConfigureAsPhishingURL(url); |
| 459 ASSERT_NO_FATAL_FAILURE( | 518 ASSERT_NO_FATAL_FAILURE( |
| 460 SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); | 519 SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); |
| 461 ui_test_utils::NavigateToURL(browser(), url); | 520 ui_test_utils::NavigateToURL(browser(), url); |
| 462 | 521 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 482 const std::vector<const char*> kSubframeNames{"one", "two", "three"}; | 541 const std::vector<const char*> kSubframeNames{"one", "two", "three"}; |
| 483 const std::vector<bool> kExpectScriptInFrameToLoad{false, true, false}; | 542 const std::vector<bool> kExpectScriptInFrameToLoad{false, true, false}; |
| 484 ASSERT_NO_FATAL_FAILURE(ExpectParsedScriptElementLoadedStatusInFrames( | 543 ASSERT_NO_FATAL_FAILURE(ExpectParsedScriptElementLoadedStatusInFrames( |
| 485 kSubframeNames, kExpectScriptInFrameToLoad)); | 544 kSubframeNames, kExpectScriptInFrameToLoad)); |
| 486 | 545 |
| 487 tester.ExpectBucketCount(kSubresourceFilterPromptHistogram, true, 1); | 546 tester.ExpectBucketCount(kSubresourceFilterPromptHistogram, true, 1); |
| 488 } | 547 } |
| 489 | 548 |
| 490 IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, | 549 IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest, |
| 491 HistoryNavigationActivation) { | 550 HistoryNavigationActivation) { |
| 492 GURL url_without_activation(GetTestUrl(kTestFrameSetPath)); | 551 GURL url_with_activation(GetTestUrl(kTestFrameSetPath)); |
| 493 GURL url_with_activation( | 552 GURL url_without_activation( |
| 494 GetURLWithQuery(url_without_activation, "activation")); | 553 embedded_test_server()->GetURL("a.com", kTestFrameSetPath)); |
| 495 ConfigureAsPhishingURL(url_with_activation); | 554 ConfigureAsPhishingURL(url_with_activation); |
| 496 ASSERT_NO_FATAL_FAILURE( | 555 ASSERT_NO_FATAL_FAILURE( |
| 497 SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); | 556 SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); |
| 498 | 557 |
| 499 const std::vector<const char*> kSubframeNames{"one", "two", "three"}; | 558 const std::vector<const char*> kSubframeNames{"one", "two", "three"}; |
| 500 const std::vector<bool> kExpectScriptInFrameToLoadWithoutActivation{ | 559 const std::vector<bool> kExpectScriptInFrameToLoadWithoutActivation{ |
| 501 true, true, true}; | 560 true, true, true}; |
| 502 const std::vector<bool> kExpectScriptInFrameToLoadWithActivation{false, true, | 561 const std::vector<bool> kExpectScriptInFrameToLoadWithActivation{false, true, |
| 503 false}; | 562 false}; |
| 504 | 563 |
| (...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1121 internal::kHistogramSubresourceFilterActivationDecision, | 1180 internal::kHistogramSubresourceFilterActivationDecision, |
| 1122 static_cast<int>(ActivationDecision::URL_WHITELISTED), 1); | 1181 static_cast<int>(ActivationDecision::URL_WHITELISTED), 1); |
| 1123 | 1182 |
| 1124 tester.ExpectTotalCount( | 1183 tester.ExpectTotalCount( |
| 1125 internal::kHistogramSubresourceFilterActivationDecisionReload, 1); | 1184 internal::kHistogramSubresourceFilterActivationDecisionReload, 1); |
| 1126 tester.ExpectBucketCount( | 1185 tester.ExpectBucketCount( |
| 1127 internal::kHistogramSubresourceFilterActivationDecisionReload, | 1186 internal::kHistogramSubresourceFilterActivationDecisionReload, |
| 1128 static_cast<int>(ActivationDecision::URL_WHITELISTED), 1); | 1187 static_cast<int>(ActivationDecision::URL_WHITELISTED), 1); |
| 1129 } | 1188 } |
| 1130 | 1189 |
| 1190 #if defined(GOOGLE_CHROME_BUILD) |
| 1191 // This test is only enabled when GOOGLE_CHROME_BUILD is true because the store |
| 1192 // that this test uses is only populated on GOOGLE_CHROME_BUILD builds. |
| 1193 IN_PROC_BROWSER_TEST_F( |
| 1194 SubresourceFilterBrowserTest, |
| 1195 ExpectRedirectPatternHistogramsAreRecordedForSubresourceFilterOnlyMatch) { |
| 1196 ASSERT_NO_FATAL_FAILURE(SetRulesetToDisallowURLsWithPathSuffix( |
| 1197 "suffix-that-does-not-match-anything")); |
| 1198 |
| 1199 GURL url(GetTestUrl("subresource_filter/frame_with_included_script.html")); |
| 1200 ConfigureAsSubresourceFilterOnlyURL(url); |
| 1201 |
| 1202 base::HistogramTester tester; |
| 1203 ui_test_utils::NavigateToURL(browser(), url); |
| 1204 |
| 1205 EXPECT_THAT(tester.GetAllSamples(std::string(kMatchesPatternHistogramName) + |
| 1206 std::string(kSubresourceFilterOnlySuffix)), |
| 1207 ::testing::ElementsAre(base::Bucket(NO_REDIRECTS_HIT, 1))); |
| 1208 EXPECT_THAT(tester.GetAllSamples(std::string(kNavigationChainSize) + |
| 1209 std::string(kSubresourceFilterOnlySuffix)), |
| 1210 ::testing::ElementsAre(base::Bucket(1, 1))); |
| 1211 } |
| 1212 |
| 1213 IN_PROC_BROWSER_TEST_F( |
| 1214 SubresourceFilterBrowserTest, |
| 1215 ExpectRedirectPatternHistogramsAreRecordedForSubresourceFilterOnlyRedirectMa
tch) { |
| 1216 ASSERT_NO_FATAL_FAILURE( |
| 1217 SetRulesetToDisallowURLsWithPathSuffix("included_script.js")); |
| 1218 const std::string initial_host("a.com"); |
| 1219 const std::string redirected_host("b.com"); |
| 1220 |
| 1221 GURL redirect_url(embedded_test_server()->GetURL( |
| 1222 redirected_host, "/subresource_filter/frame_with_included_script.html")); |
| 1223 GURL url(embedded_test_server()->GetURL( |
| 1224 initial_host, "/server-redirect?" + redirect_url.spec())); |
| 1225 |
| 1226 ConfigureAsSubresourceFilterOnlyURL(url.GetOrigin()); |
| 1227 base::HistogramTester tester; |
| 1228 ui_test_utils::NavigateToURL(browser(), url); |
| 1229 EXPECT_THAT(tester.GetAllSamples(std::string(kMatchesPatternHistogramName) + |
| 1230 std::string(kSubresourceFilterOnlySuffix)), |
| 1231 ::testing::IsEmpty()); |
| 1232 |
| 1233 EXPECT_THAT(tester.GetAllSamples(std::string(kNavigationChainSize) + |
| 1234 std::string(kSubresourceFilterOnlySuffix)), |
| 1235 ::testing::IsEmpty()); |
| 1236 } |
| 1237 #endif |
| 1238 |
| 1131 } // namespace subresource_filter | 1239 } // namespace subresource_filter |
| OLD | NEW |