Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7080)

Unified Diff: components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc

Issue 2691423006: Introduce the ThrottleManager (Closed)
Patch Set: rebase Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..3e212060b4f0192a5d3ad8cd3505e19af1dc908c
--- /dev/null
+++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc
@@ -0,0 +1,525 @@
+// Copyright 2017 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_throttle_manager.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/logging.h"
+#include "base/memory/ptr_util.h"
+#include "base/run_loop.h"
+#include "base/strings/stringprintf.h"
+#include "base/test/test_simple_task_runner.h"
+#include "components/subresource_filter/content/browser/async_document_subresource_filter.h"
+#include "components/subresource_filter/core/common/activation_level.h"
+#include "components/subresource_filter/core/common/activation_state.h"
+#include "components/subresource_filter/core/common/proto/rules.pb.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/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 "testing/gtest/include/gtest/gtest.h"
+
+namespace subresource_filter {
+
+const char kActivatePageEnabled[] = "https://www.activate-page-enabled.com/";
engedy 2017/03/10 20:50:35 nit: How about changing these from the imperative
Charlie Harrison 2017/03/14 23:18:32 Done.
+const char kActivatePageEnabled2[] = "https://www.activate-page-enabled-2.com/";
+const char kActivatePageDryRun[] = "https://www.activate-page-dry-run/";
+
+// Simple throttle that sends page-level activation to the manager for a
+// specific set of URLs.
engedy 2017/03/10 20:50:35 nit: hardcoded set of testing URLs Also, as disc
Charlie Harrison 2017/03/14 23:18:32 I couldn't think of a great criteria for which tes
engedy 2017/03/20 18:58:14 Hmm, I'm not against it as long as these parameter
Charlie Harrison 2017/03/20 20:02:56 Just did a gut check on the flakiness dashboard an
+class MockPageStateActivationThrottle : public content::NavigationThrottle {
+ public:
+ MockPageStateActivationThrottle(
+ content::NavigationHandle* navigation_handle,
+ ContentSubresourceFilterThrottleManager* throttle_manager)
+ : content::NavigationThrottle(navigation_handle),
+ throttle_manager_(throttle_manager) {
+ mock_page_activations_[GURL(kActivatePageEnabled)] =
+ ActivationState(ActivationLevel::ENABLED);
+ mock_page_activations_[GURL(kActivatePageEnabled2)] =
+ ActivationState(ActivationLevel::ENABLED);
+ mock_page_activations_[GURL(kActivatePageDryRun)] =
+ ActivationState(ActivationLevel::DRYRUN);
+ }
+ ~MockPageStateActivationThrottle() override {}
+
+ // content::NavigationThrottle:
+ content::NavigationThrottle::ThrottleCheckResult WillProcessResponse()
+ override {
+ auto it = mock_page_activations_.find(navigation_handle()->GetURL());
+ if (it != mock_page_activations_.end()) {
+ throttle_manager_->NotifyPageActivationComputed(navigation_handle(),
+ it->second);
+ }
+ return content::NavigationThrottle::PROCEED;
+ }
+
+ private:
+ std::map<GURL, ActivationState> mock_page_activations_;
+ ContentSubresourceFilterThrottleManager* throttle_manager_;
+
+ DISALLOW_COPY_AND_ASSIGN(MockPageStateActivationThrottle);
+};
+
+class ContentSubresourceFilterThrottleManagerTest
+ : public content::RenderViewHostTestHarness,
+ public content::WebContentsObserver,
+ public ContentSubresourceFilterThrottleManager::Delegate {
+ public:
+ ContentSubresourceFilterThrottleManagerTest()
+ : ContentSubresourceFilterThrottleManager::Delegate() {}
+ ~ContentSubresourceFilterThrottleManagerTest() override {}
+
+ // content::RenderViewHostTestHarness:
+ void SetUp() override {
+ content::RenderViewHostTestHarness::SetUp();
+
+ NavigateAndCommit(GURL("https://example.first"));
+
+ Observe(RenderViewHostTestHarness::web_contents());
+
+ // Initialize the ruleset dealer.
+ std::vector<proto::UrlRule> rules;
+ rules.push_back(testing::CreateWhitelistRuleForDocument(
+ "whitelist.com", proto::ACTIVATION_TYPE_DOCUMENT,
+ {"activate-page-enabled.com"}));
+ rules.push_back(testing::CreateSuffixRule("disallowed.html"));
+ ASSERT_NO_FATAL_FAILURE(test_ruleset_creator_.CreateRulesetWithRules(
+ rules, &test_ruleset_pair_));
+
+ // Make the blocking task runner run on the current task runner for the
+ // tests, to ensure that the NavigationSimulator properly runs all necessary
+ // tasks while waiting for throttle checks to finish.
+ dealer_handle_ = base::MakeUnique<VerifiedRulesetDealer::Handle>(
+ base::MessageLoop::current()->task_runner());
+ dealer_handle_->SetRulesetFile(
+ testing::TestRuleset::Open(test_ruleset_pair_.indexed));
+
+ throttle_manager_ =
+ base::MakeUnique<ContentSubresourceFilterThrottleManager>(
+ this, dealer_handle_.get(),
+ RenderViewHostTestHarness::web_contents());
+ }
+
+ void TearDown() override {
+ throttle_manager_.reset();
+ dealer_handle_.reset();
+ base::RunLoop().RunUntilIdle();
+ content::RenderViewHostTestHarness::TearDown();
+ }
+
+ // content::WebContentsObserver
engedy 2017/03/10 20:50:34 nit: Once again, let's move these into a protected
Charlie Harrison 2017/03/14 23:18:32 Done.
+ void DidStartNavigation(
+ content::NavigationHandle* navigation_handle) override {
+ // Inject the proper throttles at this time.
+ std::vector<std::unique_ptr<content::NavigationThrottle>> throttles;
+ throttles.push_back(base::MakeUnique<MockPageStateActivationThrottle>(
+ navigation_handle, throttle_manager_.get()));
+ throttle_manager_->MaybeAppendNavigationThrottles(navigation_handle,
+ &throttles);
+ for (auto& it : throttles) {
+ navigation_handle->RegisterThrottleForTesting(std::move(it));
+ }
+ }
+
+ // ContentSubresourceFilterThrottleManager::Delegate:
+ void OnFirstSubresourceLoadDisallowed() override {
+ ++disallowed_notification_count_;
+ }
+
+ bool ShouldSuppressActivation(
+ content::NavigationHandle* navigation_handle) override {
+ ++attempted_frame_activations_;
+ return urls_to_suppress_activation_.find(navigation_handle->GetURL()) !=
+ urls_to_suppress_activation_.end();
+ }
+
+ // Helper methods:
+
+ void CreateTestNavigation(const GURL& url,
+ content::RenderFrameHost* render_frame_host) {
+ DCHECK(!navigation_simulator_);
+ DCHECK(render_frame_host);
+ navigation_simulator_ =
+ content::NavigationSimulator::CreateRendererInitiated(
+ url, render_frame_host);
+ }
+
+ void CreateTestSubframeNavigation(const GURL& url,
engedy 2017/03/10 20:50:35 nit: CreateSubframe{And|With}TestNavigation
Charlie Harrison 2017/03/14 23:18:32 Done.
+ content::RenderFrameHost* parent) {
+ content::RenderFrameHost* subframe =
+ content::RenderFrameHostTester::For(parent)->AppendChild(
+ base::StringPrintf("subframe-%s", url.spec().c_str()));
+ CreateTestNavigation(url, subframe);
+ }
+
+ void SimulateStartAndExpectResult(
+ content::NavigationThrottle::ThrottleCheckResult expect_result) {
+ navigation_simulator_->Start();
+ content::NavigationThrottle::ThrottleCheckResult result =
+ navigation_simulator_->GetLastThrottleCheckResult();
+ EXPECT_EQ(expect_result, result);
+ if (result != content::NavigationThrottle::PROCEED)
+ navigation_simulator_.reset();
+ }
+
+ void SimulateRedirectAndExpectResult(
+ const GURL& new_url,
+ content::NavigationThrottle::ThrottleCheckResult expect_result) {
+ navigation_simulator_->Redirect(new_url);
+ content::NavigationThrottle::ThrottleCheckResult result =
+ navigation_simulator_->GetLastThrottleCheckResult();
+ EXPECT_EQ(expect_result, result);
+ if (result != content::NavigationThrottle::PROCEED)
+ navigation_simulator_.reset();
engedy 2017/03/10 20:50:34 Does this somehow call DidFinishNavigation?
Charlie Harrison 2017/03/14 23:18:32 No, it will be caused by the throttle cancelling i
engedy 2017/03/20 18:58:14 Ah, got it, thanks.
+ }
+
+ // Returns the RenderFrameHost that the navigation commit in.
+ content::RenderFrameHost* SimulateCommitAndExpectResult(
+ content::NavigationThrottle::ThrottleCheckResult expect_result) {
+ navigation_simulator_->Commit();
+ content::NavigationThrottle::ThrottleCheckResult result =
+ navigation_simulator_->GetLastThrottleCheckResult();
+ EXPECT_EQ(expect_result, result);
+
+ auto scoped_simulator = std::move(navigation_simulator_);
+ if (result == content::NavigationThrottle::PROCEED)
+ return scoped_simulator->GetFinalRenderFrameHost();
+ return nullptr;
+ }
+
+ void SimulateSamePageCommit() {
+ navigation_simulator_->CommitSamePage();
+ navigation_simulator_.reset();
+ }
+
+ void NavigateAndCommitMainFrame(const GURL& url) {
+ CreateTestNavigation(url, main_rfh());
+ // A main frame navigation should never have start deferred.
engedy 2017/03/10 20:50:34 nit: This comment is no longer meaningful.
Charlie Harrison 2017/03/14 23:18:32 Done.
+ SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
+ SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
+ }
+
+ void SuppressActivationForUrl(const GURL& url) {
+ urls_to_suppress_activation_.insert(url);
+ }
+
+ bool ManagerHasRulesetHandle() {
+ return throttle_manager_->ruleset_handle_for_testing();
+ }
+
+ int disallowed_notification_count() { return disallowed_notification_count_; }
+
+ int attempted_frame_activations() { return attempted_frame_activations_; }
+
+ private:
+ testing::TestRulesetCreator test_ruleset_creator_;
+ testing::TestRulesetPair test_ruleset_pair_;
+
+ std::set<GURL> urls_to_suppress_activation_;
+
+ std::unique_ptr<VerifiedRulesetDealer::Handle> dealer_handle_;
+
+ std::unique_ptr<ContentSubresourceFilterThrottleManager> throttle_manager_;
+
+ std::unique_ptr<content::NavigationSimulator> navigation_simulator_;
+
+ // Logged on every OnFirstSubresourceLoadDisallowed call.
engedy 2017/03/10 20:50:34 nit: s/Logged/Incremented/g
Charlie Harrison 2017/03/14 23:18:32 Done.
+ int disallowed_notification_count_ = 0;
+
+ // Logged every time the manager asks the harness for an activation
engedy 2017/03/10 20:50:34 nit: s/asks an/queries/
Charlie Harrison 2017/03/14 23:18:32 Done.
+ // suppression.
+ int attempted_frame_activations_ = 0;
+
+ DISALLOW_COPY_AND_ASSIGN(ContentSubresourceFilterThrottleManagerTest);
+};
+
+TEST_F(ContentSubresourceFilterThrottleManagerTest,
+ ActivateMainFrameAndFilterSubframeNavigation) {
+ // Commit a navigation that triggers page level activation.
+ NavigateAndCommitMainFrame(GURL(kActivatePageEnabled));
+
+ // A disallowed subframe navigation should be successfully filtered.
+ CreateTestSubframeNavigation(GURL("https://www.example.com/disallowed.html"),
+ main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
+
+ EXPECT_EQ(1, disallowed_notification_count());
+ EXPECT_EQ(1, attempted_frame_activations());
+}
+
+TEST_F(ContentSubresourceFilterThrottleManagerTest,
+ ActivateMainFrameAndDoNotFilterDryRun) {
+ // Commit a navigation that triggers page level activation.
+ NavigateAndCommitMainFrame(GURL(kActivatePageDryRun));
+
+ // A disallowed subframe navigation should not be filtered in dry-run mode.
+ CreateTestSubframeNavigation(GURL("https://www.example.com/disallowed.html"),
+ main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
+ SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
+
+ EXPECT_EQ(0, disallowed_notification_count());
+ EXPECT_EQ(2, attempted_frame_activations());
+}
+
+TEST_F(ContentSubresourceFilterThrottleManagerTest,
+ ActivateMainFrameAndFilterSubframeNavigationOnRedirect) {
+ // Commit a navigation that triggers page level activation.
+ NavigateAndCommitMainFrame(GURL(kActivatePageEnabled));
+
+ // A disallowed subframe navigation via redirect should be successfully
+ // filtered.
+ CreateTestSubframeNavigation(
+ GURL("https://www.example.com/before-redirect.html"), main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
+ SimulateRedirectAndExpectResult(
+ GURL("https://www.example.com/disallowed.html"),
+ content::NavigationThrottle::CANCEL);
+
+ EXPECT_EQ(1, disallowed_notification_count());
+ EXPECT_EQ(1, attempted_frame_activations());
+}
+
+TEST_F(ContentSubresourceFilterThrottleManagerTest,
+ ActivateMainFrameAndDoNotFilterSubframeNavigation) {
+ // Commit a navigation that triggers page level activation.
+ NavigateAndCommitMainFrame(GURL(kActivatePageEnabled));
+
+ // An allowed subframe navigation should complete successfully.
+ CreateTestSubframeNavigation(GURL("https://www.example.com/allowed1.html"),
+ main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
+ SimulateRedirectAndExpectResult(GURL("https://www.example.com/allowed2.html"),
+ content::NavigationThrottle::PROCEED);
+ SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
+
+ EXPECT_EQ(0, disallowed_notification_count());
+ EXPECT_EQ(2, attempted_frame_activations());
+}
+
+// This should fail if the throttle manager notifies the delegate twice of a
+// disallowed load for the same page load.
+TEST_F(ContentSubresourceFilterThrottleManagerTest,
+ ActivateMainFrameAndFilterTwoSubframeNavigations) {
+ // Commit a navigation that triggers page level activation.
+ NavigateAndCommitMainFrame(GURL(kActivatePageEnabled));
+
+ // A disallowed subframe navigation should be successfully filtered.
+ CreateTestSubframeNavigation(
+ GURL("https://www.example.com/1/disallowed.html"), main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
+
+ EXPECT_EQ(1, disallowed_notification_count());
+
+ CreateTestSubframeNavigation(
+ GURL("https://www.example.com/2/disallowed.html"), main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
+
+ EXPECT_EQ(1, disallowed_notification_count());
+ EXPECT_EQ(1, attempted_frame_activations());
+}
+
+TEST_F(ContentSubresourceFilterThrottleManagerTest,
+ ActivateTwoMainFramesAndFilterTwoSubframeNavigations) {
+ // Commit a navigation that triggers page level activation.
+ NavigateAndCommitMainFrame(GURL(kActivatePageEnabled));
+
+ // A disallowed subframe navigation should be successfully filtered.
+ CreateTestSubframeNavigation(
+ GURL("https://www.example.com/1/disallowed.html"), main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
+
+ EXPECT_EQ(1, disallowed_notification_count());
+
+ // Commit another navigation that triggers page level activation.
+ NavigateAndCommitMainFrame(GURL(kActivatePageEnabled2));
+
+ CreateTestSubframeNavigation(
+ GURL("https://www.example.com/2/disallowed.html"), main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
+
+ EXPECT_EQ(2, disallowed_notification_count());
+ EXPECT_EQ(2, attempted_frame_activations());
+}
+
+// Test that the disallow load notification will not repeat if a load is
engedy 2017/03/10 20:50:35 nit: ... will not be repeated for the first disall
Charlie Harrison 2017/03/14 23:18:32 Done.
+// disallowed after a same-document navigation.
+TEST_F(ContentSubresourceFilterThrottleManagerTest,
+ ActivateMainFrameDoNotNotifyAfterSameDocumentNav) {
+ // Commit a navigation that triggers page level activation.
+ NavigateAndCommitMainFrame(GURL(kActivatePageEnabled));
+
+ // A disallowed subframe navigation should be successfully filtered.
+ CreateTestSubframeNavigation(
+ GURL("https://www.example.com/1/disallowed.html"), main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
+
+ EXPECT_EQ(1, disallowed_notification_count());
+
+ // Commit another navigation that triggers page level activation.
+ GURL url2 = GURL(base::StringPrintf("%s#ref", kActivatePageEnabled));
+ CreateTestNavigation(url2, main_rfh());
+ SimulateSamePageCommit();
+
+ CreateTestSubframeNavigation(
+ GURL("https://www.example.com/2/disallowed.html"), main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
+
+ EXPECT_EQ(1, disallowed_notification_count());
+ EXPECT_EQ(1, attempted_frame_activations());
+}
+
+TEST_F(ContentSubresourceFilterThrottleManagerTest,
+ DoNotFilterForInactiveFrame) {
+ NavigateAndCommitMainFrame(GURL("https://do-not-activate.html"));
+
+ // A subframe navigation should complete successfully.
+ CreateTestSubframeNavigation(GURL("https://www.example.com/allowed.html"),
+ main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
+ SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
+
+ EXPECT_EQ(0, disallowed_notification_count());
+ EXPECT_EQ(0, attempted_frame_activations());
+}
+
+TEST_F(ContentSubresourceFilterThrottleManagerTest, SuppressActivation) {
+ SuppressActivationForUrl(GURL(kActivatePageEnabled));
+ NavigateAndCommitMainFrame(GURL(kActivatePageEnabled));
+
+ // A subframe navigation should complete successfully.
+ CreateTestSubframeNavigation(GURL("https://www.example.com/allowed.html"),
+ main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
+ SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
+
+ EXPECT_EQ(0, disallowed_notification_count());
+ EXPECT_EQ(1, attempted_frame_activations());
+}
+
+// Once there are no activated frames, the manager drops its ruleset handle. If
+// another frame is activated, make sure the handle is regenerated.
+TEST_F(ContentSubresourceFilterThrottleManagerTest, RulesetHandleRegeneration) {
+ NavigateAndCommitMainFrame(GURL(kActivatePageEnabled));
+
+ // A subframe navigation should complete successfully.
+ CreateTestSubframeNavigation(GURL("https://www.example.com/disallowed.html"),
+ main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
+
+ EXPECT_EQ(1, disallowed_notification_count());
+
+ // Simulate a renderer crash which should delete the frame.
+ EXPECT_TRUE(ManagerHasRulesetHandle());
+ process()->SimulateCrash();
+ EXPECT_FALSE(ManagerHasRulesetHandle());
+
+ NavigateAndCommit(GURL("https://example.reset"));
+ NavigateAndCommitMainFrame(GURL(kActivatePageEnabled));
+
+ // A subframe navigation should complete successfully.
+ CreateTestSubframeNavigation(GURL("https://www.example.com/disallowed.html"),
+ main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
+
+ EXPECT_EQ(2, disallowed_notification_count());
+ EXPECT_EQ(2, attempted_frame_activations());
+}
+
+// Ensure activation propagates into great-grandchild frames, including cross
+// process ones.
+TEST_F(ContentSubresourceFilterThrottleManagerTest, ActivationPropagation) {
+ NavigateAndCommitMainFrame(GURL(kActivatePageEnabled));
+
+ // Navigate a subframe that is not filtered, but should still activate.
engedy 2017/03/10 20:50:34 nit: To clarify the terminology around this unit t
Charlie Harrison 2017/03/14 23:18:32 Done.
+ CreateTestSubframeNavigation(GURL("https://www.example.com/allowed.html"),
+ main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
+ content::RenderFrameHost* subframe1 =
+ SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
+
+ // Navigate a sub-subframe that is not filtered, but should still activate.
+ CreateTestSubframeNavigation(GURL("https://www.example.com/allowed.html"),
engedy 2017/03/10 20:50:35 For good measure, let's make this cross-origin too
Charlie Harrison 2017/03/14 23:18:32 Done.
+ subframe1);
+ SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
+ content::RenderFrameHost* subframe2 =
+ SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
+
+ // A final, nested subframe navigation is filtered.
+ CreateTestSubframeNavigation(GURL("https://example.com/disallowed.html"),
+ subframe2);
+ SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
+
+ EXPECT_EQ(1, disallowed_notification_count());
+ EXPECT_EQ(3, attempted_frame_activations());
+}
+
+// Ensure activation propagates through whitelisted documents.
+TEST_F(ContentSubresourceFilterThrottleManagerTest, ActivationPropagation2) {
+ NavigateAndCommitMainFrame(GURL(kActivatePageEnabled));
+
+ // Navigate a subframe that is not filtered, but should still activate.
+ CreateTestSubframeNavigation(GURL("https://whitelist.com"), main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
+ content::RenderFrameHost* subframe1 =
+ SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
+
+ // Navigate a sub-subframe that is not filtered due to the whitelist.
+ CreateTestSubframeNavigation(GURL("https://www.example.com/disallowed.html"),
+ subframe1);
+ SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
+ SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
+
+ EXPECT_EQ(3, attempted_frame_activations());
+ EXPECT_EQ(0, disallowed_notification_count());
+
+ // An identical series of events that don't match whitelist rules cause
+ // filtering.
+ CreateTestSubframeNavigation(GURL("https://average-joe.com"), main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
+ content::RenderFrameHost* subframe3 =
+ SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
+
+ // Navigate a sub-subframe that is not filtered due to the whitelist.
+ CreateTestSubframeNavigation(GURL("https://www.example.com/disallowed.html"),
+ subframe3);
+ SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
+
+ EXPECT_EQ(4, attempted_frame_activations());
+ EXPECT_EQ(1, disallowed_notification_count());
+}
+
+// Same-site navigations within a single RFH do not persist activation.
+TEST_F(ContentSubresourceFilterThrottleManagerTest,
+ SameSiteNavigationStopsActivation) {
+ NavigateAndCommitMainFrame(GURL(kActivatePageEnabled));
+ EXPECT_EQ(1, attempted_frame_activations());
+
+ // Mock a same-site navigation, in the same RFH, this URL does not trigger
+ // page level activation.
+ NavigateAndCommitMainFrame(
+ GURL(base::StringPrintf("%s/some_path/", kActivatePageEnabled)));
+ EXPECT_EQ(1, attempted_frame_activations());
+
+ CreateTestSubframeNavigation(GURL("https://www.example.com/disallowed.html"),
+ main_rfh());
+ SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
+ SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
+
+ EXPECT_EQ(0, disallowed_notification_count());
+ EXPECT_EQ(1, attempted_frame_activations());
+}
+
+// TODO(csharrison): Make sure the following conditions are exercised in tests:
+//
+// - Verify IPCs are sent on activation.
+
+} // namespace subresource_filter

Powered by Google App Engine
This is Rietveld 408576698