OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chrome_content_browser_client.h" | 5 #include "chrome/browser/chrome_content_browser_client.h" |
6 | 6 |
7 #include <list> | 7 #include <list> |
8 #include <map> | 8 #include <map> |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
15 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
16 #include "base/metrics/field_trial.h" | 16 #include "base/metrics/field_trial.h" |
17 #include "base/run_loop.h" | 17 #include "base/run_loop.h" |
18 #include "base/strings/stringprintf.h" | 18 #include "base/strings/stringprintf.h" |
19 #include "base/strings/utf_string_conversions.h" | 19 #include "base/strings/utf_string_conversions.h" |
20 #include "build/build_config.h" | 20 #include "build/build_config.h" |
21 #include "chrome/browser/browsing_data/browsing_data_helper.h" | 21 #include "chrome/browser/browsing_data/browsing_data_helper.h" |
22 #include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h" | 22 #include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h" |
23 #include "chrome/browser/browsing_data/mock_browsing_data_remover_delegate.h" | |
24 #include "chrome/browser/search_engines/template_url_service_factory.h" | 23 #include "chrome/browser/search_engines/template_url_service_factory.h" |
25 #include "chrome/test/base/testing_profile.h" | 24 #include "chrome/test/base/testing_profile.h" |
26 #include "components/content_settings/core/browser/host_content_settings_map.h" | 25 #include "components/content_settings/core/browser/host_content_settings_map.h" |
27 #include "components/search_engines/template_url_service.h" | 26 #include "components/search_engines/template_url_service.h" |
28 #include "components/variations/entropy_provider.h" | 27 #include "components/variations/entropy_provider.h" |
29 #include "components/variations/variations_associated_data.h" | 28 #include "components/variations/variations_associated_data.h" |
30 #include "components/version_info/version_info.h" | 29 #include "components/version_info/version_info.h" |
31 #include "content/public/browser/browsing_data_filter_builder.h" | 30 #include "content/public/browser/browsing_data_filter_builder.h" |
32 #include "content/public/browser/browsing_data_remover.h" | 31 #include "content/public/browser/browsing_data_remover.h" |
33 #include "content/public/browser/navigation_controller.h" | 32 #include "content/public/browser/navigation_controller.h" |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 | 335 |
337 NavigationEntry* entry = browser()->tab_strip_model()-> | 336 NavigationEntry* entry = browser()->tab_strip_model()-> |
338 GetActiveWebContents()->GetController().GetLastCommittedEntry(); | 337 GetActiveWebContents()->GetController().GetLastCommittedEntry(); |
339 ASSERT_TRUE(entry != NULL); | 338 ASSERT_TRUE(entry != NULL); |
340 EXPECT_EQ(url_rewritten, entry->GetURL()); | 339 EXPECT_EQ(url_rewritten, entry->GetURL()); |
341 EXPECT_EQ(url_original, entry->GetVirtualURL()); | 340 EXPECT_EQ(url_original, entry->GetVirtualURL()); |
342 } | 341 } |
343 | 342 |
344 } // namespace content | 343 } // namespace content |
345 #endif // !defined(OS_ANDROID) | 344 #endif // !defined(OS_ANDROID) |
346 | |
347 namespace { | |
348 | |
349 // Tests for ChromeContentBrowserClient::ClearSiteData(). | |
350 class ChromeContentBrowserClientClearSiteDataTest : public testing::Test { | |
351 public: | |
352 void SetUp() override { | |
353 content::BrowserContext::GetBrowsingDataRemover(profile()) | |
354 ->SetEmbedderDelegate(&mock_delegate_); | |
355 run_loop_.reset(new base::RunLoop()); | |
356 } | |
357 | |
358 content::BrowserContext* profile() { return &profile_; } | |
359 | |
360 MockBrowsingDataRemoverDelegate* delegate() { return &mock_delegate_; } | |
361 | |
362 void OnClearingFinished() { run_loop_->Quit(); } | |
363 | |
364 void WaitForClearingFinished() { | |
365 run_loop_->Run(); | |
366 run_loop_.reset(new base::RunLoop()); | |
367 } | |
368 | |
369 private: | |
370 std::unique_ptr<base::RunLoop> run_loop_; | |
371 MockBrowsingDataRemoverDelegate mock_delegate_; | |
372 content::TestBrowserThreadBundle thread_bundle_; | |
373 TestingProfile profile_; | |
374 }; | |
375 | |
376 // Tests that the parameters to ClearBrowsingData() are translated to | |
377 // the correct BrowsingDataRemover::RemoveInternal() operation. The fourth | |
378 // parameter, |filter_builder|, is tested in detail in the RegistrableDomains | |
379 // test below. | |
380 TEST_F(ChromeContentBrowserClientClearSiteDataTest, Parameters) { | |
381 ChromeContentBrowserClient client; | |
382 | |
383 struct TestCase { | |
384 bool cookies; | |
385 bool storage; | |
386 bool cache; | |
387 int mask; | |
388 } test_cases[] = { | |
389 {false, false, false, 0}, | |
390 {true, false, false, | |
391 content::BrowsingDataRemover::DATA_TYPE_COOKIES | | |
392 content::BrowsingDataRemover::DATA_TYPE_CHANNEL_IDS | | |
393 ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PLUGIN_DATA}, | |
394 {false, true, false, content::BrowsingDataRemover::DATA_TYPE_DOM_STORAGE}, | |
395 {false, false, true, content::BrowsingDataRemover::DATA_TYPE_CACHE}, | |
396 {true, true, false, | |
397 content::BrowsingDataRemover::DATA_TYPE_COOKIES | | |
398 content::BrowsingDataRemover::DATA_TYPE_CHANNEL_IDS | | |
399 ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PLUGIN_DATA | | |
400 content::BrowsingDataRemover::DATA_TYPE_DOM_STORAGE}, | |
401 {true, false, true, | |
402 content::BrowsingDataRemover::DATA_TYPE_COOKIES | | |
403 content::BrowsingDataRemover::DATA_TYPE_CHANNEL_IDS | | |
404 ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PLUGIN_DATA | | |
405 content::BrowsingDataRemover::DATA_TYPE_CACHE}, | |
406 {false, true, true, | |
407 content::BrowsingDataRemover::DATA_TYPE_DOM_STORAGE | | |
408 content::BrowsingDataRemover::DATA_TYPE_CACHE}, | |
409 {true, true, true, | |
410 content::BrowsingDataRemover::DATA_TYPE_COOKIES | | |
411 content::BrowsingDataRemover::DATA_TYPE_CHANNEL_IDS | | |
412 ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PLUGIN_DATA | | |
413 content::BrowsingDataRemover::DATA_TYPE_DOM_STORAGE | | |
414 content::BrowsingDataRemover::DATA_TYPE_CACHE}, | |
415 }; | |
416 | |
417 for (unsigned int i = 0; i < arraysize(test_cases); ++i) { | |
418 SCOPED_TRACE(base::StringPrintf("Test case %d", i)); | |
419 const TestCase& test_case = test_cases[i]; | |
420 | |
421 // We always delete data for all time and all origin types. | |
422 int all_origin_types = ChromeBrowsingDataRemoverDelegate::ALL_ORIGIN_TYPES; | |
423 | |
424 // Some data are deleted for the origin and some for the registrable domain. | |
425 // Depending on the chosen datatypes, this might result into one or two | |
426 // calls. In the latter case, the removal mask will be split into two | |
427 // parts - one for the origin deletion and one for the registrable domain. | |
428 const int domain_scoped_types = | |
429 content::BrowsingDataRemover::DATA_TYPE_COOKIES | | |
430 content::BrowsingDataRemover::DATA_TYPE_CHANNEL_IDS | | |
431 ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PLUGIN_DATA; | |
432 int registrable_domain_deletion_mask = test_case.mask & domain_scoped_types; | |
433 int origin_deletion_mask = test_case.mask & ~domain_scoped_types; | |
434 | |
435 if (registrable_domain_deletion_mask) { | |
436 delegate()->ExpectCallDontCareAboutFilterBuilder( | |
437 base::Time(), base::Time::Max(), registrable_domain_deletion_mask, | |
438 all_origin_types); | |
439 } | |
440 | |
441 if (origin_deletion_mask) { | |
442 delegate()->ExpectCallDontCareAboutFilterBuilder( | |
443 base::Time(), base::Time::Max(), origin_deletion_mask, | |
444 all_origin_types); | |
445 } | |
446 | |
447 client.ClearSiteData( | |
448 profile(), url::Origin(GURL("https://www.example.com")), | |
449 test_case.cookies, test_case.storage, test_case.cache, | |
450 base::Bind( | |
451 &ChromeContentBrowserClientClearSiteDataTest::OnClearingFinished, | |
452 base::Unretained(this))); | |
453 WaitForClearingFinished(); | |
454 | |
455 delegate()->VerifyAndClearExpectations(); | |
456 } | |
457 } | |
458 | |
459 // Tests that ClearBrowsingData() called for an origin deletes cookies in the | |
460 // scope of the registrable domain corresponding to that origin, while cache | |
461 // is deleted for that exact origin. | |
462 TEST_F(ChromeContentBrowserClientClearSiteDataTest, RegistrableDomains) { | |
463 ChromeContentBrowserClient client; | |
464 | |
465 struct TestCase { | |
466 const char* origin; // origin on which ClearSiteData() is called. | |
467 const char* domain; // domain on which cookies will be deleted. | |
468 } test_cases[] = { | |
469 // TLD has no embedded dot. | |
470 {"https://example.com", "example.com"}, | |
471 {"https://www.example.com", "example.com"}, | |
472 {"https://www.fourth.third.second.com", "second.com"}, | |
473 | |
474 // TLD has one embedded dot. | |
475 {"https://www.example.co.uk", "example.co.uk"}, | |
476 {"https://example.co.uk", "example.co.uk"}, | |
477 | |
478 // TLD has more embedded dots. | |
479 {"https://www.website.sp.nom.br", "website.sp.nom.br"}, | |
480 | |
481 // IP addresses. | |
482 {"http://127.0.0.1", "127.0.0.1"}, | |
483 {"http://192.168.0.1", "192.168.0.1"}, | |
484 {"http://192.168.0.1", "192.168.0.1"}, | |
485 | |
486 // Internal hostnames. | |
487 {"http://localhost", "localhost"}, | |
488 {"http://fileserver", "fileserver"}, | |
489 | |
490 // These are not subdomains of internal hostnames, but subdomain of | |
491 // unknown TLDs. | |
492 {"http://subdomain.localhost", "subdomain.localhost"}, | |
493 {"http://www.subdomain.localhost", "subdomain.localhost"}, | |
494 {"http://documents.fileserver", "documents.fileserver"}, | |
495 | |
496 // Scheme and port don't matter. | |
497 {"http://example.com", "example.com"}, | |
498 {"http://example.com:8080", "example.com"}, | |
499 {"https://example.com:4433", "example.com"}, | |
500 }; | |
501 | |
502 for (const TestCase& test_case : test_cases) { | |
503 SCOPED_TRACE(test_case.origin); | |
504 | |
505 std::unique_ptr<BrowsingDataFilterBuilder> | |
506 registrable_domain_filter_builder(BrowsingDataFilterBuilder::Create( | |
507 BrowsingDataFilterBuilder::WHITELIST)); | |
508 registrable_domain_filter_builder->AddRegisterableDomain(test_case.domain); | |
509 | |
510 delegate()->ExpectCall( | |
511 base::Time(), base::Time::Max(), | |
512 content::BrowsingDataRemover::DATA_TYPE_COOKIES | | |
513 content::BrowsingDataRemover::DATA_TYPE_CHANNEL_IDS | | |
514 ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PLUGIN_DATA, | |
515 ChromeBrowsingDataRemoverDelegate::ALL_ORIGIN_TYPES, | |
516 *registrable_domain_filter_builder); | |
517 | |
518 std::unique_ptr<BrowsingDataFilterBuilder> origin_filter_builder( | |
519 BrowsingDataFilterBuilder::Create( | |
520 BrowsingDataFilterBuilder::WHITELIST)); | |
521 origin_filter_builder->AddOrigin(url::Origin(GURL(test_case.origin))); | |
522 | |
523 delegate()->ExpectCall(base::Time(), base::Time::Max(), | |
524 content::BrowsingDataRemover::DATA_TYPE_CACHE, | |
525 ChromeBrowsingDataRemoverDelegate::ALL_ORIGIN_TYPES, | |
526 *origin_filter_builder); | |
527 | |
528 client.ClearSiteData( | |
529 profile(), url::Origin(GURL(test_case.origin)), true /* cookies */, | |
530 false /* storage */, true /* cache */, | |
531 base::Bind( | |
532 &ChromeContentBrowserClientClearSiteDataTest::OnClearingFinished, | |
533 base::Unretained(this))); | |
534 WaitForClearingFinished(); | |
535 | |
536 delegate()->VerifyAndClearExpectations(); | |
537 } | |
538 } | |
539 | |
540 // Tests that we always wait for all scheduled BrowsingDataRemover tasks and | |
541 // that BrowsingDataRemoverObserver never leaks. | |
542 TEST_F(ChromeContentBrowserClientClearSiteDataTest, Tasks) { | |
543 ChromeContentBrowserClient client; | |
544 url::Origin origin(GURL("https://www.example.com")); | |
545 | |
546 // No removal tasks. | |
547 client.ClearSiteData( | |
548 profile(), origin, false /* cookies */, false /* storage */, | |
549 false /* cache */, | |
550 base::Bind( | |
551 &ChromeContentBrowserClientClearSiteDataTest::OnClearingFinished, | |
552 base::Unretained(this))); | |
553 WaitForClearingFinished(); | |
554 | |
555 // One removal task: deleting cookies with a domain filter. | |
556 client.ClearSiteData( | |
557 profile(), origin, true /* cookies */, false /* storage */, | |
558 false /* cache */, | |
559 base::Bind( | |
560 &ChromeContentBrowserClientClearSiteDataTest::OnClearingFinished, | |
561 base::Unretained(this))); | |
562 WaitForClearingFinished(); | |
563 | |
564 // One removal task: deleting cache with a domain filter. | |
565 client.ClearSiteData( | |
566 profile(), origin, false /* cookies */, false /* storage */, | |
567 true /* cache */, | |
568 base::Bind( | |
569 &ChromeContentBrowserClientClearSiteDataTest::OnClearingFinished, | |
570 base::Unretained(this))); | |
571 WaitForClearingFinished(); | |
572 | |
573 // Two removal tasks, with domain and origin filters respectively. | |
574 client.ClearSiteData( | |
575 profile(), origin, true /* cookies */, false /* storage */, | |
576 true /* cache */, | |
577 base::Bind( | |
578 &ChromeContentBrowserClientClearSiteDataTest::OnClearingFinished, | |
579 base::Unretained(this))); | |
580 WaitForClearingFinished(); | |
581 } | |
582 | |
583 } // namespace | |
OLD | NEW |