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 |
index 668b9d9de719ff95e86419c1cb5e8d8b35d04403..4c1798845f45ef270ef519a848de4e7cb6dc0d0f 100644 |
--- 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 |
@@ -7,6 +7,7 @@ |
#include "base/macros.h" |
#include "base/memory/ptr_util.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" |
@@ -15,6 +16,10 @@ |
#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_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" |
@@ -41,6 +46,7 @@ const char kUrlB[] = "https://example_b.com"; |
const char kUrlC[] = "https://example_c.com"; |
const char kUrlD[] = "https://example_d.com"; |
const char kSubframeName[] = "Child"; |
+const char kDisallowedUrl[] = "https://example.com/disallowed.html"; |
const char kMatchesPatternHistogramName[] = |
"SubresourceFilter.PageLoad.RedirectChainMatchPattern."; |
@@ -179,7 +185,8 @@ const ActivationLevelTestData kActivationLevelTestData[] = { |
class MockSubresourceFilterClient : public SubresourceFilterClient { |
public: |
- MockSubresourceFilterClient() {} |
+ MockSubresourceFilterClient(VerifiedRulesetDealer::Handle* ruleset_dealer) |
+ : ruleset_dealer_(ruleset_dealer) {} |
~MockSubresourceFilterClient() override = default; |
@@ -189,16 +196,24 @@ class MockSubresourceFilterClient : public SubresourceFilterClient { |
void WhitelistByContentSettings(const GURL& url) override {} |
+ VerifiedRulesetDealer::Handle* GetRulesetDealer() override { |
+ return ruleset_dealer_; |
+ } |
+ |
MOCK_METHOD1(ToggleNotificationVisibility, void(bool)); |
private: |
+ // Owned by the test harness. |
+ VerifiedRulesetDealer::Handle* ruleset_dealer_; |
+ |
DISALLOW_COPY_AND_ASSIGN(MockSubresourceFilterClient); |
}; |
} // namespace |
class ContentSubresourceFilterDriverFactoryTest |
- : public content::RenderViewHostTestHarness { |
+ : public content::RenderViewHostTestHarness, |
+ public content::WebContentsObserver { |
public: |
ContentSubresourceFilterDriverFactoryTest() {} |
~ContentSubresourceFilterDriverFactoryTest() override {} |
@@ -207,26 +222,43 @@ class ContentSubresourceFilterDriverFactoryTest |
void SetUp() override { |
RenderViewHostTestHarness::SetUp(); |
- client_ = new MockSubresourceFilterClient(); |
+ 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_ = new MockSubresourceFilterClient(ruleset_dealer_.get()); |
ContentSubresourceFilterDriverFactory::CreateForWebContents( |
- web_contents(), base::WrapUnique(client())); |
+ RenderViewHostTestHarness::web_contents(), base::WrapUnique(client())); |
// 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(); |
} |
ContentSubresourceFilterDriverFactory* factory() { |
return ContentSubresourceFilterDriverFactory::FromWebContents( |
- web_contents()); |
+ RenderViewHostTestHarness::web_contents()); |
} |
MockSubresourceFilterClient* client() { return client_; } |
content::RenderFrameHost* GetSubframeRFH() { |
- for (content::RenderFrameHost* rfh : web_contents()->GetAllFrames()) { |
+ for (content::RenderFrameHost* rfh : |
+ RenderViewHostTestHarness::web_contents()->GetAllFrames()) { |
if (rfh->GetFrameName() == kSubframeName) |
return rfh; |
} |
@@ -318,6 +350,22 @@ class ContentSubresourceFilterDriverFactoryTest |
} |
} |
+ 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); |
@@ -358,13 +406,6 @@ class ContentSubresourceFilterDriverFactoryTest |
expected_activation_decision); |
} |
- void EmulateDidDisallowFirstSubresourceMessage() { |
- factory()->OnMessageReceived( |
- SubresourceFilterHostMsg_DidDisallowFirstSubresource( |
- main_rfh()->GetRoutingID()), |
- main_rfh()); |
- } |
- |
void EmulateFailedNavigationAndExpectNoActivation(const GURL& url) { |
EXPECT_CALL(*client(), ToggleNotificationVisibility(false)).Times(1); |
@@ -401,6 +442,20 @@ class ContentSubresourceFilterDriverFactoryTest |
::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: |
static bool expected_measure_performance() { |
const double rate = GetPerformanceMeasurementRate(); |
@@ -409,9 +464,14 @@ class ContentSubresourceFilterDriverFactoryTest |
return rate == 1; |
} |
+ testing::TestRulesetCreator test_ruleset_creator_; |
+ testing::TestRulesetPair test_ruleset_pair_; |
+ |
// Owned by the factory. |
MockSubresourceFilterClient* client_; |
+ std::unique_ptr<VerifiedRulesetDealer::Handle> ruleset_dealer_; |
+ |
DISALLOW_COPY_AND_ASSIGN(ContentSubresourceFilterDriverFactoryTest); |
}; |
@@ -627,7 +687,8 @@ TEST_F(ContentSubresourceFilterDriverFactoryTest, NotificationVisibility) { |
NavigateAndExpectActivation({false}, {GURL(kExampleUrl)}, EMPTY, |
ActivationDecision::ACTIVATED); |
EXPECT_CALL(*client(), ToggleNotificationVisibility(true)).Times(1); |
- EmulateDidDisallowFirstSubresourceMessage(); |
+ NavigateSubframeAndExpectCheckResult(GURL(kDisallowedUrl), |
+ true /* expect_cancelled */); |
} |
TEST_F(ContentSubresourceFilterDriverFactoryTest, |
@@ -642,7 +703,16 @@ TEST_F(ContentSubresourceFilterDriverFactoryTest, |
NavigateAndExpectActivation({false}, {GURL(kExampleUrl)}, EMPTY, |
ActivationDecision::ACTIVATED); |
EXPECT_CALL(*client(), ToggleNotificationVisibility(::testing::_)).Times(0); |
- EmulateDidDisallowFirstSubresourceMessage(); |
+ NavigateSubframeAndExpectCheckResult(GURL(kDisallowedUrl), |
+ true /* expect_cancelled */); |
+} |
+ |
+TEST_F(ContentSubresourceFilterDriverFactoryTest, |
+ InactiveMainFrame_SubframeNotFiltered) { |
+ GURL url(kExampleUrl); |
+ NavigateAndExpectActivation({false}, {url}, EMPTY, |
+ ActivationDecision::ACTIVATION_DISABLED); |
+ NavigateSubframeAndExpectCheckResult(url, false /* expect_cancelled */); |
} |
TEST_F(ContentSubresourceFilterDriverFactoryTest, WhitelistSiteOnReload) { |