Index: components/subresource_filter/content/browser/content_subresource_filter_driver_factory_unittest.cc |
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_driver_factory_unittest.cc b/components/subresource_filter/content/browser/content_subresource_filter_driver_factory_unittest.cc |
deleted file mode 100644 |
index aae79c46f2043267f860831e0533bc3975d96955..0000000000000000000000000000000000000000 |
--- a/components/subresource_filter/content/browser/content_subresource_filter_driver_factory_unittest.cc |
+++ /dev/null |
@@ -1,770 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "components/subresource_filter/content/browser/content_subresource_filter_driver_factory.h" |
- |
-#include <set> |
-#include <string> |
- |
-#include "base/macros.h" |
-#include "base/memory/ptr_util.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/metrics/field_trial.h" |
-#include "base/run_loop.h" |
-#include "base/test/histogram_tester.h" |
-#include "components/safe_browsing_db/util.h" |
-#include "components/subresource_filter/content/browser/content_activation_list_utils.h" |
-#include "components/subresource_filter/content/browser/subresource_filter_client.h" |
-#include "components/subresource_filter/content/common/subresource_filter_messages.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_decision.h" |
-#include "components/subresource_filter/core/common/activation_list.h" |
-#include "components/subresource_filter/core/common/test_ruleset_creator.h" |
-#include "components/subresource_filter/core/common/test_ruleset_utils.h" |
-#include "content/public/browser/navigation_handle.h" |
-#include "content/public/browser/navigation_throttle.h" |
-#include "content/public/browser/render_frame_host.h" |
-#include "content/public/browser/web_contents.h" |
-#include "content/public/test/mock_render_process_host.h" |
-#include "content/public/test/navigation_simulator.h" |
-#include "content/public/test/test_renderer_host.h" |
-#include "content/public/test/web_contents_tester.h" |
-#include "net/base/net_errors.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "url/gurl.h" |
- |
-namespace subresource_filter { |
- |
-namespace { |
- |
-const char kExampleUrlWithParams[] = "https://example.com/soceng?q=engsoc"; |
-const char kExampleUrl[] = "https://example.com"; |
-const char kExampleLoginUrl[] = "https://example.com/login"; |
-const char kUrlA[] = "https://example_a.com"; |
-const char kUrlB[] = "https://example_b.com"; |
-const char kUrlC[] = "https://example_c.com"; |
-const char kSubframeName[] = "Child"; |
-const char kDisallowedUrl[] = "https://example.com/disallowed.html"; |
- |
-std::string GetSuffixForList(const ActivationList& type) { |
- switch (type) { |
- case ActivationList::SOCIAL_ENG_ADS_INTERSTITIAL: |
- return "SocialEngineeringAdsInterstitial"; |
- case ActivationList::PHISHING_INTERSTITIAL: |
- return "PhishingInterstitial"; |
- case ActivationList::SUBRESOURCE_FILTER: |
- return "SubresourceFilterOnly"; |
- case ActivationList::NONE: |
- return std::string(); |
- } |
- return std::string(); |
-} |
- |
-struct ActivationListTestData { |
- ActivationDecision expected_activation_decision; |
- ActivationList activation_list; |
- safe_browsing::SBThreatType threat_type; |
- safe_browsing::ThreatPatternType threat_type_metadata; |
-}; |
- |
-const ActivationListTestData kActivationListTestData[] = { |
- {ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET, ActivationList::NONE, |
- safe_browsing::SB_THREAT_TYPE_URL_PHISHING, |
- safe_browsing::ThreatPatternType::SOCIAL_ENGINEERING_ADS}, |
- {ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET, |
- ActivationList::SOCIAL_ENG_ADS_INTERSTITIAL, |
- safe_browsing::SB_THREAT_TYPE_URL_PHISHING, |
- safe_browsing::ThreatPatternType::NONE}, |
- {ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET, |
- ActivationList::SOCIAL_ENG_ADS_INTERSTITIAL, |
- safe_browsing::SB_THREAT_TYPE_URL_PHISHING, |
- safe_browsing::ThreatPatternType::MALWARE_LANDING}, |
- {ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET, |
- ActivationList::SOCIAL_ENG_ADS_INTERSTITIAL, |
- safe_browsing::SB_THREAT_TYPE_URL_PHISHING, |
- safe_browsing::ThreatPatternType::MALWARE_DISTRIBUTION}, |
- {ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET, |
- ActivationList::PHISHING_INTERSTITIAL, |
- safe_browsing::SB_THREAT_TYPE_API_ABUSE, |
- safe_browsing::ThreatPatternType::SOCIAL_ENGINEERING_ADS}, |
- {ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET, |
- ActivationList::PHISHING_INTERSTITIAL, |
- safe_browsing::SB_THREAT_TYPE_BLACKLISTED_RESOURCE, |
- safe_browsing::ThreatPatternType::SOCIAL_ENGINEERING_ADS}, |
- {ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET, |
- ActivationList::PHISHING_INTERSTITIAL, |
- safe_browsing::SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL, |
- safe_browsing::ThreatPatternType::SOCIAL_ENGINEERING_ADS}, |
- {ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET, |
- ActivationList::PHISHING_INTERSTITIAL, |
- safe_browsing::SB_THREAT_TYPE_BINARY_MALWARE_URL, |
- safe_browsing::ThreatPatternType::SOCIAL_ENGINEERING_ADS}, |
- {ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET, |
- ActivationList::PHISHING_INTERSTITIAL, |
- safe_browsing::SB_THREAT_TYPE_URL_UNWANTED, |
- safe_browsing::ThreatPatternType::SOCIAL_ENGINEERING_ADS}, |
- {ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET, |
- ActivationList::PHISHING_INTERSTITIAL, |
- safe_browsing::SB_THREAT_TYPE_URL_MALWARE, |
- safe_browsing::ThreatPatternType::SOCIAL_ENGINEERING_ADS}, |
- {ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET, |
- ActivationList::PHISHING_INTERSTITIAL, |
- safe_browsing::SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL, |
- safe_browsing::ThreatPatternType::SOCIAL_ENGINEERING_ADS}, |
- {ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET, |
- ActivationList::PHISHING_INTERSTITIAL, safe_browsing::SB_THREAT_TYPE_SAFE, |
- safe_browsing::ThreatPatternType::SOCIAL_ENGINEERING_ADS}, |
- {ActivationDecision::ACTIVATED, ActivationList::PHISHING_INTERSTITIAL, |
- safe_browsing::SB_THREAT_TYPE_URL_PHISHING, |
- safe_browsing::ThreatPatternType::NONE}, |
- {ActivationDecision::ACTIVATED, ActivationList::SOCIAL_ENG_ADS_INTERSTITIAL, |
- safe_browsing::SB_THREAT_TYPE_URL_PHISHING, |
- safe_browsing::ThreatPatternType::SOCIAL_ENGINEERING_ADS}, |
- {ActivationDecision::ACTIVATED, ActivationList::PHISHING_INTERSTITIAL, |
- safe_browsing::SB_THREAT_TYPE_URL_PHISHING, |
- safe_browsing::ThreatPatternType::SOCIAL_ENGINEERING_ADS}, |
- {ActivationDecision::ACTIVATED, ActivationList::SUBRESOURCE_FILTER, |
- safe_browsing::SB_THREAT_TYPE_SUBRESOURCE_FILTER, |
- safe_browsing::ThreatPatternType::NONE}, |
- {ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET, |
- ActivationList::PHISHING_INTERSTITIAL, |
- safe_browsing::SB_THREAT_TYPE_SUBRESOURCE_FILTER, |
- safe_browsing::ThreatPatternType::NONE}, |
-}; |
- |
-struct ActivationScopeTestData { |
- ActivationDecision expected_activation_decision; |
- bool url_matches_activation_list; |
- ActivationScope activation_scope; |
-}; |
- |
-const ActivationScopeTestData kActivationScopeTestData[] = { |
- {ActivationDecision::ACTIVATED, false /* url_matches_activation_list */, |
- ActivationScope::ALL_SITES}, |
- {ActivationDecision::ACTIVATED, true /* url_matches_activation_list */, |
- ActivationScope::ALL_SITES}, |
- {ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET, |
- true /* url_matches_activation_list */, ActivationScope::NO_SITES}, |
- {ActivationDecision::ACTIVATED, true /* url_matches_activation_list */, |
- ActivationScope::ACTIVATION_LIST}, |
- {ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET, |
- false /* url_matches_activation_list */, ActivationScope::ACTIVATION_LIST}, |
-}; |
- |
-struct ActivationLevelTestData { |
- ActivationDecision expected_activation_decision; |
- ActivationLevel activation_level; |
-}; |
- |
-const ActivationLevelTestData kActivationLevelTestData[] = { |
- {ActivationDecision::ACTIVATED, ActivationLevel::DRYRUN}, |
- {ActivationDecision::ACTIVATED, ActivationLevel::ENABLED}, |
- {ActivationDecision::ACTIVATION_DISABLED, ActivationLevel::DISABLED}, |
-}; |
- |
-class MockSubresourceFilterClient : public SubresourceFilterClient { |
- public: |
- MockSubresourceFilterClient(VerifiedRulesetDealer::Handle* ruleset_dealer) |
- : ruleset_dealer_(ruleset_dealer) {} |
- |
- ~MockSubresourceFilterClient() override = default; |
- |
- bool OnPageActivationComputed(content::NavigationHandle* handle, |
- bool activated) override { |
- DCHECK(handle->IsInMainFrame()); |
- return whitelisted_hosts_.count(handle->GetURL().host()); |
- } |
- |
- void WhitelistInCurrentWebContents(const GURL& url) override { |
- ASSERT_TRUE(url.SchemeIsHTTPOrHTTPS()); |
- whitelisted_hosts_.insert(url.host()); |
- } |
- |
- VerifiedRulesetDealer::Handle* GetRulesetDealer() override { |
- return ruleset_dealer_; |
- } |
- |
- MOCK_METHOD1(ToggleNotificationVisibility, void(bool)); |
- |
- private: |
- std::set<std::string> whitelisted_hosts_; |
- |
- // Owned by the test harness. |
- VerifiedRulesetDealer::Handle* ruleset_dealer_; |
- |
- DISALLOW_COPY_AND_ASSIGN(MockSubresourceFilterClient); |
-}; |
- |
-} // namespace |
- |
-class ContentSubresourceFilterDriverFactoryTest |
- : public content::RenderViewHostTestHarness, |
- public content::WebContentsObserver { |
- public: |
- ContentSubresourceFilterDriverFactoryTest() {} |
- ~ContentSubresourceFilterDriverFactoryTest() override {} |
- |
- // content::RenderViewHostImplTestHarness: |
- void SetUp() override { |
- RenderViewHostTestHarness::SetUp(); |
- |
- std::vector<proto::UrlRule> rules; |
- rules.push_back(testing::CreateSuffixRule("disallowed.html")); |
- ASSERT_NO_FATAL_FAILURE(test_ruleset_creator_.CreateRulesetWithRules( |
- rules, &test_ruleset_pair_)); |
- ruleset_dealer_ = base::MakeUnique<VerifiedRulesetDealer::Handle>( |
- base::MessageLoop::current()->task_runner()); |
- ruleset_dealer_->SetRulesetFile( |
- testing::TestRuleset::Open(test_ruleset_pair_.indexed)); |
- client_ = |
- base::MakeUnique<MockSubresourceFilterClient>(ruleset_dealer_.get()); |
- ContentSubresourceFilterDriverFactory::CreateForWebContents( |
- RenderViewHostTestHarness::web_contents(), client()); |
- ResetConfigurationToEnableFilteringOnPhishingSites(); |
- |
- // Add a subframe. |
- content::RenderFrameHostTester* rfh_tester = |
- content::RenderFrameHostTester::For(main_rfh()); |
- rfh_tester->InitializeRenderFrameIfNeeded(); |
- rfh_tester->AppendChild(kSubframeName); |
- |
- Observe(content::RenderViewHostTestHarness::web_contents()); |
- } |
- |
- void TearDown() override { |
- ruleset_dealer_.reset(); |
- base::RunLoop().RunUntilIdle(); |
- RenderViewHostTestHarness::TearDown(); |
- } |
- |
- void ResetConfiguration(Configuration config) { |
- scoped_configuration_.ResetConfiguration(std::move(config)); |
- } |
- |
- void ResetConfiguration(std::vector<Configuration> configs) { |
- scoped_configuration_.ResetConfiguration(std::move(configs)); |
- } |
- |
- void ResetConfigurationToEnableFilteringOnAllSites() { |
- ResetConfiguration( |
- Configuration(ActivationLevel::ENABLED, ActivationScope::ALL_SITES)); |
- } |
- |
- void ResetConfigurationToEnableFilteringOnPhishingSites() { |
- ResetConfiguration(Configuration::MakePresetForLiveRunOnPhishingSites()); |
- } |
- |
- ContentSubresourceFilterDriverFactory* factory() { |
- return ContentSubresourceFilterDriverFactory::FromWebContents( |
- RenderViewHostTestHarness::web_contents()); |
- } |
- |
- MockSubresourceFilterClient* client() { return client_.get(); } |
- |
- content::RenderFrameHost* GetSubframeRFH() { |
- for (content::RenderFrameHost* rfh : |
- RenderViewHostTestHarness::web_contents()->GetAllFrames()) { |
- if (rfh->GetFrameName() == kSubframeName) |
- return rfh; |
- } |
- return nullptr; |
- } |
- |
- void ExpectActivationSignalForFrame(content::RenderFrameHost* rfh, |
- bool expect_activation) { |
- content::MockRenderProcessHost* render_process_host = |
- static_cast<content::MockRenderProcessHost*>(rfh->GetProcess()); |
- const IPC::Message* message = |
- render_process_host->sink().GetFirstMessageMatching( |
- SubresourceFilterMsg_ActivateForNextCommittedLoad::ID); |
- ASSERT_EQ(expect_activation, !!message); |
- if (expect_activation) { |
- std::tuple<ActivationState> args; |
- SubresourceFilterMsg_ActivateForNextCommittedLoad::Read(message, &args); |
- ActivationLevel level = std::get<0>(args).activation_level; |
- EXPECT_NE(ActivationLevel::DISABLED, level); |
- } |
- render_process_host->sink().ClearMessages(); |
- } |
- |
- void BlacklistURLWithRedirectsNavigateAndCommit( |
- const std::vector<bool>& blacklisted_urls, |
- const std::vector<GURL>& navigation_chain, |
- safe_browsing::SBThreatType threat_type, |
- safe_browsing::ThreatPatternType threat_type_metadata, |
- const content::Referrer& referrer, |
- ui::PageTransition transition, |
- ActivationDecision expected_activation_decision) { |
- const bool expected_activation = |
- expected_activation_decision == ActivationDecision::ACTIVATED; |
- base::HistogramTester tester; |
- EXPECT_CALL(*client(), ToggleNotificationVisibility(false)).Times(1); |
- |
- std::unique_ptr<content::NavigationSimulator> navigation_simulator = |
- content::NavigationSimulator::CreateRendererInitiated( |
- navigation_chain.front(), main_rfh()); |
- navigation_simulator->SetReferrer(referrer); |
- navigation_simulator->SetTransition(transition); |
- navigation_simulator->Start(); |
- |
- ::testing::Mock::VerifyAndClearExpectations(client()); |
- for (size_t i = 1; i < navigation_chain.size(); ++i) |
- navigation_simulator->Redirect(navigation_chain[i]); |
- |
- if (blacklisted_urls.size() != navigation_chain.size() || |
- !blacklisted_urls.back()) { |
- threat_type = safe_browsing::SBThreatType::SB_THREAT_TYPE_SAFE; |
- threat_type_metadata = safe_browsing::ThreatPatternType::NONE; |
- } |
- factory()->OnSafeBrowsingMatchComputed( |
- navigation_simulator->GetNavigationHandle(), threat_type, |
- threat_type_metadata); |
- std::string suffix; |
- ActivationList activation_list = |
- GetListForThreatTypeAndMetadata(threat_type, threat_type_metadata); |
- suffix = blacklisted_urls.back() ? GetSuffixForList(activation_list) |
- : std::string(); |
- |
- navigation_simulator->Commit(); |
- ExpectActivationSignalForFrame(main_rfh(), expected_activation); |
- EXPECT_EQ(expected_activation_decision, |
- factory()->GetActivationDecisionForLastCommittedPageLoad()); |
- |
- // Re-create a subframe now that the frame has navigated. |
- content::RenderFrameHostTester* rfh_tester = |
- content::RenderFrameHostTester::For(main_rfh()); |
- rfh_tester->AppendChild(kSubframeName); |
- } |
- |
- void NavigateSubframeAndExpectCheckResult(const GURL& url, |
- bool expect_cancelled) { |
- std::unique_ptr<content::NavigationSimulator> simulator = |
- content::NavigationSimulator::CreateRendererInitiated(url, |
- GetSubframeRFH()); |
- simulator->Start(); |
- content::NavigationThrottle::ThrottleCheckResult result = |
- simulator->GetLastThrottleCheckResult(); |
- if (expect_cancelled) { |
- EXPECT_EQ(content::NavigationThrottle::CANCEL, result); |
- } else { |
- EXPECT_EQ(content::NavigationThrottle::PROCEED, result); |
- simulator->Commit(); |
- } |
- } |
- |
- void NavigateAndCommitSubframe(const GURL& url, bool expected_activation) { |
- EXPECT_CALL(*client(), ToggleNotificationVisibility(::testing::_)).Times(0); |
- |
- content::NavigationSimulator::NavigateAndCommitFromDocument( |
- url, GetSubframeRFH()); |
- ExpectActivationSignalForFrame(GetSubframeRFH(), expected_activation); |
- ::testing::Mock::VerifyAndClearExpectations(client()); |
- } |
- |
- void NavigateAndExpectActivation( |
- const std::vector<bool>& blacklisted_urls, |
- const std::vector<GURL>& navigation_chain, |
- safe_browsing::SBThreatType threat_type, |
- safe_browsing::ThreatPatternType threat_type_metadata, |
- const content::Referrer& referrer, |
- ui::PageTransition transition, |
- ActivationDecision expected_activation_decision) { |
- const bool expected_activation = |
- expected_activation_decision == ActivationDecision::ACTIVATED; |
- BlacklistURLWithRedirectsNavigateAndCommit( |
- blacklisted_urls, navigation_chain, threat_type, threat_type_metadata, |
- referrer, transition, expected_activation_decision); |
- |
- NavigateAndCommitSubframe(GURL(kExampleLoginUrl), expected_activation); |
- } |
- |
- void NavigateAndExpectActivation( |
- const std::vector<bool>& blacklisted_urls, |
- const std::vector<GURL>& navigation_chain, |
- ActivationDecision expected_activation_decision) { |
- NavigateAndExpectActivation( |
- blacklisted_urls, navigation_chain, |
- safe_browsing::SB_THREAT_TYPE_URL_PHISHING, |
- safe_browsing::ThreatPatternType::SOCIAL_ENGINEERING_ADS, |
- content::Referrer(), ui::PAGE_TRANSITION_LINK, |
- expected_activation_decision); |
- } |
- |
- void EmulateFailedNavigationAndExpectNoActivation(const GURL& url) { |
- EXPECT_CALL(*client(), ToggleNotificationVisibility(false)).Times(1); |
- |
- // With browser-side navigation enabled, ReadyToCommitNavigation is invoked |
- // even for failed navigations. This is correctly simulated by |
- // NavigationSimulator. Make sure no activation message is sent in this |
- // case. |
- content::NavigationSimulator::NavigateAndFailFromDocument( |
- url, net::ERR_TIMED_OUT, main_rfh()); |
- ExpectActivationSignalForFrame(main_rfh(), false); |
- ::testing::Mock::VerifyAndClearExpectations(client()); |
- } |
- |
- void EmulateInPageNavigation( |
- const std::vector<bool>& blacklisted_urls, |
- ActivationDecision expected_activation_decision) { |
- // This test examines the navigation with the following sequence of events: |
- // DidStartProvisional(main, "example.com") |
- // ReadyToCommitNavigation(“example.com”) |
- // DidCommitProvisional(main, "example.com") |
- // DidStartProvisional(sub, "example.com/login") |
- // DidCommitProvisional(sub, "example.com/login") |
- // DidCommitProvisional(main, "example.com#ref") |
- |
- NavigateAndExpectActivation(blacklisted_urls, {GURL(kExampleUrl)}, |
- expected_activation_decision); |
- EXPECT_CALL(*client(), ToggleNotificationVisibility(::testing::_)).Times(0); |
- std::unique_ptr<content::NavigationSimulator> navigation_simulator = |
- content::NavigationSimulator::CreateRendererInitiated(GURL(kExampleUrl), |
- main_rfh()); |
- navigation_simulator->CommitSameDocument(); |
- ExpectActivationSignalForFrame(main_rfh(), false); |
- ::testing::Mock::VerifyAndClearExpectations(client()); |
- } |
- |
- protected: |
- // content::WebContentsObserver |
- void DidStartNavigation( |
- content::NavigationHandle* navigation_handle) override { |
- if (navigation_handle->IsSameDocument()) |
- return; |
- |
- std::vector<std::unique_ptr<content::NavigationThrottle>> throttles; |
- factory()->throttle_manager()->MaybeAppendNavigationThrottles( |
- navigation_handle, &throttles); |
- for (auto& it : throttles) |
- navigation_handle->RegisterThrottleForTesting(std::move(it)); |
- } |
- |
- private: |
- testing::ScopedSubresourceFilterConfigurator scoped_configuration_; |
- testing::TestRulesetCreator test_ruleset_creator_; |
- testing::TestRulesetPair test_ruleset_pair_; |
- |
- std::unique_ptr<MockSubresourceFilterClient> client_; |
- std::unique_ptr<VerifiedRulesetDealer::Handle> ruleset_dealer_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ContentSubresourceFilterDriverFactoryTest); |
-}; |
- |
-class ContentSubresourceFilterDriverFactoryThreatTypeTest |
- : public ContentSubresourceFilterDriverFactoryTest, |
- public ::testing::WithParamInterface<ActivationListTestData> { |
- public: |
- ContentSubresourceFilterDriverFactoryThreatTypeTest() {} |
- ~ContentSubresourceFilterDriverFactoryThreatTypeTest() override {} |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(ContentSubresourceFilterDriverFactoryThreatTypeTest); |
-}; |
- |
-class ContentSubresourceFilterDriverFactoryActivationScopeTest |
- : public ContentSubresourceFilterDriverFactoryTest, |
- public ::testing::WithParamInterface<ActivationScopeTestData> { |
- public: |
- ContentSubresourceFilterDriverFactoryActivationScopeTest() {} |
- ~ContentSubresourceFilterDriverFactoryActivationScopeTest() override {} |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN( |
- ContentSubresourceFilterDriverFactoryActivationScopeTest); |
-}; |
- |
-class ContentSubresourceFilterDriverFactoryActivationLevelTest |
- : public ContentSubresourceFilterDriverFactoryTest, |
- public ::testing::WithParamInterface<ActivationLevelTestData> { |
- public: |
- ContentSubresourceFilterDriverFactoryActivationLevelTest() {} |
- ~ContentSubresourceFilterDriverFactoryActivationLevelTest() override {} |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN( |
- ContentSubresourceFilterDriverFactoryActivationLevelTest); |
-}; |
- |
-TEST_F(ContentSubresourceFilterDriverFactoryTest, |
- NoActivationWhenActivationLevelIsDisabled) { |
- Configuration config(ActivationLevel::DISABLED, |
- ActivationScope::ACTIVATION_LIST, |
- ActivationList::SOCIAL_ENG_ADS_INTERSTITIAL); |
- config.activation_options.activation_level = ActivationLevel::DISABLED; |
- ResetConfiguration(std::move(config)); |
- |
- NavigateAndExpectActivation( |
- {false}, {GURL(kExampleLoginUrl)}, |
- ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET); |
- |
- const GURL url(kExampleUrlWithParams); |
- NavigateAndExpectActivation({true}, {url}, |
- ActivationDecision::ACTIVATION_DISABLED); |
- |
- // Whitelisting occurs last, so the decision should still be DISABLED. |
- factory()->client()->WhitelistInCurrentWebContents(url); |
- NavigateAndExpectActivation({true}, {url}, |
- ActivationDecision::ACTIVATION_DISABLED); |
-} |
- |
-TEST_F(ContentSubresourceFilterDriverFactoryTest, NoActivationWhenNoMatch) { |
- NavigateAndExpectActivation( |
- {false}, {GURL(kExampleUrl)}, |
- ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET); |
-} |
- |
-TEST_F(ContentSubresourceFilterDriverFactoryTest, |
- SpecialCaseNavigationAllSitesEnabled) { |
- // Check that when the experiment is enabled for all site, the activation |
- // signal is always sent. |
- ResetConfigurationToEnableFilteringOnAllSites(); |
- EmulateInPageNavigation({false}, ActivationDecision::ACTIVATED); |
-} |
- |
-TEST_F(ContentSubresourceFilterDriverFactoryTest, |
- SpecialCaseNavigationActivationListEnabled) { |
- EmulateInPageNavigation({true}, ActivationDecision::ACTIVATED); |
-} |
- |
-TEST_F(ContentSubresourceFilterDriverFactoryTest, |
- SpecialCaseNavigationActivationListEnabledWithPerformanceMeasurement) { |
- Configuration config(ActivationLevel::ENABLED, |
- ActivationScope::ACTIVATION_LIST, |
- ActivationList::SOCIAL_ENG_ADS_INTERSTITIAL); |
- config.activation_options.performance_measurement_rate = 1.0; |
- ResetConfiguration(std::move(config)); |
- |
- EmulateInPageNavigation({true}, ActivationDecision::ACTIVATED); |
-} |
- |
-TEST_F(ContentSubresourceFilterDriverFactoryTest, FailedNavigation) { |
- const GURL url(kExampleUrl); |
- ResetConfigurationToEnableFilteringOnAllSites(); |
- NavigateAndExpectActivation({false}, {url}, ActivationDecision::ACTIVATED); |
- EmulateFailedNavigationAndExpectNoActivation(url); |
-} |
- |
-TEST_F(ContentSubresourceFilterDriverFactoryTest, NotificationVisibility) { |
- ResetConfigurationToEnableFilteringOnAllSites(); |
- NavigateAndExpectActivation({false}, {GURL(kExampleUrl)}, |
- ActivationDecision::ACTIVATED); |
- EXPECT_CALL(*client(), ToggleNotificationVisibility(true)).Times(1); |
- NavigateSubframeAndExpectCheckResult(GURL(kDisallowedUrl), |
- true /* expect_cancelled */); |
-} |
- |
-TEST_F(ContentSubresourceFilterDriverFactoryTest, |
- SuppressNotificationVisibility) { |
- Configuration config(ActivationLevel::ENABLED, ActivationScope::ALL_SITES); |
- config.activation_options.should_suppress_notifications = true; |
- ResetConfiguration(std::move(config)); |
- NavigateAndExpectActivation({false}, {GURL(kExampleUrl)}, |
- ActivationDecision::ACTIVATED); |
- EXPECT_CALL(*client(), ToggleNotificationVisibility(::testing::_)).Times(0); |
- NavigateSubframeAndExpectCheckResult(GURL(kDisallowedUrl), |
- true /* expect_cancelled */); |
-} |
- |
-TEST_F(ContentSubresourceFilterDriverFactoryTest, |
- InactiveMainFrame_SubframeNotFiltered) { |
- GURL url(kExampleUrl); |
- Configuration config(ActivationLevel::DISABLED, ActivationScope::ALL_SITES); |
- ResetConfiguration(std::move(config)); |
- NavigateAndExpectActivation({false}, {url}, |
- ActivationDecision::ACTIVATION_DISABLED); |
- NavigateSubframeAndExpectCheckResult(url, false /* expect_cancelled */); |
-} |
- |
-TEST_F(ContentSubresourceFilterDriverFactoryTest, WhitelistSiteOnReload) { |
- const struct { |
- content::Referrer referrer; |
- ui::PageTransition transition; |
- ActivationDecision expected_activation_decision; |
- } kTestCases[] = { |
- {content::Referrer(), ui::PAGE_TRANSITION_LINK, |
- ActivationDecision::ACTIVATED}, |
- {content::Referrer(GURL(kUrlA), blink::kWebReferrerPolicyDefault), |
- ui::PAGE_TRANSITION_LINK, ActivationDecision::ACTIVATED}, |
- {content::Referrer(GURL(kExampleUrl), blink::kWebReferrerPolicyDefault), |
- ui::PAGE_TRANSITION_LINK, ActivationDecision::URL_WHITELISTED}, |
- {content::Referrer(), ui::PAGE_TRANSITION_RELOAD, |
- ActivationDecision::URL_WHITELISTED}}; |
- |
- Configuration config(ActivationLevel::ENABLED, ActivationScope::ALL_SITES); |
- config.activation_options.should_whitelist_site_on_reload = true; |
- ResetConfiguration(std::move(config)); |
- |
- for (const auto& test_case : kTestCases) { |
- SCOPED_TRACE(::testing::Message("referrer = \"") |
- << test_case.referrer.url << "\"" |
- << " transition = \"" << test_case.transition << "\""); |
- |
- NavigateAndExpectActivation( |
- {false}, {GURL(kExampleUrl)}, |
- safe_browsing::SB_THREAT_TYPE_URL_PHISHING, |
- safe_browsing::ThreatPatternType::SOCIAL_ENGINEERING_ADS, |
- test_case.referrer, test_case.transition, |
- test_case.expected_activation_decision); |
- // Verify that if the first URL failed to activate, subsequent same-origin |
- // navigations also fail to activate. |
- NavigateAndExpectActivation({false}, {GURL(kExampleUrlWithParams)}, |
- test_case.expected_activation_decision); |
- } |
-} |
- |
-TEST_F(ContentSubresourceFilterDriverFactoryTest, NoConfigs) { |
- ResetConfiguration(std::vector<Configuration>()); |
- NavigateAndExpectActivation( |
- {true}, {GURL(kExampleUrl)}, |
- ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET); |
-} |
- |
-TEST_F(ContentSubresourceFilterDriverFactoryTest, MultipleSimultaneousConfigs) { |
- Configuration config1(ActivationLevel::DRYRUN, ActivationScope::NO_SITES); |
- config1.activation_conditions.priority = 2; |
- |
- Configuration config2(ActivationLevel::DISABLED, |
- ActivationScope::ACTIVATION_LIST, |
- ActivationList::SOCIAL_ENG_ADS_INTERSTITIAL); |
- config2.activation_conditions.priority = 1; |
- |
- Configuration config3(ActivationLevel::ENABLED, ActivationScope::ALL_SITES); |
- config3.activation_options.should_whitelist_site_on_reload = true; |
- config3.activation_conditions.priority = 0; |
- |
- ResetConfiguration({config1, config2, config3}); |
- |
- // Should match |config2| and |config3|, the former with the higher priority. |
- NavigateAndExpectActivation({true}, {GURL(kExampleUrl)}, |
- ActivationDecision::ACTIVATION_DISABLED); |
- |
- // Should match |config3|. |
- NavigateAndExpectActivation({false}, {GURL(kExampleUrl)}, |
- ActivationDecision::ACTIVATED); |
- |
- // Should match |config3|, but a reload, so this should get whitelisted. |
- NavigateAndExpectActivation( |
- {false}, {GURL(kExampleUrl)}, safe_browsing::SB_THREAT_TYPE_URL_PHISHING, |
- safe_browsing::ThreatPatternType::SOCIAL_ENGINEERING_ADS, |
- content::Referrer(), ui::PAGE_TRANSITION_RELOAD, |
- ActivationDecision::URL_WHITELISTED); |
-} |
- |
-TEST_P(ContentSubresourceFilterDriverFactoryActivationLevelTest, |
- ActivateForFrameState) { |
- const ActivationLevelTestData& test_data = GetParam(); |
- ResetConfiguration(Configuration( |
- test_data.activation_level, ActivationScope::ACTIVATION_LIST, |
- ActivationList::SOCIAL_ENG_ADS_INTERSTITIAL)); |
- |
- const GURL url(kExampleUrlWithParams); |
- NavigateAndExpectActivation({true}, {url}, |
- test_data.expected_activation_decision); |
- factory()->client()->WhitelistInCurrentWebContents(url); |
- |
- // Whitelisting is only applied when the page will otherwise activate. |
- ActivationDecision decision = |
- test_data.activation_level == ActivationLevel::DISABLED |
- ? test_data.expected_activation_decision |
- : ActivationDecision::URL_WHITELISTED; |
- NavigateAndExpectActivation({true}, {url}, decision); |
-} |
- |
-TEST_P(ContentSubresourceFilterDriverFactoryThreatTypeTest, |
- ActivateForTheListType) { |
- // Sets up the experiment in a way that the activation decision depends on the |
- // list for which the Safe Browsing hit has happened. |
- const ActivationListTestData& test_data = GetParam(); |
- ResetConfiguration(Configuration(ActivationLevel::ENABLED, |
- ActivationScope::ACTIVATION_LIST, |
- test_data.activation_list)); |
- |
- const GURL test_url("https://example.com/nonsoceng?q=engsocnon"); |
- std::vector<GURL> navigation_chain; |
- |
- NavigateAndExpectActivation( |
- {false, false, false, true}, |
- {GURL(kUrlA), GURL(kUrlB), GURL(kUrlC), test_url}, test_data.threat_type, |
- test_data.threat_type_metadata, content::Referrer(), |
- ui::PAGE_TRANSITION_LINK, test_data.expected_activation_decision); |
-}; |
- |
-TEST_P(ContentSubresourceFilterDriverFactoryActivationScopeTest, |
- ActivateForScopeType) { |
- const ActivationScopeTestData& test_data = GetParam(); |
- ResetConfiguration( |
- Configuration(ActivationLevel::ENABLED, test_data.activation_scope, |
- ActivationList::SOCIAL_ENG_ADS_INTERSTITIAL)); |
- |
- const GURL test_url(kExampleUrlWithParams); |
- |
- NavigateAndExpectActivation({test_data.url_matches_activation_list}, |
- {test_url}, |
- test_data.expected_activation_decision); |
- if (test_data.url_matches_activation_list) { |
- factory()->client()->WhitelistInCurrentWebContents(test_url); |
- ActivationDecision expected_decision = |
- test_data.expected_activation_decision; |
- if (expected_decision == ActivationDecision::ACTIVATED) |
- expected_decision = ActivationDecision::URL_WHITELISTED; |
- NavigateAndExpectActivation({test_data.url_matches_activation_list}, |
- {GURL(kExampleUrlWithParams)}, |
- expected_decision); |
- } |
-}; |
- |
-// Only main frames with http/https schemes should activate. |
-TEST_P(ContentSubresourceFilterDriverFactoryActivationScopeTest, |
- ActivateForSupportedUrlScheme) { |
- const ActivationScopeTestData& test_data = GetParam(); |
- ResetConfiguration( |
- Configuration(ActivationLevel::ENABLED, test_data.activation_scope, |
- ActivationList::SOCIAL_ENG_ADS_INTERSTITIAL)); |
- |
- // data URLs are also not supported, but not listed here, as it's not possible |
- // for a page to redirect to them after https://crbug.com/594215 is fixed. |
- const char* unsupported_urls[] = {"ftp://example.com/", "chrome://settings", |
- "chrome-extension://some-extension", |
- "file:///var/www/index.html"}; |
- const char* supported_urls[] = {"http://example.test", |
- "https://example.test"}; |
- for (auto* url : unsupported_urls) { |
- SCOPED_TRACE(url); |
- ActivationDecision expected_decision = |
- ActivationDecision::UNSUPPORTED_SCHEME; |
- // We only log UNSUPPORTED_SCHEME if the navigation would have otherwise |
- // activated. Note that non http/s URLs will never match an activation list. |
- if (test_data.expected_activation_decision == |
- ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET || |
- test_data.activation_scope == ActivationScope::ACTIVATION_LIST) { |
- expected_decision = ActivationDecision::ACTIVATION_CONDITIONS_NOT_MET; |
- } |
- NavigateAndExpectActivation({test_data.url_matches_activation_list}, |
- {GURL(url)}, expected_decision); |
- } |
- for (auto* url : supported_urls) { |
- SCOPED_TRACE(url); |
- NavigateAndExpectActivation({test_data.url_matches_activation_list}, |
- {GURL(url)}, |
- test_data.expected_activation_decision); |
- } |
-}; |
- |
-INSTANTIATE_TEST_CASE_P(NoSocEngHit, |
- ContentSubresourceFilterDriverFactoryThreatTypeTest, |
- ::testing::ValuesIn(kActivationListTestData)); |
- |
-INSTANTIATE_TEST_CASE_P( |
- ActivationScopeTest, |
- ContentSubresourceFilterDriverFactoryActivationScopeTest, |
- ::testing::ValuesIn(kActivationScopeTestData)); |
- |
-INSTANTIATE_TEST_CASE_P( |
- ActivationLevelTest, |
- ContentSubresourceFilterDriverFactoryActivationLevelTest, |
- ::testing::ValuesIn(kActivationLevelTestData)); |
- |
-} // namespace subresource_filter |