1 // Copyright (c) 2012 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 "chrome/browser/browsing_data/browsing_data_remover.h" 6 7 #include <set> 8 #include <vector> 9 10 #include "base/bind.h" 11 #include "base/bind_helpers.h" 12 #include "base/file_util.h" 13 #include "base/files/file_path.h" 14 #include "base/guid.h" 15 #include "base/message_loop/message_loop.h" 16 #include "base/platform_file.h" 17 #include "base/prefs/testing_pref_service.h" 18 #include "base/strings/utf_string_conversions.h" 19 #include "chrome/browser/autofill/personal_data_manager_factory.h" 20 #include "chrome/browser/browsing_data/browsing_data_helper.h" 21 #include "chrome/browser/chrome_notification_types.h" 22 #include "chrome/browser/extensions/mock_extension_special_storage_policy.h" 23 #include "chrome/browser/history/history_service.h" 24 #include "chrome/browser/history/history_service_factory.h" 25 #include "chrome/browser/safe_browsing/safe_browsing_service.h" 26 #include "chrome/common/pref_names.h" 27 #include "chrome/test/base/testing_browser_process.h" 28 #include "chrome/test/base/testing_profile.h" 29 #include "components/autofill/core/browser/autofill_common_test.h" 30 #include "components/autofill/core/browser/autofill_profile.h" 31 #include "components/autofill/core/browser/credit_card.h" 32 #include "components/autofill/core/browser/personal_data_manager.h" 33 #include "components/autofill/core/browser/personal_data_manager_observer.h" 34 #include "content/public/browser/dom_storage_context.h" 35 #include "content/public/browser/local_storage_usage_info.h" 36 #include "content/public/browser/notification_service.h" 37 #include "content/public/browser/storage_partition.h" 38 #include "content/public/test/test_browser_thread.h" 39 #include "content/public/test/test_browser_thread_bundle.h" 40 #include "net/cookies/cookie_monster.h" 41 #include "net/ssl/server_bound_cert_service.h" 42 #include "net/ssl/server_bound_cert_store.h" 43 #include "net/ssl/ssl_client_cert_type.h" 44 #include "net/url_request/url_request_context.h" 45 #include "net/url_request/url_request_context_getter.h" 46 #include "testing/gtest/include/gtest/gtest.h" 47 #include "webkit/browser/quota/mock_quota_manager.h" 48 #include "webkit/browser/quota/quota_manager.h" 49 #include "webkit/common/quota/quota_types.h" 50 51 using content::BrowserThread; 52 53 namespace { 54 55 const char kTestOrigin1[] = "http://host1:1/"; 56 const char kTestOrigin2[] = "http://host2:1/"; 57 const char kTestOrigin3[] = "http://host3:1/"; 58 const char kTestOriginExt[] = "chrome-extension://abcdefghijklmnopqrstuvwxyz/"; 59 const char kTestOriginDevTools[] = "chrome-devtools://abcdefghijklmnopqrstuvw/"; 60 61 // For Autofill. 62 const char kChromeOrigin[] = "Chrome settings"; 63 const char kWebOrigin[] = "https://www.example.com/"; 64 65 const GURL kOrigin1(kTestOrigin1); 66 const GURL kOrigin2(kTestOrigin2); 67 const GURL kOrigin3(kTestOrigin3); 68 const GURL kOriginExt(kTestOriginExt); 69 const GURL kOriginDevTools(kTestOriginDevTools); 70 71 const base::FilePath::CharType kDomStorageOrigin1[] = 72 FILE_PATH_LITERAL("http_host1_1.localstorage"); 73 74 const base::FilePath::CharType kDomStorageOrigin2[] = 75 FILE_PATH_LITERAL("http_host2_1.localstorage"); 76 77 const base::FilePath::CharType kDomStorageOrigin3[] = 78 FILE_PATH_LITERAL("http_host3_1.localstorage"); 79 80 const base::FilePath::CharType kDomStorageExt[] = FILE_PATH_LITERAL( 81 "chrome-extension_abcdefghijklmnopqrstuvwxyz_0.localstorage"); 82 83 const quota::StorageType kTemporary = quota::kStorageTypeTemporary; 84 const quota::StorageType kPersistent = quota::kStorageTypePersistent; 85 86 const quota::QuotaClient::ID kClientFile = quota::QuotaClient::kFileSystem; 87 const quota::QuotaClient::ID kClientDB = quota::QuotaClient::kIndexedDatabase; 88 89 void PopulateTestQuotaManagedNonBrowsingData(quota::MockQuotaManager* manager) { 90 manager->AddOrigin(kOriginDevTools, kTemporary, kClientFile, base::Time()); 91 manager->AddOrigin(kOriginDevTools, kPersistent, kClientFile, base::Time()); 92 manager->AddOrigin(kOriginExt, kTemporary, kClientFile, base::Time()); 93 manager->AddOrigin(kOriginExt, kPersistent, kClientFile, base::Time()); 94 } 95 96 void PopulateTestQuotaManagedPersistentData(quota::MockQuotaManager* manager) { 97 manager->AddOrigin(kOrigin2, kPersistent, kClientFile, base::Time()); 98 manager->AddOrigin(kOrigin3, kPersistent, kClientFile, 99 base::Time::Now() - base::TimeDelta::FromDays(1)); 100 101 EXPECT_FALSE(manager->OriginHasData(kOrigin1, kPersistent, kClientFile)); 102 EXPECT_TRUE(manager->OriginHasData(kOrigin2, kPersistent, kClientFile)); 103 EXPECT_TRUE(manager->OriginHasData(kOrigin3, kPersistent, kClientFile)); 104 } 105 106 void PopulateTestQuotaManagedTemporaryData(quota::MockQuotaManager* manager) { 107 manager->AddOrigin(kOrigin1, kTemporary, kClientFile, base::Time::Now()); 108 manager->AddOrigin(kOrigin3, kTemporary, kClientFile, 109 base::Time::Now() - base::TimeDelta::FromDays(1)); 110 111 EXPECT_TRUE(manager->OriginHasData(kOrigin1, kTemporary, kClientFile)); 112 EXPECT_FALSE(manager->OriginHasData(kOrigin2, kTemporary, kClientFile)); 113 EXPECT_TRUE(manager->OriginHasData(kOrigin3, kTemporary, kClientFile)); 114 } 115 116 void PopulateTestQuotaManagedData(quota::MockQuotaManager* manager) { 117 // Set up kOrigin1 with a temporary quota, kOrigin2 with a persistent 118 // quota, and kOrigin3 with both. kOrigin1 is modified now, kOrigin2 119 // is modified at the beginning of time, and kOrigin3 is modified one day 120 // ago. 121 PopulateTestQuotaManagedPersistentData(manager); 122 PopulateTestQuotaManagedTemporaryData(manager); 123 } 124 125 class AwaitCompletionHelper : public BrowsingDataRemover::Observer { 126 public: 127 AwaitCompletionHelper() : start_(false), already_quit_(false) {} 128 virtual ~AwaitCompletionHelper() {} 129 130 void BlockUntilNotified() { 131 if (!already_quit_) { 132 DCHECK(!start_); 133 start_ = true; 134 base::MessageLoop::current()->Run(); 135 } else { 136 DCHECK(!start_); 137 already_quit_ = false; 138 } 139 } 140 141 void Notify() { 142 if (start_) { 143 DCHECK(!already_quit_); 144 base::MessageLoop::current()->Quit(); 145 start_ = false; 146 } else { 147 DCHECK(!already_quit_); 148 already_quit_ = true; 149 } 150 } 151 152 protected: 153 // BrowsingDataRemover::Observer implementation. 154 virtual void OnBrowsingDataRemoverDone() OVERRIDE { 155 Notify(); 156 } 157 158 private: 159 // Helps prevent from running message_loop, if the callback invoked 160 // immediately. 161 bool start_; 162 bool already_quit_; 163 164 DISALLOW_COPY_AND_ASSIGN(AwaitCompletionHelper); 165 }; 166 167 } // namespace 168 169 // Testers ------------------------------------------------------------------- 170 171 class RemoveCookieTester { 172 public: 173 RemoveCookieTester() : get_cookie_success_(false), monster_(NULL) { 174 } 175 176 // Returns true, if the given cookie exists in the cookie store. 177 bool ContainsCookie() { 178 get_cookie_success_ = false; 179 monster_->GetCookiesWithOptionsAsync( 180 kOrigin1, net::CookieOptions(), 181 base::Bind(&RemoveCookieTester::GetCookieCallback, 182 base::Unretained(this))); 183 await_completion_.BlockUntilNotified(); 184 return get_cookie_success_; 185 } 186 187 void AddCookie() { 188 monster_->SetCookieWithOptionsAsync( 189 kOrigin1, "A=1", net::CookieOptions(), 190 base::Bind(&RemoveCookieTester::SetCookieCallback, 191 base::Unretained(this))); 192 await_completion_.BlockUntilNotified(); 193 } 194 195 protected: 196 void SetMonster(net::CookieStore* monster) { 197 monster_ = monster; 198 } 199 200 private: 201 void GetCookieCallback(const std::string& cookies) { 202 if (cookies == "A=1") { 203 get_cookie_success_ = true; 204 } else { 205 EXPECT_EQ("", cookies); 206 get_cookie_success_ = false; 207 } 208 await_completion_.Notify(); 209 } 210 211 void SetCookieCallback(bool result) { 212 ASSERT_TRUE(result); 213 await_completion_.Notify(); 214 } 215 216 bool get_cookie_success_; 217 AwaitCompletionHelper await_completion_; 218 net::CookieStore* monster_; 219 220 DISALLOW_COPY_AND_ASSIGN(RemoveCookieTester); 221 }; 222 223 class RemoveProfileCookieTester : public RemoveCookieTester { 224 public: 225 explicit RemoveProfileCookieTester(TestingProfile* profile) { 226 SetMonster(profile->GetRequestContext()->GetURLRequestContext()-> 227 cookie_store()->GetCookieMonster()); 228 } 229 }; 230 231 #if defined(FULL_SAFE_BROWSING) || defined(MOBILE_SAFE_BROWSING) 232 class RemoveSafeBrowsingCookieTester : public RemoveCookieTester { 233 public: 234 RemoveSafeBrowsingCookieTester() 235 : browser_process_(TestingBrowserProcess::GetGlobal()) { 236 scoped_refptr<SafeBrowsingService> sb_service = 237 SafeBrowsingService::CreateSafeBrowsingService(); 238 browser_process_->SetSafeBrowsingService(sb_service.get()); 239 sb_service->Initialize(); 240 base::MessageLoop::current()->RunUntilIdle(); 241 242 // Create a cookiemonster that does not have persistant storage, and replace 243 // the SafeBrowsingService created one with it. 244 net::CookieStore* monster = new net::CookieMonster(NULL, NULL); 245 sb_service->url_request_context()->GetURLRequestContext()-> 246 set_cookie_store(monster); 247 SetMonster(monster); 248 } 249 250 virtual ~RemoveSafeBrowsingCookieTester() { 251 browser_process_->safe_browsing_service()->ShutDown(); 252 base::MessageLoop::current()->RunUntilIdle(); 253 browser_process_->SetSafeBrowsingService(NULL); 254 } 255 256 private: 257 TestingBrowserProcess* browser_process_; 258 259 DISALLOW_COPY_AND_ASSIGN(RemoveSafeBrowsingCookieTester); 260 }; 261 #endif 262 263 class RemoveServerBoundCertTester : public net::SSLConfigService::Observer { 264 public: 265 explicit RemoveServerBoundCertTester(TestingProfile* profile) 266 : ssl_config_changed_count_(0) { 267 server_bound_cert_service_ = profile->GetRequestContext()-> 268 GetURLRequestContext()->server_bound_cert_service(); 269 ssl_config_service_ = profile->GetSSLConfigService(); 270 ssl_config_service_->AddObserver(this); 271 } 272 273 virtual ~RemoveServerBoundCertTester() { 274 ssl_config_service_->RemoveObserver(this); 275 } 276 277 int ServerBoundCertCount() { 278 return server_bound_cert_service_->cert_count(); 279 } 280 281 // Add a server bound cert for |server| with specific creation and expiry 282 // times. The cert and key data will be filled with dummy values. 283 void AddServerBoundCertWithTimes(const std::string& server_identifier, 284 base::Time creation_time, 285 base::Time expiration_time) { 286 GetCertStore()->SetServerBoundCert(server_identifier, 287 creation_time, 288 expiration_time, 289 "a", 290 "b"); 291 } 292 293 // Add a server bound cert for |server|, with the current time as the 294 // creation time. The cert and key data will be filled with dummy values. 295 void AddServerBoundCert(const std::string& server_identifier) { 296 base::Time now = base::Time::Now(); 297 AddServerBoundCertWithTimes(server_identifier, 298 now, 299 now + base::TimeDelta::FromDays(1)); 300 } 301 302 void GetCertList(net::ServerBoundCertStore::ServerBoundCertList* certs) { 303 GetCertStore()->GetAllServerBoundCerts( 304 base::Bind(&RemoveServerBoundCertTester::GetAllCertsCallback, certs)); 305 } 306 307 net::ServerBoundCertStore* GetCertStore() { 308 return server_bound_cert_service_->GetCertStore(); 309 } 310 311 int ssl_config_changed_count() const { 312 return ssl_config_changed_count_; 313 } 314 315 // net::SSLConfigService::Observer implementation: 316 virtual void OnSSLConfigChanged() OVERRIDE { 317 ssl_config_changed_count_++; 318 } 319 320 private: 321 static void GetAllCertsCallback( 322 net::ServerBoundCertStore::ServerBoundCertList* dest, 323 const net::ServerBoundCertStore::ServerBoundCertList& result) { 324 *dest = result; 325 } 326 327 net::ServerBoundCertService* server_bound_cert_service_; 328 scoped_refptr<net::SSLConfigService> ssl_config_service_; 329 int ssl_config_changed_count_; 330 331 DISALLOW_COPY_AND_ASSIGN(RemoveServerBoundCertTester); 332 }; 333 334 class RemoveHistoryTester { 335 public: 336 RemoveHistoryTester() : query_url_success_(false), history_service_(NULL) {} 337 338 bool Init(TestingProfile* profile) WARN_UNUSED_RESULT { 339 if (!profile->CreateHistoryService(true, false)) 340 return false; 341 history_service_ = HistoryServiceFactory::GetForProfile( 342 profile, Profile::EXPLICIT_ACCESS); 343 return true; 344 } 345 346 // Returns true, if the given URL exists in the history service. 347 bool HistoryContainsURL(const GURL& url) { 348 history_service_->QueryURL( 349 url, 350 true, 351 &consumer_, 352 base::Bind(&RemoveHistoryTester::SaveResultAndQuit, 353 base::Unretained(this))); 354 await_completion_.BlockUntilNotified(); 355 return query_url_success_; 356 } 357 358 void AddHistory(const GURL& url, base::Time time) { 359 history_service_->AddPage(url, time, NULL, 0, GURL(), 360 history::RedirectList(), content::PAGE_TRANSITION_LINK, 361 history::SOURCE_BROWSED, false); 362 } 363 364 private: 365 // Callback for HistoryService::QueryURL. 366 void SaveResultAndQuit(HistoryService::Handle, 367 bool success, 368 const history::URLRow*, 369 history::VisitVector*) { 370 query_url_success_ = success; 371 await_completion_.Notify(); 372 } 373 374 // For History requests. 375 CancelableRequestConsumer consumer_; 376 bool query_url_success_; 377 378 // TestingProfile owns the history service; we shouldn't delete it. 379 HistoryService* history_service_; 380 381 AwaitCompletionHelper await_completion_; 382 383 DISALLOW_COPY_AND_ASSIGN(RemoveHistoryTester); 384 }; 385 386 class RemoveAutofillTester : public autofill::PersonalDataManagerObserver { 387 public: 388 explicit RemoveAutofillTester(TestingProfile* profile) 389 : personal_data_manager_( 390 autofill::PersonalDataManagerFactory::GetForProfile(profile)) { 391 autofill::test::DisableSystemServices(profile); 392 personal_data_manager_->AddObserver(this); 393 } 394 395 virtual ~RemoveAutofillTester() { 396 personal_data_manager_->RemoveObserver(this); 397 } 398 399 // Returns true if there are autofill profiles. 400 bool HasProfile() { 401 return !personal_data_manager_->GetProfiles().empty() && 402 !personal_data_manager_->GetCreditCards().empty(); 403 } 404 405 bool HasOrigin(const std::string& origin) { 406 const std::vector<autofill::AutofillProfile*>& profiles = 407 personal_data_manager_->GetProfiles(); 408 for (std::vector<autofill::AutofillProfile*>::const_iterator it = 409 profiles.begin(); 410 it != profiles.end(); ++it) { 411 if ((*it)->origin() == origin) 412 return true; 413 } 414 415 const std::vector<autofill::CreditCard*>& credit_cards = 416 personal_data_manager_->GetCreditCards(); 417 for (std::vector<autofill::CreditCard*>::const_iterator it = 418 credit_cards.begin(); 419 it != credit_cards.end(); ++it) { 420 if ((*it)->origin() == origin) 421 return true; 422 } 423 424 return false; 425 } 426 427 // Add two profiles and two credit cards to the database. In each pair, one 428 // entry has a web origin and the other has a Chrome origin. 429 void AddProfilesAndCards() { 430 std::vector<autofill::AutofillProfile> profiles; 431 autofill::AutofillProfile profile; 432 profile.set_guid(base::GenerateGUID()); 433 profile.set_origin(kWebOrigin); 434 profile.SetRawInfo(autofill::NAME_FIRST, ASCIIToUTF16("Bob")); 435 profile.SetRawInfo(autofill::NAME_LAST, ASCIIToUTF16("Smith")); 436 profile.SetRawInfo(autofill::ADDRESS_HOME_ZIP, ASCIIToUTF16("94043")); 437 profile.SetRawInfo(autofill::EMAIL_ADDRESS, 438 ASCIIToUTF16("sue (at) example.com")); 439 profile.SetRawInfo(autofill::COMPANY_NAME, ASCIIToUTF16("Company X")); 440 profiles.push_back(profile); 441 442 profile.set_guid(base::GenerateGUID()); 443 profile.set_origin(kChromeOrigin); 444 profiles.push_back(profile); 445 446 personal_data_manager_->SetProfiles(&profiles); 447 base::MessageLoop::current()->Run(); 448 449 std::vector<autofill::CreditCard> cards; 450 autofill::CreditCard card; 451 card.set_guid(base::GenerateGUID()); 452 card.set_origin(kWebOrigin); 453 card.SetRawInfo(autofill::CREDIT_CARD_NUMBER, 454 ASCIIToUTF16("1234-5678-9012-3456")); 455 cards.push_back(card); 456 457 card.set_guid(base::GenerateGUID()); 458 card.set_origin(kChromeOrigin); 459 cards.push_back(card); 460 461 personal_data_manager_->SetCreditCards(&cards); 462 base::MessageLoop::current()->Run(); 463 } 464 465 private: 466 virtual void OnPersonalDataChanged() OVERRIDE { 467 base::MessageLoop::current()->Quit(); 468 } 469 470 autofill::PersonalDataManager* personal_data_manager_; 471 DISALLOW_COPY_AND_ASSIGN(RemoveAutofillTester); 472 }; 473 474 class RemoveLocalStorageTester { 475 public: 476 explicit RemoveLocalStorageTester(TestingProfile* profile) 477 : profile_(profile), dom_storage_context_(NULL) { 478 dom_storage_context_ = 479 content::BrowserContext::GetDefaultStoragePartition(profile)-> 480 GetDOMStorageContext(); 481 } 482 483 // Returns true, if the given origin URL exists. 484 bool DOMStorageExistsForOrigin(const GURL& origin) { 485 GetLocalStorageUsage(); 486 await_completion_.BlockUntilNotified(); 487 for (size_t i = 0; i < infos_.size(); ++i) { 488 if (origin == infos_[i].origin) 489 return true; 490 } 491 return false; 492 } 493 494 void AddDOMStorageTestData() { 495 // Note: This test depends on details of how the dom_storage library 496 // stores data in the host file system. 497 base::FilePath storage_path = 498 profile_->GetPath().AppendASCII("Local Storage"); 499 file_util::CreateDirectory(storage_path); 500 501 // Write some files. 502 file_util::WriteFile(storage_path.Append(kDomStorageOrigin1), NULL, 0); 503 file_util::WriteFile(storage_path.Append(kDomStorageOrigin2), NULL, 0); 504 file_util::WriteFile(storage_path.Append(kDomStorageOrigin3), NULL, 0); 505 file_util::WriteFile(storage_path.Append(kDomStorageExt), NULL, 0); 506 507 // Tweak their dates. 508 file_util::SetLastModifiedTime(storage_path.Append(kDomStorageOrigin1), 509 base::Time::Now()); 510 file_util::SetLastModifiedTime(storage_path.Append(kDomStorageOrigin2), 511 base::Time::Now() - base::TimeDelta::FromDays(1)); 512 file_util::SetLastModifiedTime(storage_path.Append(kDomStorageOrigin3), 513 base::Time::Now() - base::TimeDelta::FromDays(60)); 514 file_util::SetLastModifiedTime(storage_path.Append(kDomStorageExt), 515 base::Time::Now()); 516 } 517 518 private: 519 void GetLocalStorageUsage() { 520 dom_storage_context_->GetLocalStorageUsage( 521 base::Bind(&RemoveLocalStorageTester::OnGotLocalStorageUsage, 522 base::Unretained(this))); 523 } 524 void OnGotLocalStorageUsage( 525 const std::vector<content::LocalStorageUsageInfo>& infos) { 526 infos_ = infos; 527 await_completion_.Notify(); 528 } 529 530 // We don't own these pointers. 531 TestingProfile* profile_; 532 content::DOMStorageContext* dom_storage_context_; 533 534 std::vector<content::LocalStorageUsageInfo> infos_; 535 536 AwaitCompletionHelper await_completion_; 537 538 DISALLOW_COPY_AND_ASSIGN(RemoveLocalStorageTester); 539 }; 540 541 // Test Class ---------------------------------------------------------------- 542 543 class BrowsingDataRemoverTest : public testing::Test, 544 public content::NotificationObserver { 545 public: 546 BrowsingDataRemoverTest() 547 : profile_(new TestingProfile()) { 548 registrar_.Add(this, chrome::NOTIFICATION_BROWSING_DATA_REMOVED, 549 content::Source<Profile>(profile_.get())); 550 } 551 552 virtual ~BrowsingDataRemoverTest() { 553 } 554 555 virtual void TearDown() { 556 // TestingProfile contains a DOMStorageContext. BrowserContext's destructor 557 // posts a message to the WEBKIT thread to delete some of its member 558 // variables. We need to ensure that the profile is destroyed, and that 559 // the message loop is cleared out, before destroying the threads and loop. 560 // Otherwise we leak memory. 561 profile_.reset(); 562 base::MessageLoop::current()->RunUntilIdle(); 563 } 564 565 void BlockUntilBrowsingDataRemoved(BrowsingDataRemover::TimePeriod period, 566 int remove_mask, 567 bool include_protected_origins) { 568 BrowsingDataRemover* remover = BrowsingDataRemover::CreateForPeriod( 569 profile_.get(), period); 570 remover->OverrideQuotaManagerForTesting(GetMockManager()); 571 572 AwaitCompletionHelper await_completion; 573 remover->AddObserver(&await_completion); 574 575 called_with_details_.reset(new BrowsingDataRemover::NotificationDetails()); 576 577 // BrowsingDataRemover deletes itself when it completes. 578 int origin_set_mask = BrowsingDataHelper::UNPROTECTED_WEB; 579 if (include_protected_origins) 580 origin_set_mask |= BrowsingDataHelper::PROTECTED_WEB; 581 remover->Remove(remove_mask, origin_set_mask); 582 await_completion.BlockUntilNotified(); 583 } 584 585 void BlockUntilOriginDataRemoved(BrowsingDataRemover::TimePeriod period, 586 int remove_mask, 587 const GURL& remove_origin) { 588 BrowsingDataRemover* remover = BrowsingDataRemover::CreateForPeriod( 589 profile_.get(), period); 590 remover->OverrideQuotaManagerForTesting(GetMockManager()); 591 592 AwaitCompletionHelper await_completion; 593 remover->AddObserver(&await_completion); 594 595 called_with_details_.reset(new BrowsingDataRemover::NotificationDetails()); 596 597 // BrowsingDataRemover deletes itself when it completes. 598 remover->RemoveImpl(remove_mask, remove_origin, 599 BrowsingDataHelper::UNPROTECTED_WEB); 600 await_completion.BlockUntilNotified(); 601 } 602 603 TestingProfile* GetProfile() { 604 return profile_.get(); 605 } 606 607 base::Time GetBeginTime() { 608 return called_with_details_->removal_begin; 609 } 610 611 int GetRemovalMask() { 612 return called_with_details_->removal_mask; 613 } 614 615 int GetOriginSetMask() { 616 return called_with_details_->origin_set_mask; 617 } 618 619 quota::MockQuotaManager* GetMockManager() { 620 if (!quota_manager_.get()) { 621 quota_manager_ = new quota::MockQuotaManager( 622 profile_->IsOffTheRecord(), 623 profile_->GetPath(), 624 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO).get(), 625 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB).get(), 626 profile_->GetExtensionSpecialStoragePolicy()); 627 } 628 return quota_manager_.get(); 629 } 630 631 // content::NotificationObserver implementation. 632 virtual void Observe(int type, 633 const content::NotificationSource& source, 634 const content::NotificationDetails& details) OVERRIDE { 635 DCHECK_EQ(type, chrome::NOTIFICATION_BROWSING_DATA_REMOVED); 636 637 // We're not taking ownership of the details object, but storing a copy of 638 // it locally. 639 called_with_details_.reset(new BrowsingDataRemover::NotificationDetails( 640 *content::Details<BrowsingDataRemover::NotificationDetails>( 641 details).ptr())); 642 643 registrar_.RemoveAll(); 644 } 645 646 private: 647 scoped_ptr<BrowsingDataRemover::NotificationDetails> called_with_details_; 648 content::NotificationRegistrar registrar_; 649 650 content::TestBrowserThreadBundle thread_bundle_; 651 scoped_ptr<TestingProfile> profile_; 652 scoped_refptr<quota::MockQuotaManager> quota_manager_; 653 654 DISALLOW_COPY_AND_ASSIGN(BrowsingDataRemoverTest); 655 }; 656 657 // Tests --------------------------------------------------------------------- 658 659 TEST_F(BrowsingDataRemoverTest, RemoveCookieForever) { 660 RemoveProfileCookieTester tester(GetProfile()); 661 662 tester.AddCookie(); 663 ASSERT_TRUE(tester.ContainsCookie()); 664 665 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING, 666 BrowsingDataRemover::REMOVE_COOKIES, false); 667 668 EXPECT_EQ(BrowsingDataRemover::REMOVE_COOKIES, GetRemovalMask()); 669 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 670 EXPECT_FALSE(tester.ContainsCookie()); 671 } 672 673 TEST_F(BrowsingDataRemoverTest, RemoveCookieLastHour) { 674 RemoveProfileCookieTester tester(GetProfile()); 675 676 tester.AddCookie(); 677 ASSERT_TRUE(tester.ContainsCookie()); 678 679 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::LAST_HOUR, 680 BrowsingDataRemover::REMOVE_COOKIES, false); 681 682 EXPECT_EQ(BrowsingDataRemover::REMOVE_COOKIES, GetRemovalMask()); 683 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 684 EXPECT_FALSE(tester.ContainsCookie()); 685 } 686 687 #if defined(FULL_SAFE_BROWSING) || defined(MOBILE_SAFE_BROWSING) 688 TEST_F(BrowsingDataRemoverTest, RemoveSafeBrowsingCookieForever) { 689 RemoveSafeBrowsingCookieTester tester; 690 691 tester.AddCookie(); 692 ASSERT_TRUE(tester.ContainsCookie()); 693 694 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING, 695 BrowsingDataRemover::REMOVE_COOKIES, false); 696 697 EXPECT_EQ(BrowsingDataRemover::REMOVE_COOKIES, GetRemovalMask()); 698 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 699 EXPECT_FALSE(tester.ContainsCookie()); 700 } 701 702 TEST_F(BrowsingDataRemoverTest, RemoveSafeBrowsingCookieLastHour) { 703 RemoveSafeBrowsingCookieTester tester; 704 705 tester.AddCookie(); 706 ASSERT_TRUE(tester.ContainsCookie()); 707 708 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::LAST_HOUR, 709 BrowsingDataRemover::REMOVE_COOKIES, false); 710 711 EXPECT_EQ(BrowsingDataRemover::REMOVE_COOKIES, GetRemovalMask()); 712 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 713 // Removing with time period other than EVERYTHING should not clear safe 714 // browsing cookies. 715 EXPECT_TRUE(tester.ContainsCookie()); 716 } 717 #endif 718 719 TEST_F(BrowsingDataRemoverTest, RemoveServerBoundCertForever) { 720 RemoveServerBoundCertTester tester(GetProfile()); 721 722 tester.AddServerBoundCert(kTestOrigin1); 723 EXPECT_EQ(0, tester.ssl_config_changed_count()); 724 EXPECT_EQ(1, tester.ServerBoundCertCount()); 725 726 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING, 727 BrowsingDataRemover::REMOVE_SERVER_BOUND_CERTS, false); 728 729 EXPECT_EQ(BrowsingDataRemover::REMOVE_SERVER_BOUND_CERTS, GetRemovalMask()); 730 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 731 EXPECT_EQ(1, tester.ssl_config_changed_count()); 732 EXPECT_EQ(0, tester.ServerBoundCertCount()); 733 } 734 735 TEST_F(BrowsingDataRemoverTest, RemoveServerBoundCertLastHour) { 736 RemoveServerBoundCertTester tester(GetProfile()); 737 738 base::Time now = base::Time::Now(); 739 tester.AddServerBoundCert(kTestOrigin1); 740 tester.AddServerBoundCertWithTimes(kTestOrigin2, 741 now - base::TimeDelta::FromHours(2), 742 now); 743 EXPECT_EQ(0, tester.ssl_config_changed_count()); 744 EXPECT_EQ(2, tester.ServerBoundCertCount()); 745 746 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::LAST_HOUR, 747 BrowsingDataRemover::REMOVE_SERVER_BOUND_CERTS, false); 748 749 EXPECT_EQ(BrowsingDataRemover::REMOVE_SERVER_BOUND_CERTS, GetRemovalMask()); 750 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 751 EXPECT_EQ(1, tester.ssl_config_changed_count()); 752 ASSERT_EQ(1, tester.ServerBoundCertCount()); 753 net::ServerBoundCertStore::ServerBoundCertList certs; 754 tester.GetCertList(&certs); 755 ASSERT_EQ(1U, certs.size()); 756 EXPECT_EQ(kTestOrigin2, certs.front().server_identifier()); 757 } 758 759 TEST_F(BrowsingDataRemoverTest, RemoveUnprotectedLocalStorageForever) { 760 // Protect kOrigin1. 761 scoped_refptr<MockExtensionSpecialStoragePolicy> mock_policy = 762 new MockExtensionSpecialStoragePolicy; 763 mock_policy->AddProtected(kOrigin1.GetOrigin()); 764 GetProfile()->SetExtensionSpecialStoragePolicy(mock_policy.get()); 765 766 RemoveLocalStorageTester tester(GetProfile()); 767 768 tester.AddDOMStorageTestData(); 769 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1)); 770 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin2)); 771 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3)); 772 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOriginExt)); 773 774 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING, 775 BrowsingDataRemover::REMOVE_LOCAL_STORAGE, false); 776 777 EXPECT_EQ(BrowsingDataRemover::REMOVE_LOCAL_STORAGE, GetRemovalMask()); 778 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 779 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1)); 780 EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin2)); 781 EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin3)); 782 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOriginExt)); 783 } 784 785 TEST_F(BrowsingDataRemoverTest, RemoveProtectedLocalStorageForever) { 786 // Protect kOrigin1. 787 scoped_refptr<MockExtensionSpecialStoragePolicy> mock_policy = 788 new MockExtensionSpecialStoragePolicy; 789 mock_policy->AddProtected(kOrigin1.GetOrigin()); 790 GetProfile()->SetExtensionSpecialStoragePolicy(mock_policy.get()); 791 792 RemoveLocalStorageTester tester(GetProfile()); 793 794 tester.AddDOMStorageTestData(); 795 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1)); 796 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin2)); 797 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3)); 798 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOriginExt)); 799 800 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING, 801 BrowsingDataRemover::REMOVE_LOCAL_STORAGE, true); 802 803 EXPECT_EQ(BrowsingDataRemover::REMOVE_LOCAL_STORAGE, GetRemovalMask()); 804 EXPECT_EQ(BrowsingDataHelper::PROTECTED_WEB | 805 BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 806 EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin1)); 807 EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin2)); 808 EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin3)); 809 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOriginExt)); 810 } 811 812 TEST_F(BrowsingDataRemoverTest, RemoveLocalStorageForLastWeek) { 813 RemoveLocalStorageTester tester(GetProfile()); 814 815 tester.AddDOMStorageTestData(); 816 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin1)); 817 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin2)); 818 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3)); 819 820 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::LAST_WEEK, 821 BrowsingDataRemover::REMOVE_LOCAL_STORAGE, false); 822 823 EXPECT_EQ(BrowsingDataRemover::REMOVE_LOCAL_STORAGE, GetRemovalMask()); 824 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 825 EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin1)); 826 EXPECT_FALSE(tester.DOMStorageExistsForOrigin(kOrigin2)); 827 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOrigin3)); 828 EXPECT_TRUE(tester.DOMStorageExistsForOrigin(kOriginExt)); 829 } 830 831 TEST_F(BrowsingDataRemoverTest, RemoveHistoryForever) { 832 RemoveHistoryTester tester; 833 ASSERT_TRUE(tester.Init(GetProfile())); 834 835 tester.AddHistory(kOrigin1, base::Time::Now()); 836 ASSERT_TRUE(tester.HistoryContainsURL(kOrigin1)); 837 838 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING, 839 BrowsingDataRemover::REMOVE_HISTORY, false); 840 841 EXPECT_EQ(BrowsingDataRemover::REMOVE_HISTORY, GetRemovalMask()); 842 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 843 EXPECT_FALSE(tester.HistoryContainsURL(kOrigin1)); 844 } 845 846 TEST_F(BrowsingDataRemoverTest, RemoveHistoryForLastHour) { 847 RemoveHistoryTester tester; 848 ASSERT_TRUE(tester.Init(GetProfile())); 849 850 base::Time two_hours_ago = base::Time::Now() - base::TimeDelta::FromHours(2); 851 852 tester.AddHistory(kOrigin1, base::Time::Now()); 853 tester.AddHistory(kOrigin2, two_hours_ago); 854 ASSERT_TRUE(tester.HistoryContainsURL(kOrigin1)); 855 ASSERT_TRUE(tester.HistoryContainsURL(kOrigin2)); 856 857 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::LAST_HOUR, 858 BrowsingDataRemover::REMOVE_HISTORY, false); 859 860 EXPECT_EQ(BrowsingDataRemover::REMOVE_HISTORY, GetRemovalMask()); 861 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 862 EXPECT_FALSE(tester.HistoryContainsURL(kOrigin1)); 863 EXPECT_TRUE(tester.HistoryContainsURL(kOrigin2)); 864 } 865 866 // This should crash (DCHECK) in Debug, but death tests don't work properly 867 // here. 868 #if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) 869 TEST_F(BrowsingDataRemoverTest, RemoveHistoryProhibited) { 870 RemoveHistoryTester tester; 871 ASSERT_TRUE(tester.Init(GetProfile())); 872 PrefService* prefs = GetProfile()->GetPrefs(); 873 prefs->SetBoolean(prefs::kAllowDeletingBrowserHistory, false); 874 875 base::Time two_hours_ago = base::Time::Now() - base::TimeDelta::FromHours(2); 876 877 tester.AddHistory(kOrigin1, base::Time::Now()); 878 tester.AddHistory(kOrigin2, two_hours_ago); 879 ASSERT_TRUE(tester.HistoryContainsURL(kOrigin1)); 880 ASSERT_TRUE(tester.HistoryContainsURL(kOrigin2)); 881 882 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::LAST_HOUR, 883 BrowsingDataRemover::REMOVE_HISTORY, false); 884 EXPECT_EQ(BrowsingDataRemover::REMOVE_HISTORY, GetRemovalMask()); 885 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 886 887 // Nothing should have been deleted. 888 EXPECT_TRUE(tester.HistoryContainsURL(kOrigin1)); 889 EXPECT_TRUE(tester.HistoryContainsURL(kOrigin2)); 890 } 891 #endif 892 893 TEST_F(BrowsingDataRemoverTest, RemoveMultipleTypes) { 894 // Add some history. 895 RemoveHistoryTester history_tester; 896 ASSERT_TRUE(history_tester.Init(GetProfile())); 897 history_tester.AddHistory(kOrigin1, base::Time::Now()); 898 ASSERT_TRUE(history_tester.HistoryContainsURL(kOrigin1)); 899 900 // Add some cookies. 901 RemoveProfileCookieTester cookie_tester(GetProfile()); 902 cookie_tester.AddCookie(); 903 ASSERT_TRUE(cookie_tester.ContainsCookie()); 904 905 int removal_mask = BrowsingDataRemover::REMOVE_HISTORY | 906 BrowsingDataRemover::REMOVE_COOKIES; 907 908 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING, 909 removal_mask, false); 910 911 EXPECT_EQ(removal_mask, GetRemovalMask()); 912 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 913 EXPECT_FALSE(history_tester.HistoryContainsURL(kOrigin1)); 914 EXPECT_FALSE(cookie_tester.ContainsCookie()); 915 } 916 917 // This should crash (DCHECK) in Debug, but death tests don't work properly 918 // here. 919 #if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) 920 TEST_F(BrowsingDataRemoverTest, RemoveMultipleTypesHistoryProhibited) { 921 PrefService* prefs = GetProfile()->GetPrefs(); 922 prefs->SetBoolean(prefs::kAllowDeletingBrowserHistory, false); 923 924 // Add some history. 925 RemoveHistoryTester history_tester; 926 ASSERT_TRUE(history_tester.Init(GetProfile())); 927 history_tester.AddHistory(kOrigin1, base::Time::Now()); 928 ASSERT_TRUE(history_tester.HistoryContainsURL(kOrigin1)); 929 930 // Add some cookies. 931 RemoveProfileCookieTester cookie_tester(GetProfile()); 932 cookie_tester.AddCookie(); 933 ASSERT_TRUE(cookie_tester.ContainsCookie()); 934 935 int removal_mask = BrowsingDataRemover::REMOVE_HISTORY | 936 BrowsingDataRemover::REMOVE_COOKIES; 937 938 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::LAST_HOUR, 939 removal_mask, false); 940 EXPECT_EQ(removal_mask, GetRemovalMask()); 941 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 942 943 // Cookie should be gone; history should remain. 944 EXPECT_FALSE(cookie_tester.ContainsCookie()); 945 EXPECT_TRUE(history_tester.HistoryContainsURL(kOrigin1)); 946 } 947 #endif 948 949 TEST_F(BrowsingDataRemoverTest, QuotaClientMaskGeneration) { 950 EXPECT_EQ(quota::QuotaClient::kFileSystem, 951 BrowsingDataRemover::GenerateQuotaClientMask( 952 BrowsingDataRemover::REMOVE_FILE_SYSTEMS)); 953 EXPECT_EQ(quota::QuotaClient::kDatabase, 954 BrowsingDataRemover::GenerateQuotaClientMask( 955 BrowsingDataRemover::REMOVE_WEBSQL)); 956 EXPECT_EQ(quota::QuotaClient::kAppcache, 957 BrowsingDataRemover::GenerateQuotaClientMask( 958 BrowsingDataRemover::REMOVE_APPCACHE)); 959 EXPECT_EQ(quota::QuotaClient::kIndexedDatabase, 960 BrowsingDataRemover::GenerateQuotaClientMask( 961 BrowsingDataRemover::REMOVE_INDEXEDDB)); 962 EXPECT_EQ(quota::QuotaClient::kFileSystem | 963 quota::QuotaClient::kDatabase | 964 quota::QuotaClient::kAppcache | 965 quota::QuotaClient::kIndexedDatabase, 966 BrowsingDataRemover::GenerateQuotaClientMask( 967 BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 968 BrowsingDataRemover::REMOVE_WEBSQL | 969 BrowsingDataRemover::REMOVE_APPCACHE | 970 BrowsingDataRemover::REMOVE_INDEXEDDB)); 971 } 972 973 TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedDataForeverBoth) { 974 PopulateTestQuotaManagedData(GetMockManager()); 975 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING, 976 BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 977 BrowsingDataRemover::REMOVE_WEBSQL | 978 BrowsingDataRemover::REMOVE_APPCACHE | 979 BrowsingDataRemover::REMOVE_INDEXEDDB, false); 980 981 EXPECT_EQ(BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 982 BrowsingDataRemover::REMOVE_WEBSQL | 983 BrowsingDataRemover::REMOVE_APPCACHE | 984 BrowsingDataRemover::REMOVE_INDEXEDDB, GetRemovalMask()); 985 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 986 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, 987 kClientFile)); 988 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, 989 kClientFile)); 990 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, 991 kClientFile)); 992 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, 993 kClientFile)); 994 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, 995 kClientFile)); 996 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, 997 kClientFile)); 998 } 999 1000 TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedDataForeverOnlyTemporary) { 1001 PopulateTestQuotaManagedTemporaryData(GetMockManager()); 1002 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING, 1003 BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1004 BrowsingDataRemover::REMOVE_WEBSQL | 1005 BrowsingDataRemover::REMOVE_APPCACHE | 1006 BrowsingDataRemover::REMOVE_INDEXEDDB, false); 1007 1008 EXPECT_EQ(BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1009 BrowsingDataRemover::REMOVE_WEBSQL | 1010 BrowsingDataRemover::REMOVE_APPCACHE | 1011 BrowsingDataRemover::REMOVE_INDEXEDDB, GetRemovalMask()); 1012 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 1013 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, 1014 kClientFile)); 1015 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, 1016 kClientFile)); 1017 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, 1018 kClientFile)); 1019 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, 1020 kClientFile)); 1021 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, 1022 kClientFile)); 1023 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, 1024 kClientFile)); 1025 } 1026 1027 TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedDataForeverOnlyPersistent) { 1028 PopulateTestQuotaManagedPersistentData(GetMockManager()); 1029 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING, 1030 BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1031 BrowsingDataRemover::REMOVE_WEBSQL | 1032 BrowsingDataRemover::REMOVE_APPCACHE | 1033 BrowsingDataRemover::REMOVE_INDEXEDDB, false); 1034 1035 EXPECT_EQ(BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1036 BrowsingDataRemover::REMOVE_WEBSQL | 1037 BrowsingDataRemover::REMOVE_APPCACHE | 1038 BrowsingDataRemover::REMOVE_INDEXEDDB, GetRemovalMask()); 1039 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 1040 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, 1041 kClientFile)); 1042 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, 1043 kClientFile)); 1044 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, 1045 kClientFile)); 1046 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, 1047 kClientFile)); 1048 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, 1049 kClientFile)); 1050 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, 1051 kClientFile)); 1052 } 1053 1054 TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedDataForeverNeither) { 1055 GetMockManager(); // Creates the QuotaManager instance. 1056 1057 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING, 1058 BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1059 BrowsingDataRemover::REMOVE_WEBSQL | 1060 BrowsingDataRemover::REMOVE_APPCACHE | 1061 BrowsingDataRemover::REMOVE_INDEXEDDB, false); 1062 1063 EXPECT_EQ(BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1064 BrowsingDataRemover::REMOVE_WEBSQL | 1065 BrowsingDataRemover::REMOVE_APPCACHE | 1066 BrowsingDataRemover::REMOVE_INDEXEDDB, GetRemovalMask()); 1067 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 1068 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, 1069 kClientFile)); 1070 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, 1071 kClientFile)); 1072 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, 1073 kClientFile)); 1074 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, 1075 kClientFile)); 1076 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, 1077 kClientFile)); 1078 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, 1079 kClientFile)); 1080 } 1081 1082 TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedDataForeverSpecificOrigin) { 1083 PopulateTestQuotaManagedData(GetMockManager()); 1084 1085 // Remove Origin 1. 1086 BlockUntilOriginDataRemoved(BrowsingDataRemover::EVERYTHING, 1087 BrowsingDataRemover::REMOVE_APPCACHE | 1088 BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1089 BrowsingDataRemover::REMOVE_INDEXEDDB | 1090 BrowsingDataRemover::REMOVE_WEBSQL, kOrigin1); 1091 1092 EXPECT_EQ(BrowsingDataRemover::REMOVE_APPCACHE | 1093 BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1094 BrowsingDataRemover::REMOVE_INDEXEDDB | 1095 BrowsingDataRemover::REMOVE_WEBSQL, GetRemovalMask()); 1096 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 1097 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, 1098 kClientFile)); 1099 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, 1100 kClientFile)); 1101 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, 1102 kClientFile)); 1103 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, 1104 kClientFile)); 1105 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, 1106 kClientFile)); 1107 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, 1108 kClientFile)); 1109 } 1110 1111 TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedDataForLastHour) { 1112 PopulateTestQuotaManagedData(GetMockManager()); 1113 1114 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::LAST_HOUR, 1115 BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1116 BrowsingDataRemover::REMOVE_WEBSQL | 1117 BrowsingDataRemover::REMOVE_APPCACHE | 1118 BrowsingDataRemover::REMOVE_INDEXEDDB, false); 1119 1120 EXPECT_EQ(BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1121 BrowsingDataRemover::REMOVE_WEBSQL | 1122 BrowsingDataRemover::REMOVE_APPCACHE | 1123 BrowsingDataRemover::REMOVE_INDEXEDDB, GetRemovalMask()); 1124 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 1125 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, 1126 kClientFile)); 1127 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, 1128 kClientFile)); 1129 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, 1130 kClientFile)); 1131 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, 1132 kClientFile)); 1133 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, 1134 kClientFile)); 1135 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, 1136 kClientFile)); 1137 } 1138 1139 TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedDataForLastWeek) { 1140 PopulateTestQuotaManagedData(GetMockManager()); 1141 1142 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::LAST_WEEK, 1143 BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1144 BrowsingDataRemover::REMOVE_WEBSQL | 1145 BrowsingDataRemover::REMOVE_APPCACHE | 1146 BrowsingDataRemover::REMOVE_INDEXEDDB, false); 1147 1148 EXPECT_EQ(BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1149 BrowsingDataRemover::REMOVE_WEBSQL | 1150 BrowsingDataRemover::REMOVE_APPCACHE | 1151 BrowsingDataRemover::REMOVE_INDEXEDDB, GetRemovalMask()); 1152 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 1153 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, 1154 kClientFile)); 1155 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, 1156 kClientFile)); 1157 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, 1158 kClientFile)); 1159 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, 1160 kClientFile)); 1161 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, 1162 kClientFile)); 1163 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, 1164 kClientFile)); 1165 } 1166 1167 TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedUnprotectedOrigins) { 1168 // Protect kOrigin1. 1169 scoped_refptr<MockExtensionSpecialStoragePolicy> mock_policy = 1170 new MockExtensionSpecialStoragePolicy; 1171 mock_policy->AddProtected(kOrigin1.GetOrigin()); 1172 GetProfile()->SetExtensionSpecialStoragePolicy(mock_policy.get()); 1173 1174 PopulateTestQuotaManagedData(GetMockManager()); 1175 1176 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING, 1177 BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1178 BrowsingDataRemover::REMOVE_WEBSQL | 1179 BrowsingDataRemover::REMOVE_APPCACHE | 1180 BrowsingDataRemover::REMOVE_INDEXEDDB, false); 1181 1182 EXPECT_EQ(BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1183 BrowsingDataRemover::REMOVE_WEBSQL | 1184 BrowsingDataRemover::REMOVE_APPCACHE | 1185 BrowsingDataRemover::REMOVE_INDEXEDDB, GetRemovalMask()); 1186 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 1187 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, 1188 kClientFile)); 1189 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, 1190 kClientFile)); 1191 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, 1192 kClientFile)); 1193 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, 1194 kClientFile)); 1195 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, 1196 kClientFile)); 1197 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, 1198 kClientFile)); 1199 } 1200 1201 TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedProtectedSpecificOrigin) { 1202 // Protect kOrigin1. 1203 scoped_refptr<MockExtensionSpecialStoragePolicy> mock_policy = 1204 new MockExtensionSpecialStoragePolicy; 1205 mock_policy->AddProtected(kOrigin1.GetOrigin()); 1206 GetProfile()->SetExtensionSpecialStoragePolicy(mock_policy.get()); 1207 1208 PopulateTestQuotaManagedData(GetMockManager()); 1209 1210 // Try to remove kOrigin1. Expect failure. 1211 BlockUntilOriginDataRemoved(BrowsingDataRemover::EVERYTHING, 1212 BrowsingDataRemover::REMOVE_APPCACHE | 1213 BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1214 BrowsingDataRemover::REMOVE_INDEXEDDB | 1215 BrowsingDataRemover::REMOVE_WEBSQL, kOrigin1); 1216 1217 EXPECT_EQ(BrowsingDataRemover::REMOVE_APPCACHE | 1218 BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1219 BrowsingDataRemover::REMOVE_INDEXEDDB | 1220 BrowsingDataRemover::REMOVE_WEBSQL, GetRemovalMask()); 1221 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 1222 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, 1223 kClientFile)); 1224 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, 1225 kClientFile)); 1226 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, 1227 kClientFile)); 1228 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, 1229 kClientFile)); 1230 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, 1231 kClientFile)); 1232 EXPECT_TRUE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, 1233 kClientFile)); 1234 } 1235 1236 TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedProtectedOrigins) { 1237 // Protect kOrigin1. 1238 scoped_refptr<MockExtensionSpecialStoragePolicy> mock_policy = 1239 new MockExtensionSpecialStoragePolicy; 1240 mock_policy->AddProtected(kOrigin1.GetOrigin()); 1241 GetProfile()->SetExtensionSpecialStoragePolicy(mock_policy.get()); 1242 1243 PopulateTestQuotaManagedData(GetMockManager()); 1244 1245 // Try to remove kOrigin1. Expect success. 1246 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING, 1247 BrowsingDataRemover::REMOVE_APPCACHE | 1248 BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1249 BrowsingDataRemover::REMOVE_INDEXEDDB | 1250 BrowsingDataRemover::REMOVE_WEBSQL, true); 1251 1252 EXPECT_EQ(BrowsingDataRemover::REMOVE_APPCACHE | 1253 BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1254 BrowsingDataRemover::REMOVE_INDEXEDDB | 1255 BrowsingDataRemover::REMOVE_WEBSQL, GetRemovalMask()); 1256 EXPECT_EQ(BrowsingDataHelper::PROTECTED_WEB | 1257 BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 1258 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kTemporary, 1259 kClientFile)); 1260 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kTemporary, 1261 kClientFile)); 1262 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kTemporary, 1263 kClientFile)); 1264 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin1, kPersistent, 1265 kClientFile)); 1266 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin2, kPersistent, 1267 kClientFile)); 1268 EXPECT_FALSE(GetMockManager()->OriginHasData(kOrigin3, kPersistent, 1269 kClientFile)); 1270 } 1271 1272 TEST_F(BrowsingDataRemoverTest, RemoveQuotaManagedIgnoreExtensionsAndDevTools) { 1273 PopulateTestQuotaManagedNonBrowsingData(GetMockManager()); 1274 1275 BlockUntilBrowsingDataRemoved(BrowsingDataRemover::EVERYTHING, 1276 BrowsingDataRemover::REMOVE_APPCACHE | 1277 BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1278 BrowsingDataRemover::REMOVE_INDEXEDDB | 1279 BrowsingDataRemover::REMOVE_WEBSQL, false); 1280 1281 EXPECT_EQ(BrowsingDataRemover::REMOVE_APPCACHE | 1282 BrowsingDataRemover::REMOVE_FILE_SYSTEMS | 1283 BrowsingDataRemover::REMOVE_INDEXEDDB | 1284 BrowsingDataRemover::REMOVE_WEBSQL, GetRemovalMask()); 1285 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 1286 1287 // Check that extension and devtools data isn't removed. 1288 EXPECT_TRUE(GetMockManager()->OriginHasData(kOriginExt, kTemporary, 1289 kClientFile)); 1290 EXPECT_TRUE(GetMockManager()->OriginHasData(kOriginExt, kPersistent, 1291 kClientFile)); 1292 EXPECT_TRUE(GetMockManager()->OriginHasData(kOriginDevTools, kTemporary, 1293 kClientFile)); 1294 EXPECT_TRUE(GetMockManager()->OriginHasData(kOriginDevTools, kPersistent, 1295 kClientFile)); 1296 } 1297 1298 TEST_F(BrowsingDataRemoverTest, OriginBasedHistoryRemoval) { 1299 RemoveHistoryTester tester; 1300 ASSERT_TRUE(tester.Init(GetProfile())); 1301 1302 base::Time two_hours_ago = base::Time::Now() - base::TimeDelta::FromHours(2); 1303 1304 tester.AddHistory(kOrigin1, base::Time::Now()); 1305 tester.AddHistory(kOrigin2, two_hours_ago); 1306 ASSERT_TRUE(tester.HistoryContainsURL(kOrigin1)); 1307 ASSERT_TRUE(tester.HistoryContainsURL(kOrigin2)); 1308 1309 BlockUntilOriginDataRemoved(BrowsingDataRemover::EVERYTHING, 1310 BrowsingDataRemover::REMOVE_HISTORY, kOrigin2); 1311 1312 EXPECT_EQ(BrowsingDataRemover::REMOVE_HISTORY, GetRemovalMask()); 1313 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 1314 1315 // Nothing should have been deleted. 1316 EXPECT_TRUE(tester.HistoryContainsURL(kOrigin1)); 1317 EXPECT_FALSE(tester.HistoryContainsURL(kOrigin2)); 1318 } 1319 1320 TEST_F(BrowsingDataRemoverTest, OriginAndTimeBasedHistoryRemoval) { 1321 RemoveHistoryTester tester; 1322 ASSERT_TRUE(tester.Init(GetProfile())); 1323 1324 base::Time two_hours_ago = base::Time::Now() - base::TimeDelta::FromHours(2); 1325 1326 tester.AddHistory(kOrigin1, base::Time::Now()); 1327 tester.AddHistory(kOrigin2, two_hours_ago); 1328 ASSERT_TRUE(tester.HistoryContainsURL(kOrigin1)); 1329 ASSERT_TRUE(tester.HistoryContainsURL(kOrigin2)); 1330 1331 BlockUntilOriginDataRemoved(BrowsingDataRemover::LAST_HOUR, 1332 BrowsingDataRemover::REMOVE_HISTORY, kOrigin2); 1333 1334 EXPECT_EQ(BrowsingDataRemover::REMOVE_HISTORY, GetRemovalMask()); 1335 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 1336 EXPECT_TRUE(tester.HistoryContainsURL(kOrigin1)); 1337 EXPECT_TRUE(tester.HistoryContainsURL(kOrigin2)); 1338 } 1339 1340 // Verify that clearing autofill form data works. 1341 TEST_F(BrowsingDataRemoverTest, AutofillRemovalLastHour) { 1342 GetProfile()->CreateWebDataService(); 1343 RemoveAutofillTester tester(GetProfile()); 1344 1345 ASSERT_FALSE(tester.HasProfile()); 1346 tester.AddProfilesAndCards(); 1347 ASSERT_TRUE(tester.HasProfile()); 1348 1349 BlockUntilBrowsingDataRemoved( 1350 BrowsingDataRemover::LAST_HOUR, 1351 BrowsingDataRemover::REMOVE_FORM_DATA, false); 1352 1353 EXPECT_EQ(BrowsingDataRemover::REMOVE_FORM_DATA, GetRemovalMask()); 1354 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 1355 ASSERT_FALSE(tester.HasProfile()); 1356 } 1357 1358 TEST_F(BrowsingDataRemoverTest, AutofillRemovalEverything) { 1359 GetProfile()->CreateWebDataService(); 1360 RemoveAutofillTester tester(GetProfile()); 1361 1362 ASSERT_FALSE(tester.HasProfile()); 1363 tester.AddProfilesAndCards(); 1364 ASSERT_TRUE(tester.HasProfile()); 1365 1366 BlockUntilBrowsingDataRemoved( 1367 BrowsingDataRemover::EVERYTHING, 1368 BrowsingDataRemover::REMOVE_FORM_DATA, false); 1369 1370 EXPECT_EQ(BrowsingDataRemover::REMOVE_FORM_DATA, GetRemovalMask()); 1371 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 1372 ASSERT_FALSE(tester.HasProfile()); 1373 } 1374 1375 // Verify that clearing autofill form data works. 1376 TEST_F(BrowsingDataRemoverTest, AutofillOriginsRemovedWithHistory) { 1377 GetProfile()->CreateWebDataService(); 1378 RemoveAutofillTester tester(GetProfile()); 1379 1380 tester.AddProfilesAndCards(); 1381 EXPECT_FALSE(tester.HasOrigin(std::string())); 1382 EXPECT_TRUE(tester.HasOrigin(kWebOrigin)); 1383 EXPECT_TRUE(tester.HasOrigin(kChromeOrigin)); 1384 1385 BlockUntilBrowsingDataRemoved( 1386 BrowsingDataRemover::LAST_HOUR, 1387 BrowsingDataRemover::REMOVE_HISTORY, false); 1388 1389 EXPECT_EQ(BrowsingDataRemover::REMOVE_HISTORY, GetRemovalMask()); 1390 EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginSetMask()); 1391 EXPECT_TRUE(tester.HasOrigin(std::string())); 1392 EXPECT_FALSE(tester.HasOrigin(kWebOrigin)); 1393 EXPECT_TRUE(tester.HasOrigin(kChromeOrigin)); 1394 } 1395