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

Side by Side Diff: components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc

Issue 2691423006: Introduce the ThrottleManager (Closed)
Patch Set: update NavigationSimulator description 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/subresource_filter/content/browser/content_subresource_filt er_throttle_manager.h"
6
7 #include <memory>
8 #include <utility>
9
10 #include "base/logging.h"
11 #include "base/memory/ptr_util.h"
12 #include "base/run_loop.h"
13 #include "base/strings/stringprintf.h"
14 #include "base/test/test_simple_task_runner.h"
15 #include "components/subresource_filter/content/browser/async_document_subresour ce_filter.h"
16 #include "components/subresource_filter/core/common/activation_level.h"
17 #include "components/subresource_filter/core/common/activation_state.h"
18 #include "components/subresource_filter/core/common/proto/rules.pb.h"
19 #include "components/subresource_filter/core/common/test_ruleset_creator.h"
20 #include "components/subresource_filter/core/common/test_ruleset_utils.h"
21 #include "content/public/browser/navigation_handle.h"
22 #include "content/public/browser/navigation_throttle.h"
23 #include "content/public/browser/web_contents.h"
24 #include "content/public/test/mock_render_process_host.h"
25 #include "content/public/test/navigation_simulator.h"
26 #include "content/public/test/test_renderer_host.h"
27 #include "net/base/net_errors.h"
28 #include "testing/gtest/include/gtest/gtest.h"
29 #include "url/url_constants.h"
30
31 namespace subresource_filter {
32
33 const char kTestURLWithActivation[] = "https://www.page-with-activation.com/";
34 const char kTestURLWithActivation2[] =
35 "https://www.page-with-activation-2.com/";
36 const char kTestURLWithDryRun[] = "https://www.page-with-dryrun.com/";
37
38 // Enum determining when the mock page state throttle notifies the throttle
39 // manager of page level activation state.
40 enum PageActivationThrottleState {
engedy 2017/03/20 18:58:14 nit: PageActivationNotificationTiming?
Charlie Harrison 2017/03/20 20:02:56 Done.
41 WILL_START_REQUEST,
42 WILL_PROCESS_RESPONSE,
43 };
44
45 // Simple throttle that sends page-level activation to the manager for a
46 // specific set of URLs.
47 class MockPageStateActivationThrottle : public content::NavigationThrottle {
48 public:
49 MockPageStateActivationThrottle(
50 content::NavigationHandle* navigation_handle,
51 PageActivationThrottleState activation_throttle_state,
52 ContentSubresourceFilterThrottleManager* throttle_manager)
53 : content::NavigationThrottle(navigation_handle),
54 activation_throttle_state_(activation_throttle_state),
55 throttle_manager_(throttle_manager) {
56 // Add some default activations.
57 mock_page_activations_[GURL(kTestURLWithActivation)] =
58 ActivationState(ActivationLevel::ENABLED);
59 mock_page_activations_[GURL(kTestURLWithActivation2)] =
60 ActivationState(ActivationLevel::ENABLED);
61 mock_page_activations_[GURL(kTestURLWithDryRun)] =
62 ActivationState(ActivationLevel::DRYRUN);
63 }
64 ~MockPageStateActivationThrottle() override {}
65
66 // content::NavigationThrottle:
67 content::NavigationThrottle::ThrottleCheckResult WillStartRequest() override {
68 return MaybeNotifyActivation(WILL_START_REQUEST);
69 }
70
71 content::NavigationThrottle::ThrottleCheckResult WillProcessResponse()
72 override {
73 return MaybeNotifyActivation(WILL_PROCESS_RESPONSE);
74 }
75
76 private:
77 content::NavigationThrottle::ThrottleCheckResult MaybeNotifyActivation(
78 PageActivationThrottleState throttle_state) {
79 if (throttle_state == activation_throttle_state_) {
80 auto it = mock_page_activations_.find(navigation_handle()->GetURL());
81 if (it != mock_page_activations_.end()) {
82 throttle_manager_->NotifyPageActivationComputed(navigation_handle(),
83 it->second);
84 }
85 }
86 return content::NavigationThrottle::PROCEED;
87 }
88
89 std::map<GURL, ActivationState> mock_page_activations_;
90 PageActivationThrottleState activation_throttle_state_;
91 ContentSubresourceFilterThrottleManager* throttle_manager_;
92
93 DISALLOW_COPY_AND_ASSIGN(MockPageStateActivationThrottle);
94 };
95
96 class ContentSubresourceFilterThrottleManagerTest
97 : public content::RenderViewHostTestHarness,
98 public content::WebContentsObserver,
99 public ContentSubresourceFilterThrottleManager::Delegate,
100 public ::testing::WithParamInterface<PageActivationThrottleState> {
101 public:
102 ContentSubresourceFilterThrottleManagerTest()
103 : ContentSubresourceFilterThrottleManager::Delegate() {}
104 ~ContentSubresourceFilterThrottleManagerTest() override {}
105
106 // content::RenderViewHostTestHarness:
107 void SetUp() override {
108 content::RenderViewHostTestHarness::SetUp();
109
110 NavigateAndCommit(GURL("https://example.first"));
111
112 Observe(RenderViewHostTestHarness::web_contents());
113
114 // Initialize the ruleset dealer.
115 std::vector<proto::UrlRule> rules;
116 rules.push_back(testing::CreateWhitelistRuleForDocument(
117 "whitelist.com", proto::ACTIVATION_TYPE_DOCUMENT,
118 {"page-with-activation.com"}));
119 rules.push_back(testing::CreateSuffixRule("disallowed.html"));
120 ASSERT_NO_FATAL_FAILURE(test_ruleset_creator_.CreateRulesetWithRules(
121 rules, &test_ruleset_pair_));
122
123 // Make the blocking task runner run on the current task runner for the
124 // tests, to ensure that the NavigationSimulator properly runs all necessary
125 // tasks while waiting for throttle checks to finish.
126 dealer_handle_ = base::MakeUnique<VerifiedRulesetDealer::Handle>(
127 base::MessageLoop::current()->task_runner());
128 dealer_handle_->SetRulesetFile(
129 testing::TestRuleset::Open(test_ruleset_pair_.indexed));
130
131 throttle_manager_ =
132 base::MakeUnique<ContentSubresourceFilterThrottleManager>(
133 this, dealer_handle_.get(),
134 RenderViewHostTestHarness::web_contents());
135 }
136
137 void TearDown() override {
138 throttle_manager_.reset();
139 dealer_handle_.reset();
140 base::RunLoop().RunUntilIdle();
141 content::RenderViewHostTestHarness::TearDown();
142 }
143
144 // Helper methods:
145
146 void CreateTestNavigation(const GURL& url,
147 content::RenderFrameHost* render_frame_host) {
148 DCHECK(!navigation_simulator_);
149 DCHECK(render_frame_host);
150 navigation_simulator_ =
151 content::NavigationSimulator::CreateRendererInitiated(
152 url, render_frame_host);
153 }
154
155 void CreateSubframeWithTestNavigation(const GURL& url,
156 content::RenderFrameHost* parent) {
157 content::RenderFrameHost* subframe =
158 content::RenderFrameHostTester::For(parent)->AppendChild(
159 base::StringPrintf("subframe-%s", url.spec().c_str()));
160 CreateTestNavigation(url, subframe);
161 }
162
163 void SimulateStartAndExpectResult(
164 content::NavigationThrottle::ThrottleCheckResult expect_result) {
165 navigation_simulator_->Start();
166 content::NavigationThrottle::ThrottleCheckResult result =
167 navigation_simulator_->GetLastThrottleCheckResult();
168 EXPECT_EQ(expect_result, result);
169 if (result != content::NavigationThrottle::PROCEED)
170 navigation_simulator_.reset();
171 }
172
173 void SimulateRedirectAndExpectResult(
174 const GURL& new_url,
175 content::NavigationThrottle::ThrottleCheckResult expect_result) {
176 navigation_simulator_->Redirect(new_url);
177 content::NavigationThrottle::ThrottleCheckResult result =
178 navigation_simulator_->GetLastThrottleCheckResult();
179 EXPECT_EQ(expect_result, result);
180 if (result != content::NavigationThrottle::PROCEED)
181 navigation_simulator_.reset();
182 }
183
184 // Returns the RenderFrameHost that the navigation commit in.
185 content::RenderFrameHost* SimulateCommitAndExpectResult(
186 content::NavigationThrottle::ThrottleCheckResult expect_result) {
187 navigation_simulator_->Commit();
188 content::NavigationThrottle::ThrottleCheckResult result =
189 navigation_simulator_->GetLastThrottleCheckResult();
190 EXPECT_EQ(expect_result, result);
191
192 auto scoped_simulator = std::move(navigation_simulator_);
193 if (result == content::NavigationThrottle::PROCEED)
194 return scoped_simulator->GetFinalRenderFrameHost();
195 return nullptr;
196 }
197
198 void SimulateSamePageCommit() {
199 navigation_simulator_->CommitSamePage();
200 navigation_simulator_.reset();
201 }
202
203 void SimulateFailedNavigation(net::Error error) {
204 navigation_simulator_->Fail(error);
205 if (error != net::ERR_ABORTED) {
206 navigation_simulator_->CommitErrorPage();
207 }
208 navigation_simulator_.reset();
209 }
210
211 void NavigateAndCommitMainFrame(const GURL& url) {
212 CreateTestNavigation(url, main_rfh());
213 SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
214 SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
215 }
216
217 void SuppressActivationForUrl(const GURL& url) {
218 urls_to_suppress_activation_.insert(url);
219 }
220
221 bool ManagerHasRulesetHandle() {
222 return throttle_manager_->ruleset_handle_for_testing();
223 }
224
225 int disallowed_notification_count() { return disallowed_notification_count_; }
226
227 int attempted_frame_activations() { return attempted_frame_activations_; }
228
229 protected:
230 // content::WebContentsObserver
231 void DidStartNavigation(
232 content::NavigationHandle* navigation_handle) override {
233 if (navigation_handle->IsSameDocument())
234 return;
235
236 // Inject the proper throttles at this time.
237 std::vector<std::unique_ptr<content::NavigationThrottle>> throttles;
238 PageActivationThrottleState state =
239 ::testing::UnitTest::GetInstance()->current_test_info()->value_param()
240 ? GetParam()
241 : WILL_PROCESS_RESPONSE;
242 throttles.push_back(base::MakeUnique<MockPageStateActivationThrottle>(
243 navigation_handle, state, throttle_manager_.get()));
244 throttle_manager_->MaybeAppendNavigationThrottles(navigation_handle,
245 &throttles);
246 for (auto& it : throttles) {
247 navigation_handle->RegisterThrottleForTesting(std::move(it));
248 }
249 }
250
251 // ContentSubresourceFilterThrottleManager::Delegate:
252 void OnFirstSubresourceLoadDisallowed() override {
253 ++disallowed_notification_count_;
254 }
255
256 bool ShouldSuppressActivation(
257 content::NavigationHandle* navigation_handle) override {
258 ++attempted_frame_activations_;
259 return urls_to_suppress_activation_.find(navigation_handle->GetURL()) !=
260 urls_to_suppress_activation_.end();
261 }
262
263 private:
264 testing::TestRulesetCreator test_ruleset_creator_;
265 testing::TestRulesetPair test_ruleset_pair_;
266
267 std::set<GURL> urls_to_suppress_activation_;
268
269 std::unique_ptr<VerifiedRulesetDealer::Handle> dealer_handle_;
270
271 std::unique_ptr<ContentSubresourceFilterThrottleManager> throttle_manager_;
272
273 std::unique_ptr<content::NavigationSimulator> navigation_simulator_;
274
275 // Incremented on every OnFirstSubresourceLoadDisallowed call.
276 int disallowed_notification_count_ = 0;
277
278 // Incremented every time the manager queries the harness for activation
279 // suppression.
280 int attempted_frame_activations_ = 0;
281
282 DISALLOW_COPY_AND_ASSIGN(ContentSubresourceFilterThrottleManagerTest);
283 };
284
285 INSTANTIATE_TEST_CASE_P(PageActivationThrottleState,
286 ContentSubresourceFilterThrottleManagerTest,
287 ::testing::Values(WILL_START_REQUEST,
288 WILL_PROCESS_RESPONSE));
289
290 TEST_P(ContentSubresourceFilterThrottleManagerTest,
291 ActivateMainFrameAndFilterSubframeNavigation) {
292 // Commit a navigation that triggers page level activation.
293 NavigateAndCommitMainFrame(GURL(kTestURLWithActivation));
294
295 // A disallowed subframe navigation should be successfully filtered.
296 CreateSubframeWithTestNavigation(
297 GURL("https://www.example.com/disallowed.html"), main_rfh());
298 SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
299
300 EXPECT_EQ(1, disallowed_notification_count());
301 EXPECT_EQ(1, attempted_frame_activations());
302 }
303
304 TEST_P(ContentSubresourceFilterThrottleManagerTest,
305 ActivateMainFrameAndDoNotFilterDryRun) {
306 // Commit a navigation that triggers page level activation.
307 NavigateAndCommitMainFrame(GURL(kTestURLWithDryRun));
308
309 // A disallowed subframe navigation should not be filtered in dry-run mode.
310 CreateSubframeWithTestNavigation(
311 GURL("https://www.example.com/disallowed.html"), main_rfh());
312 SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
313 SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
314
315 EXPECT_EQ(0, disallowed_notification_count());
316 EXPECT_EQ(2, attempted_frame_activations());
317 }
318
319 TEST_P(ContentSubresourceFilterThrottleManagerTest,
320 ActivateMainFrameAndFilterSubframeNavigationOnRedirect) {
321 // Commit a navigation that triggers page level activation.
322 NavigateAndCommitMainFrame(GURL(kTestURLWithActivation));
323
324 // A disallowed subframe navigation via redirect should be successfully
325 // filtered.
326 CreateSubframeWithTestNavigation(
327 GURL("https://www.example.com/before-redirect.html"), main_rfh());
328 SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
329 SimulateRedirectAndExpectResult(
330 GURL("https://www.example.com/disallowed.html"),
331 content::NavigationThrottle::CANCEL);
332
333 EXPECT_EQ(1, disallowed_notification_count());
334 EXPECT_EQ(1, attempted_frame_activations());
335 }
336
337 TEST_P(ContentSubresourceFilterThrottleManagerTest,
338 ActivateMainFrameAndDoNotFilterSubframeNavigation) {
339 // Commit a navigation that triggers page level activation.
340 NavigateAndCommitMainFrame(GURL(kTestURLWithActivation));
341
342 // An allowed subframe navigation should complete successfully.
343 CreateSubframeWithTestNavigation(
344 GURL("https://www.example.com/allowed1.html"), main_rfh());
345 SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
346 SimulateRedirectAndExpectResult(GURL("https://www.example.com/allowed2.html"),
347 content::NavigationThrottle::PROCEED);
348 SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
349
350 EXPECT_EQ(0, disallowed_notification_count());
351 EXPECT_EQ(2, attempted_frame_activations());
352 }
353
354 // This should fail if the throttle manager notifies the delegate twice of a
355 // disallowed load for the same page load.
356 TEST_P(ContentSubresourceFilterThrottleManagerTest,
357 ActivateMainFrameAndFilterTwoSubframeNavigations) {
358 // Commit a navigation that triggers page level activation.
359 NavigateAndCommitMainFrame(GURL(kTestURLWithActivation));
360
361 // A disallowed subframe navigation should be successfully filtered.
362 CreateSubframeWithTestNavigation(
363 GURL("https://www.example.com/1/disallowed.html"), main_rfh());
364 SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
365
366 EXPECT_EQ(1, disallowed_notification_count());
367
368 CreateSubframeWithTestNavigation(
369 GURL("https://www.example.com/2/disallowed.html"), main_rfh());
370 SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
371
372 EXPECT_EQ(1, disallowed_notification_count());
373 EXPECT_EQ(1, attempted_frame_activations());
374 }
375
376 TEST_P(ContentSubresourceFilterThrottleManagerTest,
377 ActivateTwoMainFramesAndFilterTwoSubframeNavigations) {
378 // Commit a navigation that triggers page level activation.
379 NavigateAndCommitMainFrame(GURL(kTestURLWithActivation));
380
381 // A disallowed subframe navigation should be successfully filtered.
382 CreateSubframeWithTestNavigation(
383 GURL("https://www.example.com/1/disallowed.html"), main_rfh());
384 SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
385
386 EXPECT_EQ(1, disallowed_notification_count());
387
388 // Commit another navigation that triggers page level activation.
389 NavigateAndCommitMainFrame(GURL(kTestURLWithActivation2));
390
391 CreateSubframeWithTestNavigation(
392 GURL("https://www.example.com/2/disallowed.html"), main_rfh());
393 SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
394
395 EXPECT_EQ(2, disallowed_notification_count());
396 EXPECT_EQ(2, attempted_frame_activations());
397 }
398
399 // Test that the disallow load notification will not be repeated for the first
400 // disallowed load that follows a same-document navigation.
401 TEST_P(ContentSubresourceFilterThrottleManagerTest,
402 ActivateMainFrameDoNotNotifyAfterSameDocumentNav) {
403 // Commit a navigation that triggers page level activation.
404 NavigateAndCommitMainFrame(GURL(kTestURLWithActivation));
405
406 // A disallowed subframe navigation should be successfully filtered.
407 CreateSubframeWithTestNavigation(
408 GURL("https://www.example.com/1/disallowed.html"), main_rfh());
409 SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
410
411 EXPECT_EQ(1, disallowed_notification_count());
412
413 // Commit another navigation that triggers page level activation.
414 GURL url2 = GURL(base::StringPrintf("%s#ref", kTestURLWithActivation));
415 CreateTestNavigation(url2, main_rfh());
416 SimulateSamePageCommit();
417
418 CreateSubframeWithTestNavigation(
419 GURL("https://www.example.com/2/disallowed.html"), main_rfh());
420 SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
421
422 EXPECT_EQ(1, disallowed_notification_count());
423 EXPECT_EQ(1, attempted_frame_activations());
424 }
425
426 TEST_P(ContentSubresourceFilterThrottleManagerTest,
427 DoNotFilterForInactiveFrame) {
428 NavigateAndCommitMainFrame(GURL("https://do-not-activate.html"));
429
430 // A subframe navigation should complete successfully.
431 CreateSubframeWithTestNavigation(GURL("https://www.example.com/allowed.html"),
432 main_rfh());
433 SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
434 SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
435
436 EXPECT_EQ(0, disallowed_notification_count());
437 EXPECT_EQ(0, attempted_frame_activations());
438 }
439
440 TEST_P(ContentSubresourceFilterThrottleManagerTest, SuppressActivation) {
441 SuppressActivationForUrl(GURL(kTestURLWithActivation));
442 NavigateAndCommitMainFrame(GURL(kTestURLWithActivation));
443
444 // A subframe navigation should complete successfully.
445 CreateSubframeWithTestNavigation(GURL("https://www.example.com/allowed.html"),
446 main_rfh());
447 SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
448 SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
449
450 EXPECT_EQ(0, disallowed_notification_count());
451 EXPECT_EQ(1, attempted_frame_activations());
452 }
453
454 // Once there are no activated frames, the manager drops its ruleset handle. If
455 // another frame is activated, make sure the handle is regenerated.
456 TEST_P(ContentSubresourceFilterThrottleManagerTest, RulesetHandleRegeneration) {
457 NavigateAndCommitMainFrame(GURL(kTestURLWithActivation));
458
459 CreateSubframeWithTestNavigation(
460 GURL("https://www.example.com/disallowed.html"), main_rfh());
461 SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
462
463 EXPECT_EQ(1, disallowed_notification_count());
464
465 // Simulate a renderer crash which should delete the frame.
466 EXPECT_TRUE(ManagerHasRulesetHandle());
467 process()->SimulateCrash();
468 EXPECT_FALSE(ManagerHasRulesetHandle());
469
470 NavigateAndCommit(GURL("https://example.reset"));
471 NavigateAndCommitMainFrame(GURL(kTestURLWithActivation));
472
473 CreateSubframeWithTestNavigation(
474 GURL("https://www.example.com/disallowed.html"), main_rfh());
475 SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
476
477 EXPECT_EQ(2, disallowed_notification_count());
478 EXPECT_EQ(2, attempted_frame_activations());
479 }
480
481 TEST_P(ContentSubresourceFilterThrottleManagerTest,
482 SameSiteNavigation_RulesetGoesAway) {
483 GURL same_site_inactive_url =
484 GURL(base::StringPrintf("%ssuppressed.html", kTestURLWithActivation));
485 SuppressActivationForUrl(same_site_inactive_url);
486
487 NavigateAndCommitMainFrame(GURL(kTestURLWithActivation));
488 EXPECT_TRUE(ManagerHasRulesetHandle());
489
490 NavigateAndCommitMainFrame(same_site_inactive_url);
491 EXPECT_FALSE(ManagerHasRulesetHandle());
492
493 // A subframe navigation should complete successfully.
494 CreateSubframeWithTestNavigation(
495 GURL("https://www.example.com/disallowed.html"), main_rfh());
496 SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
497 SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
498
499 EXPECT_EQ(0, disallowed_notification_count());
500 EXPECT_EQ(1, attempted_frame_activations());
501 }
502
503 TEST_P(ContentSubresourceFilterThrottleManagerTest,
504 SameSiteFailedNavigation_MaintainActivation) {
505 NavigateAndCommitMainFrame(GURL(kTestURLWithActivation));
506 EXPECT_TRUE(ManagerHasRulesetHandle());
507
508 GURL same_site_inactive_url =
509 GURL(base::StringPrintf("%ssuppressed.html", kTestURLWithActivation));
510 SuppressActivationForUrl(same_site_inactive_url);
511
512 CreateTestNavigation(same_site_inactive_url, main_rfh());
513 SimulateFailedNavigation(net::ERR_ABORTED);
514 EXPECT_TRUE(ManagerHasRulesetHandle());
515
516 // A subframe navigation fail.
517 CreateSubframeWithTestNavigation(
518 GURL("https://www.example.com/disallowed.html"), main_rfh());
519 SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
520
521 EXPECT_EQ(1, disallowed_notification_count());
522 EXPECT_EQ(1, attempted_frame_activations());
523 }
524
525 TEST_P(ContentSubresourceFilterThrottleManagerTest,
526 FailedNavigationToErrorPage_NoActivation) {
527 NavigateAndCommitMainFrame(GURL(kTestURLWithActivation));
528 EXPECT_TRUE(ManagerHasRulesetHandle());
529
530 GURL same_site_inactive_url =
531 GURL(base::StringPrintf("%ssuppressed.html", kTestURLWithActivation));
532 SuppressActivationForUrl(same_site_inactive_url);
533
534 CreateTestNavigation(same_site_inactive_url, main_rfh());
535 SimulateFailedNavigation(net::ERR_FAILED);
536 EXPECT_FALSE(ManagerHasRulesetHandle());
537
538 // A subframe navigation fail.
539 CreateSubframeWithTestNavigation(
540 GURL("https://www.example.com/disallowed.html"), main_rfh());
541 SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
542 SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
543
544 EXPECT_EQ(0, disallowed_notification_count());
545 EXPECT_EQ(1, attempted_frame_activations());
546 }
547
548 // Ensure activation propagates into great-grandchild frames, including cross
549 // process ones.
550 TEST_P(ContentSubresourceFilterThrottleManagerTest, ActivationPropagation) {
551 NavigateAndCommitMainFrame(GURL(kTestURLWithActivation));
552
553 // Navigate a subframe to a URL that is not itself disallowed. Subresource
554 // filtering for this subframe document should still be activated.
555 CreateSubframeWithTestNavigation(GURL("https://www.a.com/allowed.html"),
556 main_rfh());
557 SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
558 content::RenderFrameHost* subframe1 =
559 SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
560
561 // Navigate a sub-subframe to a URL that is not itself disallowed. Subresource
562 // filtering for this subframe document should still be activated.
563 CreateSubframeWithTestNavigation(GURL("https://www.b.com/allowed.html"),
564 subframe1);
565 SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
566 content::RenderFrameHost* subframe2 =
567 SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
568
569 // A final, nested subframe navigation is filtered.
570 CreateSubframeWithTestNavigation(GURL("https://www.c.com/disallowed.html"),
571 subframe2);
572 SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
573
574 EXPECT_EQ(1, disallowed_notification_count());
575 EXPECT_EQ(3, attempted_frame_activations());
576 }
577
578 // Ensure activation propagates through whitelisted documents.
579 TEST_P(ContentSubresourceFilterThrottleManagerTest, ActivationPropagation2) {
580 NavigateAndCommitMainFrame(GURL(kTestURLWithActivation));
581
582 // Navigate a subframe that is not filtered, but should still activate.
583 CreateSubframeWithTestNavigation(GURL("https://whitelist.com"), main_rfh());
584 SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
585 content::RenderFrameHost* subframe1 =
586 SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
587
588 // Navigate a sub-subframe that is not filtered due to the whitelist.
589 CreateSubframeWithTestNavigation(
590 GURL("https://www.example.com/disallowed.html"), subframe1);
591 SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
592 SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
593
594 EXPECT_EQ(3, attempted_frame_activations());
595 EXPECT_EQ(0, disallowed_notification_count());
596
597 // An identical series of events that don't match whitelist rules cause
598 // filtering.
599 CreateSubframeWithTestNavigation(GURL("https://average-joe.com"), main_rfh());
600 SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
601 content::RenderFrameHost* subframe3 =
602 SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
603
604 // Navigate a sub-subframe that is not filtered due to the whitelist.
605 CreateSubframeWithTestNavigation(
606 GURL("https://www.example.com/disallowed.html"), subframe3);
607 SimulateStartAndExpectResult(content::NavigationThrottle::CANCEL);
608
609 EXPECT_EQ(4, attempted_frame_activations());
610 EXPECT_EQ(1, disallowed_notification_count());
611 }
612
613 // Same-site navigations within a single RFH do not persist activation.
614 TEST_P(ContentSubresourceFilterThrottleManagerTest,
615 SameSiteNavigationStopsActivation) {
616 NavigateAndCommitMainFrame(GURL(kTestURLWithActivation));
617 EXPECT_EQ(1, attempted_frame_activations());
618
619 // Mock a same-site navigation, in the same RFH, this URL does not trigger
620 // page level activation.
621 NavigateAndCommitMainFrame(
622 GURL(base::StringPrintf("%s/some_path/", kTestURLWithActivation)));
623 EXPECT_EQ(1, attempted_frame_activations());
624
625 CreateSubframeWithTestNavigation(
626 GURL("https://www.example.com/disallowed.html"), main_rfh());
627 SimulateStartAndExpectResult(content::NavigationThrottle::PROCEED);
628 SimulateCommitAndExpectResult(content::NavigationThrottle::PROCEED);
629
630 EXPECT_EQ(0, disallowed_notification_count());
631 EXPECT_EQ(1, attempted_frame_activations());
632 }
633
634 // TODO(csharrison): Make sure the following conditions are exercised in tests:
635 //
636 // - Verify IPCs are sent on activation.
637 //
638 // - Synchronous navigations to about:blank. These hit issues with the
639 // NavigationSimulator currently.
640
641 } // namespace subresource_filter
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698