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 <map> | 7 #include <map> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
| 11 #include "base/memory/ptr_util.h" |
| 12 #include "base/message_loop/message_loop.h" |
11 #include "base/metrics/field_trial.h" | 13 #include "base/metrics/field_trial.h" |
12 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
13 #include "build/build_config.h" | 15 #include "build/build_config.h" |
| 16 #include "chrome/browser/browsing_data/browsing_data_filter_builder.h" |
| 17 #include "chrome/browser/browsing_data/browsing_data_helper.h" |
| 18 #include "chrome/browser/browsing_data/browsing_data_remover.h" |
| 19 #include "chrome/browser/browsing_data/browsing_data_remover_factory.h" |
| 20 #include "chrome/browser/browsing_data/origin_filter_builder.h" |
| 21 #include "chrome/browser/browsing_data/registrable_domain_filter_builder.h" |
14 #include "chrome/browser/search_engines/template_url_service_factory.h" | 22 #include "chrome/browser/search_engines/template_url_service_factory.h" |
| 23 #include "chrome/test/base/testing_profile.h" |
15 #include "components/content_settings/core/browser/host_content_settings_map.h" | 24 #include "components/content_settings/core/browser/host_content_settings_map.h" |
16 #include "components/search_engines/template_url_service.h" | 25 #include "components/search_engines/template_url_service.h" |
17 #include "components/variations/entropy_provider.h" | 26 #include "components/variations/entropy_provider.h" |
18 #include "components/variations/variations_associated_data.h" | 27 #include "components/variations/variations_associated_data.h" |
19 #include "components/version_info/version_info.h" | 28 #include "components/version_info/version_info.h" |
20 #include "content/public/browser/navigation_controller.h" | 29 #include "content/public/browser/navigation_controller.h" |
21 #include "content/public/browser/navigation_entry.h" | 30 #include "content/public/browser/navigation_entry.h" |
22 #include "content/public/browser/web_contents.h" | 31 #include "content/public/browser/web_contents.h" |
23 #include "content/public/common/content_switches.h" | 32 #include "content/public/common/content_switches.h" |
24 #include "content/public/test/test_browser_thread_bundle.h" | 33 #include "content/public/test/test_browser_thread_bundle.h" |
| 34 #include "testing/gmock/include/gmock/gmock.h" |
25 #include "testing/gtest/include/gtest/gtest.h" | 35 #include "testing/gtest/include/gtest/gtest.h" |
26 #include "url/gurl.h" | 36 #include "url/gurl.h" |
27 | 37 |
28 #if !defined(OS_ANDROID) | 38 #if !defined(OS_ANDROID) |
29 #include "chrome/browser/ui/browser.h" | 39 #include "chrome/browser/ui/browser.h" |
30 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 40 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
31 #include "chrome/common/pref_names.h" | 41 #include "chrome/common/pref_names.h" |
32 #include "chrome/test/base/browser_with_test_window_test.h" | 42 #include "chrome/test/base/browser_with_test_window_test.h" |
33 #include "chrome/test/base/search_test_utils.h" | 43 #include "chrome/test/base/search_test_utils.h" |
34 #endif | 44 #endif |
35 | 45 |
| 46 using testing::_; |
36 using ChromeContentBrowserClientTest = testing::Test; | 47 using ChromeContentBrowserClientTest = testing::Test; |
37 | 48 |
38 TEST_F(ChromeContentBrowserClientTest, ShouldAssignSiteForURL) { | 49 TEST_F(ChromeContentBrowserClientTest, ShouldAssignSiteForURL) { |
39 ChromeContentBrowserClient client; | 50 ChromeContentBrowserClient client; |
40 EXPECT_FALSE(client.ShouldAssignSiteForURL(GURL("chrome-native://test"))); | 51 EXPECT_FALSE(client.ShouldAssignSiteForURL(GURL("chrome-native://test"))); |
41 EXPECT_TRUE(client.ShouldAssignSiteForURL(GURL("http://www.google.com"))); | 52 EXPECT_TRUE(client.ShouldAssignSiteForURL(GURL("http://www.google.com"))); |
42 EXPECT_TRUE(client.ShouldAssignSiteForURL(GURL("https://www.google.com"))); | 53 EXPECT_TRUE(client.ShouldAssignSiteForURL(GURL("https://www.google.com"))); |
43 } | 54 } |
44 | 55 |
45 // BrowserWithTestWindowTest doesn't work on Android. | 56 // BrowserWithTestWindowTest doesn't work on Android. |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 | 332 |
322 NavigationEntry* entry = browser()->tab_strip_model()-> | 333 NavigationEntry* entry = browser()->tab_strip_model()-> |
323 GetActiveWebContents()->GetController().GetLastCommittedEntry(); | 334 GetActiveWebContents()->GetController().GetLastCommittedEntry(); |
324 ASSERT_TRUE(entry != NULL); | 335 ASSERT_TRUE(entry != NULL); |
325 EXPECT_EQ(url_rewritten, entry->GetURL()); | 336 EXPECT_EQ(url_rewritten, entry->GetURL()); |
326 EXPECT_EQ(url_original, entry->GetVirtualURL()); | 337 EXPECT_EQ(url_original, entry->GetVirtualURL()); |
327 } | 338 } |
328 | 339 |
329 } // namespace content | 340 } // namespace content |
330 #endif // !defined(OS_ANDROID) | 341 #endif // !defined(OS_ANDROID) |
| 342 |
| 343 namespace { |
| 344 |
| 345 // Tests for ChromeContentBrowserClient::ClearSiteData(). |
| 346 class ChromeContentBrowserClientClearSiteDataTest : public testing::Test { |
| 347 public: |
| 348 class MockBrowsingDataRemover : public BrowsingDataRemover { |
| 349 public: |
| 350 explicit MockBrowsingDataRemover(content::BrowserContext* context) |
| 351 : BrowsingDataRemover(context) {} |
| 352 ~MockBrowsingDataRemover() {} |
| 353 |
| 354 MOCK_METHOD4(RemoveWithFilter, void( |
| 355 const TimeRange& time_range, int remove_mask, int origin_type_mask, |
| 356 const BrowsingDataFilterBuilder& filter_builder)); |
| 357 }; |
| 358 |
| 359 void SetUp() override { |
| 360 BrowsingDataRemoverFactory::GetInstance()->SetTestingFactoryAndUse( |
| 361 &profile_, &ChromeContentBrowserClientClearSiteDataTest::GetRemover); |
| 362 } |
| 363 |
| 364 content::BrowserContext* profile() { |
| 365 return &profile_; |
| 366 } |
| 367 |
| 368 MockBrowsingDataRemover* remover() { |
| 369 return static_cast<MockBrowsingDataRemover*>( |
| 370 BrowsingDataRemoverFactory::GetForBrowserContext(&profile_)); |
| 371 } |
| 372 |
| 373 private: |
| 374 static std::unique_ptr<KeyedService> GetRemover( |
| 375 content::BrowserContext* context) { |
| 376 return base::WrapUnique(new MockBrowsingDataRemover(context)); |
| 377 } |
| 378 |
| 379 base::MessageLoop loop_; |
| 380 TestingProfile profile_; |
| 381 }; |
| 382 |
| 383 // Matcher for BrowsingDataFilterBuilder. As it is not possible to compare |
| 384 // two BrowsingDataFilterBuilder-s of different kinds, it can only be used |
| 385 // when we know which subclass of BrowsingDataFilterBuilder we expect: |
| 386 // OriginFilterBuilder or RegistrableDomainFilterBuilder. |
| 387 class SameBuilderMatcher : |
| 388 public testing::MatcherInterface<const BrowsingDataFilterBuilder&> { |
| 389 public: |
| 390 explicit SameBuilderMatcher(const OriginFilterBuilder& builder) |
| 391 : origin_filter_builder_(&builder), domain_filter_builder_(nullptr) { |
| 392 } |
| 393 |
| 394 explicit SameBuilderMatcher(const RegistrableDomainFilterBuilder& builder) |
| 395 : origin_filter_builder_(nullptr), domain_filter_builder_(&builder) { |
| 396 } |
| 397 |
| 398 virtual bool MatchAndExplain(const BrowsingDataFilterBuilder& builder, |
| 399 testing::MatchResultListener* listener) const { |
| 400 if (origin_filter_builder_) { |
| 401 return *origin_filter_builder_ == |
| 402 static_cast<const OriginFilterBuilder&>(builder); |
| 403 } |
| 404 |
| 405 if (domain_filter_builder_) { |
| 406 return *domain_filter_builder_ == |
| 407 static_cast<const RegistrableDomainFilterBuilder&>(builder); |
| 408 } |
| 409 |
| 410 NOTREACHED(); |
| 411 return false; |
| 412 } |
| 413 |
| 414 void DescribeTo(std::ostream* os) const override { |
| 415 *os << "has the same scope, mode, and added entries as the expected " |
| 416 << "filter builder."; |
| 417 } |
| 418 |
| 419 void DescribeNegationTo(std::ostream* os) const override { |
| 420 *os << "differs from the expected filter builder in scope, mode, " |
| 421 << "or added entries."; |
| 422 } |
| 423 |
| 424 private: |
| 425 const OriginFilterBuilder* origin_filter_builder_; |
| 426 const RegistrableDomainFilterBuilder* domain_filter_builder_; |
| 427 }; |
| 428 |
| 429 // Tests that the parameters to ClearBrowsingData() are translated to |
| 430 // the correct BrowsingDataRemover::RemoveWithFilter() operation. The fourth |
| 431 // parameter, |filter_builder|, is tested in detail in the RegistrableDomains |
| 432 // test below. |
| 433 TEST_F(ChromeContentBrowserClientClearSiteDataTest, Parameters) { |
| 434 ChromeContentBrowserClient client; |
| 435 |
| 436 struct TestCase { |
| 437 bool cookies; |
| 438 bool storage; |
| 439 bool cache; |
| 440 int mask; |
| 441 } test_cases[] = { |
| 442 { false, false, false, 0 }, |
| 443 { true, false, false, BrowsingDataRemover::REMOVE_COOKIES }, |
| 444 { false, true, false, |
| 445 BrowsingDataRemover::REMOVE_SITE_DATA & |
| 446 ~BrowsingDataRemover::REMOVE_COOKIES }, |
| 447 { false, false, true, BrowsingDataRemover::REMOVE_CACHE }, |
| 448 { true, true, false, BrowsingDataRemover::REMOVE_SITE_DATA }, |
| 449 { true, false, true, |
| 450 BrowsingDataRemover::REMOVE_COOKIES | |
| 451 BrowsingDataRemover::REMOVE_CACHE }, |
| 452 { false, true, true, |
| 453 BrowsingDataRemover::REMOVE_CACHE | |
| 454 (BrowsingDataRemover::REMOVE_SITE_DATA & |
| 455 ~BrowsingDataRemover::REMOVE_COOKIES) }, |
| 456 { true, true, true, |
| 457 BrowsingDataRemover::REMOVE_SITE_DATA | |
| 458 BrowsingDataRemover::REMOVE_CACHE }, |
| 459 }; |
| 460 |
| 461 for (const TestCase& test_case : test_cases) { |
| 462 SCOPED_TRACE(test_case.mask); |
| 463 |
| 464 // We always delete data for all time and all origin types. |
| 465 BrowsingDataRemover::TimeRange all_time(base::Time(), base::Time::Max()); |
| 466 BrowsingDataHelper::OriginTypeMask all_origin_types = |
| 467 BrowsingDataHelper::ALL; |
| 468 |
| 469 // Some data are deleted for the origin and some for the registrable domain. |
| 470 // Depending on the chosen datatypes, this might result into one or two |
| 471 // calls. In the latter case, the removal mask will be split into two |
| 472 // parts - one for the origin deletion and one for the registrable domain. |
| 473 const int domain_scoped_types = |
| 474 BrowsingDataRemover::REMOVE_COOKIES & |
| 475 BrowsingDataRemover::REMOVE_CHANNEL_IDS; |
| 476 int origin_deletion_mask = |
| 477 test_case.mask & domain_scoped_types; |
| 478 int registrable_domain_deletion_mask = |
| 479 test_case.mask & ~domain_scoped_types; |
| 480 |
| 481 EXPECT_CALL( |
| 482 *remover(), |
| 483 RemoveWithFilter( |
| 484 all_time, |
| 485 origin_deletion_mask, |
| 486 all_origin_types, |
| 487 _)).Times(origin_deletion_mask != 0); |
| 488 |
| 489 EXPECT_CALL( |
| 490 *remover(), |
| 491 RemoveWithFilter( |
| 492 all_time, |
| 493 registrable_domain_deletion_mask, |
| 494 all_origin_types, |
| 495 _)).Times(registrable_domain_deletion_mask != 0); |
| 496 |
| 497 client.ClearSiteData( |
| 498 profile(), url::Origin(GURL("https://www.example.com")), |
| 499 test_case.cookies, test_case.storage, test_case.cache); |
| 500 |
| 501 testing::Mock::VerifyAndClearExpectations(remover()); |
| 502 } |
| 503 } |
| 504 |
| 505 // Tests that ClearBrowsingData() called for an origin deletes cookies in the |
| 506 // scope of the registrable domain corresponding to that origin, while cache |
| 507 // is deleted for that exact origin. |
| 508 TEST_F(ChromeContentBrowserClientClearSiteDataTest, RegistrableDomains) { |
| 509 ChromeContentBrowserClient client; |
| 510 |
| 511 struct TestCase { |
| 512 const char* origin; // origin on which ClearSiteData() is called. |
| 513 const char* domain; // domain on which cookies will be deleted. |
| 514 } test_cases[] = { |
| 515 // TLD has no embedded dot. |
| 516 { "https://example.com", "example.com" }, |
| 517 { "https://www.example.com", "example.com" }, |
| 518 { "https://www.fourth.third.second.com", "second.com" }, |
| 519 |
| 520 // TLD has one embedded dot. |
| 521 { "https://www.example.co.uk", "example.co.uk" }, |
| 522 { "https://example.co.uk", "example.co.uk" }, |
| 523 |
| 524 // TLD has more embedded dots. |
| 525 { "https://www.website.sp.nom.br", "website.sp.nom.br" }, |
| 526 |
| 527 // IP addresses. |
| 528 { "http://127.0.0.1", "127.0.0.1" }, |
| 529 { "http://192.168.0.1", "192.168.0.1" }, |
| 530 { "http://192.168.0.1", "192.168.0.1" }, |
| 531 |
| 532 // Internal hostnames. |
| 533 { "http://localhost", "localhost" }, |
| 534 { "http://fileserver", "fileserver" }, |
| 535 |
| 536 // These are not subdomains of internal hostnames, but subdomain of |
| 537 // unknown TLDs. |
| 538 { "http://subdomain.localhost", "subdomain.localhost" }, |
| 539 { "http://www.subdomain.localhost", "subdomain.localhost" }, |
| 540 { "http://documents.fileserver", "documents.fileserver" }, |
| 541 |
| 542 // Scheme and port don't matter. |
| 543 { "http://example.com", "example.com" }, |
| 544 { "http://example.com:8080", "example.com" }, |
| 545 { "https://example.com:4433", "example.com" }, |
| 546 }; |
| 547 |
| 548 for (const TestCase& test_case : test_cases) { |
| 549 SCOPED_TRACE(test_case.origin); |
| 550 |
| 551 OriginFilterBuilder origin_filter_builder( |
| 552 BrowsingDataFilterBuilder::WHITELIST); |
| 553 origin_filter_builder.AddOrigin(url::Origin(GURL(test_case.origin))); |
| 554 |
| 555 EXPECT_CALL( |
| 556 *remover(), |
| 557 RemoveWithFilter( |
| 558 _, |
| 559 BrowsingDataRemover::REMOVE_CACHE, |
| 560 _, |
| 561 MakeMatcher(new SameBuilderMatcher( |
| 562 origin_filter_builder)))); |
| 563 |
| 564 RegistrableDomainFilterBuilder registrable_domain_filter_builder( |
| 565 BrowsingDataFilterBuilder::WHITELIST); |
| 566 registrable_domain_filter_builder.AddRegisterableDomain(test_case.domain); |
| 567 |
| 568 EXPECT_CALL(*remover(), |
| 569 RemoveWithFilter( |
| 570 _, |
| 571 BrowsingDataRemover::REMOVE_COOKIES, |
| 572 _, |
| 573 MakeMatcher(new SameBuilderMatcher( |
| 574 registrable_domain_filter_builder)))); |
| 575 |
| 576 client.ClearSiteData( |
| 577 profile(), url::Origin(GURL(test_case.origin)), |
| 578 true /* cookies */, false /* storage */, true /* cache */); |
| 579 |
| 580 testing::Mock::VerifyAndClearExpectations(remover()); |
| 581 } |
| 582 } |
| 583 |
| 584 } // namespace |
OLD | NEW |