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 <map> 8 #include <set> 9 10 #include "base/bind.h" 11 #include "base/bind_helpers.h" 12 #include "base/callback.h" 13 #include "base/logging.h" 14 #include "base/platform_file.h" 15 #include "base/prefs/pref_service.h" 16 #include "chrome/browser/autofill/personal_data_manager_factory.h" 17 #include "chrome/browser/browser_process.h" 18 #include "chrome/browser/browsing_data/browsing_data_helper.h" 19 #include "chrome/browser/chrome_notification_types.h" 20 #if defined(OS_CHROMEOS) 21 #include "chrome/browser/chromeos/login/user.h" 22 #include "chrome/browser/chromeos/login/user_manager.h" 23 #endif 24 #include "chrome/browser/download/download_prefs.h" 25 #include "chrome/browser/download/download_service_factory.h" 26 #include "chrome/browser/extensions/activity_log/activity_log.h" 27 #include "chrome/browser/extensions/extension_service.h" 28 #include "chrome/browser/extensions/extension_special_storage_policy.h" 29 #include "chrome/browser/history/history_service.h" 30 #include "chrome/browser/history/history_service_factory.h" 31 #include "chrome/browser/io_thread.h" 32 #include "chrome/browser/media/media_device_id_salt.h" 33 #include "chrome/browser/net/chrome_url_request_context.h" 34 #include "chrome/browser/net/predictor.h" 35 #include "chrome/browser/password_manager/password_store.h" 36 #include "chrome/browser/password_manager/password_store_factory.h" 37 #include "chrome/browser/predictors/logged_in_predictor_table.h" 38 #include "chrome/browser/predictors/predictor_database.h" 39 #include "chrome/browser/predictors/predictor_database_factory.h" 40 #include "chrome/browser/prerender/prerender_manager.h" 41 #include "chrome/browser/prerender/prerender_manager_factory.h" 42 #include "chrome/browser/profiles/profile.h" 43 #include "chrome/browser/renderer_host/web_cache_manager.h" 44 #include "chrome/browser/safe_browsing/safe_browsing_service.h" 45 #include "chrome/browser/search_engines/template_url_service.h" 46 #include "chrome/browser/search_engines/template_url_service_factory.h" 47 #include "chrome/browser/sessions/session_service.h" 48 #include "chrome/browser/sessions/session_service_factory.h" 49 #include "chrome/browser/sessions/tab_restore_service.h" 50 #include "chrome/browser/sessions/tab_restore_service_factory.h" 51 #include "chrome/browser/webdata/web_data_service_factory.h" 52 #include "chrome/common/pref_names.h" 53 #include "chrome/common/url_constants.h" 54 #if defined(OS_CHROMEOS) 55 #include "chromeos/attestation/attestation_constants.h" 56 #include "chromeos/dbus/cryptohome_client.h" 57 #include "chromeos/dbus/dbus_thread_manager.h" 58 #endif 59 #include "components/autofill/core/browser/personal_data_manager.h" 60 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h" 61 #include "components/nacl/browser/nacl_browser.h" 62 #include "components/nacl/browser/pnacl_host.h" 63 #include "content/public/browser/browser_thread.h" 64 #include "content/public/browser/dom_storage_context.h" 65 #include "content/public/browser/download_manager.h" 66 #include "content/public/browser/local_storage_usage_info.h" 67 #include "content/public/browser/notification_service.h" 68 #include "content/public/browser/plugin_data_remover.h" 69 #include "content/public/browser/session_storage_usage_info.h" 70 #include "content/public/browser/storage_partition.h" 71 #include "content/public/browser/user_metrics.h" 72 #include "net/base/net_errors.h" 73 #include "net/cookies/cookie_store.h" 74 #include "net/disk_cache/disk_cache.h" 75 #include "net/http/http_cache.h" 76 #include "net/http/transport_security_state.h" 77 #include "net/ssl/server_bound_cert_service.h" 78 #include "net/ssl/server_bound_cert_store.h" 79 #include "net/url_request/url_request_context.h" 80 #include "net/url_request/url_request_context_getter.h" 81 #include "webkit/browser/quota/quota_manager.h" 82 #include "webkit/browser/quota/special_storage_policy.h" 83 #include "webkit/common/quota/quota_types.h" 84 85 using content::BrowserContext; 86 using content::BrowserThread; 87 using content::DOMStorageContext; 88 using content::UserMetricsAction; 89 90 bool BrowsingDataRemover::is_removing_ = false; 91 92 // Helper to create callback for BrowsingDataRemover::DoesOriginMatchMask. 93 // Static. 94 bool DoesOriginMatchMask(int origin_set_mask, 95 const GURL& origin, 96 quota::SpecialStoragePolicy* special_storage_policy) { 97 return BrowsingDataHelper::DoesOriginMatchMask( 98 origin, origin_set_mask, 99 static_cast<ExtensionSpecialStoragePolicy*>(special_storage_policy)); 100 } 101 102 BrowsingDataRemover::NotificationDetails::NotificationDetails() 103 : removal_begin(base::Time()), 104 removal_mask(-1), 105 origin_set_mask(-1) { 106 } 107 108 BrowsingDataRemover::NotificationDetails::NotificationDetails( 109 const BrowsingDataRemover::NotificationDetails& details) 110 : removal_begin(details.removal_begin), 111 removal_mask(details.removal_mask), 112 origin_set_mask(details.origin_set_mask) { 113 } 114 115 BrowsingDataRemover::NotificationDetails::NotificationDetails( 116 base::Time removal_begin, 117 int removal_mask, 118 int origin_set_mask) 119 : removal_begin(removal_begin), 120 removal_mask(removal_mask), 121 origin_set_mask(origin_set_mask) { 122 } 123 124 BrowsingDataRemover::NotificationDetails::~NotificationDetails() {} 125 126 // Static. 127 BrowsingDataRemover* BrowsingDataRemover::CreateForUnboundedRange( 128 Profile* profile) { 129 return new BrowsingDataRemover(profile, base::Time(), base::Time::Max()); 130 } 131 132 // Static. 133 BrowsingDataRemover* BrowsingDataRemover::CreateForRange(Profile* profile, 134 base::Time start, base::Time end) { 135 return new BrowsingDataRemover(profile, start, end); 136 } 137 138 // Static. 139 BrowsingDataRemover* BrowsingDataRemover::CreateForPeriod(Profile* profile, 140 TimePeriod period) { 141 switch (period) { 142 case LAST_HOUR: 143 content::RecordAction( 144 UserMetricsAction("ClearBrowsingData_LastHour")); 145 break; 146 case LAST_DAY: 147 content::RecordAction( 148 UserMetricsAction("ClearBrowsingData_LastDay")); 149 break; 150 case LAST_WEEK: 151 content::RecordAction( 152 UserMetricsAction("ClearBrowsingData_LastWeek")); 153 break; 154 case FOUR_WEEKS: 155 content::RecordAction( 156 UserMetricsAction("ClearBrowsingData_LastMonth")); 157 break; 158 case EVERYTHING: 159 content::RecordAction( 160 UserMetricsAction("ClearBrowsingData_Everything")); 161 break; 162 } 163 return new BrowsingDataRemover(profile, 164 BrowsingDataRemover::CalculateBeginDeleteTime(period), 165 base::Time::Max()); 166 } 167 168 BrowsingDataRemover::BrowsingDataRemover(Profile* profile, 169 base::Time delete_begin, 170 base::Time delete_end) 171 : profile_(profile), 172 special_storage_policy_(profile->GetExtensionSpecialStoragePolicy()), 173 delete_begin_(delete_begin), 174 delete_end_(delete_end), 175 next_cache_state_(STATE_NONE), 176 cache_(NULL), 177 main_context_getter_(profile->GetRequestContext()), 178 media_context_getter_(profile->GetMediaRequestContext()), 179 deauthorize_content_licenses_request_id_(0), 180 waiting_for_clear_autofill_origin_urls_(false), 181 waiting_for_clear_cache_(false), 182 waiting_for_clear_content_licenses_(false), 183 waiting_for_clear_cookies_count_(0), 184 waiting_for_clear_form_(false), 185 waiting_for_clear_history_(false), 186 waiting_for_clear_hostname_resolution_cache_(false), 187 waiting_for_clear_keyword_data_(false), 188 waiting_for_clear_logged_in_predictor_(false), 189 waiting_for_clear_nacl_cache_(false), 190 waiting_for_clear_network_predictor_(false), 191 waiting_for_clear_networking_history_(false), 192 waiting_for_clear_platform_keys_(false), 193 waiting_for_clear_plugin_data_(false), 194 waiting_for_clear_pnacl_cache_(false), 195 waiting_for_clear_server_bound_certs_(false), 196 waiting_for_clear_storage_partition_data_(false), 197 remove_mask_(0), 198 remove_origin_(GURL()), 199 origin_set_mask_(0), 200 storage_partition_for_testing_(NULL) { 201 DCHECK(profile); 202 // crbug.com/140910: Many places were calling this with base::Time() as 203 // delete_end, even though they should've used base::Time::Max(). Work around 204 // it here. New code should use base::Time::Max(). 205 DCHECK(delete_end_ != base::Time()); 206 if (delete_end_ == base::Time()) 207 delete_end_ = base::Time::Max(); 208 } 209 210 BrowsingDataRemover::~BrowsingDataRemover() { 211 DCHECK(AllDone()); 212 } 213 214 // Static. 215 void BrowsingDataRemover::set_removing(bool is_removing) { 216 DCHECK(is_removing_ != is_removing); 217 is_removing_ = is_removing; 218 } 219 220 void BrowsingDataRemover::Remove(int remove_mask, int origin_set_mask) { 221 RemoveImpl(remove_mask, GURL(), origin_set_mask); 222 } 223 224 void BrowsingDataRemover::RemoveImpl(int remove_mask, 225 const GURL& origin, 226 int origin_set_mask) { 227 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 228 set_removing(true); 229 remove_mask_ = remove_mask; 230 remove_origin_ = origin; 231 origin_set_mask_ = origin_set_mask; 232 233 PrefService* prefs = profile_->GetPrefs(); 234 bool may_delete_history = prefs->GetBoolean( 235 prefs::kAllowDeletingBrowserHistory); 236 237 // All the UI entry points into the BrowsingDataRemover should be disabled, 238 // but this will fire if something was missed or added. 239 DCHECK(may_delete_history || 240 (!(remove_mask & REMOVE_HISTORY) && !(remove_mask & REMOVE_DOWNLOADS))); 241 242 if (origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) { 243 content::RecordAction( 244 UserMetricsAction("ClearBrowsingData_MaskContainsUnprotectedWeb")); 245 } 246 if (origin_set_mask_ & BrowsingDataHelper::PROTECTED_WEB) { 247 content::RecordAction( 248 UserMetricsAction("ClearBrowsingData_MaskContainsProtectedWeb")); 249 } 250 if (origin_set_mask_ & BrowsingDataHelper::EXTENSION) { 251 content::RecordAction( 252 UserMetricsAction("ClearBrowsingData_MaskContainsExtension")); 253 } 254 // If this fires, we added a new BrowsingDataHelper::OriginSetMask without 255 // updating the user metrics above. 256 COMPILE_ASSERT( 257 BrowsingDataHelper::ALL == (BrowsingDataHelper::UNPROTECTED_WEB | 258 BrowsingDataHelper::PROTECTED_WEB | 259 BrowsingDataHelper::EXTENSION), 260 forgotten_to_add_origin_mask_type); 261 262 if ((remove_mask & REMOVE_HISTORY) && may_delete_history) { 263 HistoryService* history_service = HistoryServiceFactory::GetForProfile( 264 profile_, Profile::EXPLICIT_ACCESS); 265 if (history_service) { 266 std::set<GURL> restrict_urls; 267 if (!remove_origin_.is_empty()) 268 restrict_urls.insert(remove_origin_); 269 content::RecordAction(UserMetricsAction("ClearBrowsingData_History")); 270 waiting_for_clear_history_ = true; 271 272 history_service->ExpireLocalAndRemoteHistoryBetween( 273 restrict_urls, delete_begin_, delete_end_, 274 base::Bind(&BrowsingDataRemover::OnHistoryDeletionDone, 275 base::Unretained(this)), 276 &history_task_tracker_); 277 278 #if defined(ENABLE_EXTENSIONS) 279 // The extension activity contains details of which websites extensions 280 // were active on. It therefore indirectly stores details of websites a 281 // user has visited so best clean from here as well. 282 extensions::ActivityLog::GetInstance(profile_)->RemoveURLs(restrict_urls); 283 #endif 284 } 285 286 // Need to clear the host cache and accumulated speculative data, as it also 287 // reveals some history: we have no mechanism to track when these items were 288 // created, so we'll clear them all. Better safe than sorry. 289 if (g_browser_process->io_thread()) { 290 waiting_for_clear_hostname_resolution_cache_ = true; 291 BrowserThread::PostTask( 292 BrowserThread::IO, FROM_HERE, 293 base::Bind( 294 &BrowsingDataRemover::ClearHostnameResolutionCacheOnIOThread, 295 base::Unretained(this), 296 g_browser_process->io_thread())); 297 } 298 if (profile_->GetNetworkPredictor()) { 299 waiting_for_clear_network_predictor_ = true; 300 BrowserThread::PostTask( 301 BrowserThread::IO, FROM_HERE, 302 base::Bind(&BrowsingDataRemover::ClearNetworkPredictorOnIOThread, 303 base::Unretained(this))); 304 } 305 306 // As part of history deletion we also delete the auto-generated keywords. 307 TemplateURLService* keywords_model = 308 TemplateURLServiceFactory::GetForProfile(profile_); 309 if (keywords_model && !keywords_model->loaded()) { 310 template_url_sub_ = keywords_model->RegisterOnLoadedCallback( 311 base::Bind(&BrowsingDataRemover::OnKeywordsLoaded, 312 base::Unretained(this))); 313 keywords_model->Load(); 314 waiting_for_clear_keyword_data_ = true; 315 } else if (keywords_model) { 316 keywords_model->RemoveAutoGeneratedForOriginBetween(remove_origin_, 317 delete_begin_, delete_end_); 318 } 319 320 // The PrerenderManager keeps history of prerendered pages, so clear that. 321 // It also may have a prerendered page. If so, the page could be 322 // considered to have a small amount of historical information, so delete 323 // it, too. 324 prerender::PrerenderManager* prerender_manager = 325 prerender::PrerenderManagerFactory::GetForProfile(profile_); 326 if (prerender_manager) { 327 prerender_manager->ClearData( 328 prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS | 329 prerender::PrerenderManager::CLEAR_PRERENDER_HISTORY); 330 } 331 332 // If the caller is removing history for all hosts, then clear ancillary 333 // historical information. 334 if (remove_origin_.is_empty()) { 335 // We also delete the list of recently closed tabs. Since these expire, 336 // they can't be more than a day old, so we can simply clear them all. 337 TabRestoreService* tab_service = 338 TabRestoreServiceFactory::GetForProfile(profile_); 339 if (tab_service) { 340 tab_service->ClearEntries(); 341 tab_service->DeleteLastSession(); 342 } 343 344 #if defined(ENABLE_SESSION_SERVICE) 345 // We also delete the last session when we delete the history. 346 SessionService* session_service = 347 SessionServiceFactory::GetForProfile(profile_); 348 if (session_service) 349 session_service->DeleteLastSession(); 350 #endif 351 } 352 353 // The saved Autofill profiles and credit cards can include the origin from 354 // which these profiles and credit cards were learned. These are a form of 355 // history, so clear them as well. 356 scoped_refptr<autofill::AutofillWebDataService> web_data_service = 357 WebDataServiceFactory::GetAutofillWebDataForProfile( 358 profile_, Profile::EXPLICIT_ACCESS); 359 if (web_data_service.get()) { 360 waiting_for_clear_autofill_origin_urls_ = true; 361 web_data_service->RemoveOriginURLsModifiedBetween( 362 delete_begin_, delete_end_); 363 // The above calls are done on the UI thread but do their work on the DB 364 // thread. So wait for it. 365 BrowserThread::PostTaskAndReply( 366 BrowserThread::DB, FROM_HERE, 367 base::Bind(&base::DoNothing), 368 base::Bind(&BrowsingDataRemover::OnClearedAutofillOriginURLs, 369 base::Unretained(this))); 370 371 autofill::PersonalDataManager* data_manager = 372 autofill::PersonalDataManagerFactory::GetForProfile(profile_); 373 if (data_manager) 374 data_manager->Refresh(); 375 } 376 377 } 378 379 if ((remove_mask & REMOVE_DOWNLOADS) && may_delete_history) { 380 content::RecordAction(UserMetricsAction("ClearBrowsingData_Downloads")); 381 content::DownloadManager* download_manager = 382 BrowserContext::GetDownloadManager(profile_); 383 download_manager->RemoveDownloadsBetween(delete_begin_, delete_end_); 384 DownloadPrefs* download_prefs = DownloadPrefs::FromDownloadManager( 385 download_manager); 386 download_prefs->SetSaveFilePath(download_prefs->DownloadPath()); 387 } 388 389 uint32 storage_partition_remove_mask = 0; 390 391 // We ignore the REMOVE_COOKIES request if UNPROTECTED_WEB is not set, 392 // so that callers who request REMOVE_SITE_DATA with PROTECTED_WEB 393 // don't accidentally remove the cookies that are associated with the 394 // UNPROTECTED_WEB origin. This is necessary because cookies are not separated 395 // between UNPROTECTED_WEB and PROTECTED_WEB. 396 if (remove_mask & REMOVE_COOKIES && 397 origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) { 398 content::RecordAction(UserMetricsAction("ClearBrowsingData_Cookies")); 399 400 storage_partition_remove_mask |= 401 content::StoragePartition::REMOVE_DATA_MASK_COOKIES; 402 403 // Also delete the LoggedIn Predictor, which tries to keep track of which 404 // sites a user is logged into. 405 ClearLoggedInPredictor(); 406 407 #if defined(FULL_SAFE_BROWSING) || defined(MOBILE_SAFE_BROWSING) 408 // Clear the safebrowsing cookies only if time period is for "all time". It 409 // doesn't make sense to apply the time period of deleting in the last X 410 // hours/days to the safebrowsing cookies since they aren't the result of 411 // any user action. 412 if (delete_begin_ == base::Time()) { 413 SafeBrowsingService* sb_service = 414 g_browser_process->safe_browsing_service(); 415 if (sb_service) { 416 net::URLRequestContextGetter* sb_context = 417 sb_service->url_request_context(); 418 ++waiting_for_clear_cookies_count_; 419 BrowserThread::PostTask( 420 BrowserThread::IO, FROM_HERE, 421 base::Bind(&BrowsingDataRemover::ClearCookiesOnIOThread, 422 base::Unretained(this), base::Unretained(sb_context))); 423 } 424 } 425 #endif 426 MediaDeviceIDSalt::Reset(profile_->GetPrefs()); 427 } 428 429 // Server bound certs are not separated for protected and unprotected web 430 // origins. We check the origin_set_mask_ to prevent unintended deletion. 431 if (remove_mask & REMOVE_SERVER_BOUND_CERTS && 432 origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) { 433 content::RecordAction( 434 UserMetricsAction("ClearBrowsingData_ServerBoundCerts")); 435 // Since we are running on the UI thread don't call GetURLRequestContext(). 436 net::URLRequestContextGetter* rq_context = profile_->GetRequestContext(); 437 if (rq_context) { 438 waiting_for_clear_server_bound_certs_ = true; 439 BrowserThread::PostTask( 440 BrowserThread::IO, FROM_HERE, 441 base::Bind(&BrowsingDataRemover::ClearServerBoundCertsOnIOThread, 442 base::Unretained(this), base::Unretained(rq_context))); 443 } 444 } 445 446 if (remove_mask & REMOVE_LOCAL_STORAGE) { 447 storage_partition_remove_mask |= 448 content::StoragePartition::REMOVE_DATA_MASK_LOCAL_STORAGE; 449 } 450 451 if (remove_mask & REMOVE_INDEXEDDB) { 452 storage_partition_remove_mask |= 453 content::StoragePartition::REMOVE_DATA_MASK_INDEXEDDB; 454 } 455 if (remove_mask & REMOVE_WEBSQL) { 456 storage_partition_remove_mask |= 457 content::StoragePartition::REMOVE_DATA_MASK_WEBSQL; 458 } 459 if (remove_mask & REMOVE_APPCACHE) { 460 storage_partition_remove_mask |= 461 content::StoragePartition::REMOVE_DATA_MASK_APPCACHE; 462 } 463 if (remove_mask & REMOVE_FILE_SYSTEMS) { 464 storage_partition_remove_mask |= 465 content::StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS; 466 } 467 468 #if defined(ENABLE_PLUGINS) 469 // Plugin is data not separated for protected and unprotected web origins. We 470 // check the origin_set_mask_ to prevent unintended deletion. 471 if (remove_mask & REMOVE_PLUGIN_DATA && 472 origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) { 473 content::RecordAction(UserMetricsAction("ClearBrowsingData_LSOData")); 474 475 waiting_for_clear_plugin_data_ = true; 476 if (!plugin_data_remover_.get()) 477 plugin_data_remover_.reset(content::PluginDataRemover::Create(profile_)); 478 base::WaitableEvent* event = 479 plugin_data_remover_->StartRemoving(delete_begin_); 480 481 base::WaitableEventWatcher::EventCallback watcher_callback = 482 base::Bind(&BrowsingDataRemover::OnWaitableEventSignaled, 483 base::Unretained(this)); 484 watcher_.StartWatching(event, watcher_callback); 485 } 486 #endif 487 488 if (remove_mask & REMOVE_PASSWORDS) { 489 content::RecordAction(UserMetricsAction("ClearBrowsingData_Passwords")); 490 PasswordStore* password_store = PasswordStoreFactory::GetForProfile( 491 profile_, Profile::EXPLICIT_ACCESS).get(); 492 493 if (password_store) 494 password_store->RemoveLoginsCreatedBetween(delete_begin_, delete_end_); 495 } 496 497 if (remove_mask & REMOVE_FORM_DATA) { 498 content::RecordAction(UserMetricsAction("ClearBrowsingData_Autofill")); 499 scoped_refptr<autofill::AutofillWebDataService> web_data_service = 500 WebDataServiceFactory::GetAutofillWebDataForProfile( 501 profile_, Profile::EXPLICIT_ACCESS); 502 503 if (web_data_service.get()) { 504 waiting_for_clear_form_ = true; 505 web_data_service->RemoveFormElementsAddedBetween(delete_begin_, 506 delete_end_); 507 web_data_service->RemoveAutofillDataModifiedBetween( 508 delete_begin_, delete_end_); 509 // The above calls are done on the UI thread but do their work on the DB 510 // thread. So wait for it. 511 BrowserThread::PostTaskAndReply( 512 BrowserThread::DB, FROM_HERE, 513 base::Bind(&base::DoNothing), 514 base::Bind(&BrowsingDataRemover::OnClearedFormData, 515 base::Unretained(this))); 516 517 autofill::PersonalDataManager* data_manager = 518 autofill::PersonalDataManagerFactory::GetForProfile(profile_); 519 if (data_manager) 520 data_manager->Refresh(); 521 } 522 } 523 524 if (remove_mask & REMOVE_CACHE) { 525 // Tell the renderers to clear their cache. 526 WebCacheManager::GetInstance()->ClearCache(); 527 528 // Invoke DoClearCache on the IO thread. 529 waiting_for_clear_cache_ = true; 530 content::RecordAction(UserMetricsAction("ClearBrowsingData_Cache")); 531 532 BrowserThread::PostTask( 533 BrowserThread::IO, FROM_HERE, 534 base::Bind(&BrowsingDataRemover::ClearCacheOnIOThread, 535 base::Unretained(this))); 536 537 #if !defined(DISABLE_NACL) 538 waiting_for_clear_nacl_cache_ = true; 539 540 BrowserThread::PostTask( 541 BrowserThread::IO, FROM_HERE, 542 base::Bind(&BrowsingDataRemover::ClearNaClCacheOnIOThread, 543 base::Unretained(this))); 544 545 waiting_for_clear_pnacl_cache_ = true; 546 BrowserThread::PostTask( 547 BrowserThread::IO, FROM_HERE, 548 base::Bind(&BrowsingDataRemover::ClearPnaclCacheOnIOThread, 549 base::Unretained(this), delete_begin_, delete_end_)); 550 #endif 551 552 // The PrerenderManager may have a page actively being prerendered, which 553 // is essentially a preemptively cached page. 554 prerender::PrerenderManager* prerender_manager = 555 prerender::PrerenderManagerFactory::GetForProfile(profile_); 556 if (prerender_manager) { 557 prerender_manager->ClearData( 558 prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS); 559 } 560 561 // Tell the shader disk cache to clear. 562 content::RecordAction(UserMetricsAction("ClearBrowsingData_ShaderCache")); 563 storage_partition_remove_mask |= 564 content::StoragePartition::REMOVE_DATA_MASK_SHADER_CACHE; 565 566 storage_partition_remove_mask |= 567 content::StoragePartition::REMOVE_DATA_MASK_WEBRTC_IDENTITY; 568 } 569 570 if (storage_partition_remove_mask) { 571 waiting_for_clear_storage_partition_data_ = true; 572 573 content::StoragePartition* storage_partition; 574 if (storage_partition_for_testing_) 575 storage_partition = storage_partition_for_testing_; 576 else 577 storage_partition = BrowserContext::GetDefaultStoragePartition(profile_); 578 579 uint32 quota_storage_remove_mask = 580 ~content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT; 581 582 if (delete_begin_ == base::Time() || 583 origin_set_mask_ & 584 (BrowsingDataHelper::PROTECTED_WEB | BrowsingDataHelper::EXTENSION)) { 585 // If we're deleting since the beginning of time, or we're removing 586 // protected origins, then remove persistent quota data. 587 quota_storage_remove_mask |= 588 content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT; 589 } 590 591 storage_partition->ClearData( 592 storage_partition_remove_mask, 593 quota_storage_remove_mask, 594 &remove_origin_, 595 base::Bind(&DoesOriginMatchMask, origin_set_mask_), 596 delete_begin_, 597 delete_end_, 598 base::Bind(&BrowsingDataRemover::OnClearedStoragePartitionData, 599 base::Unretained(this))); 600 } 601 602 #if defined(ENABLE_PLUGINS) 603 if (remove_mask & REMOVE_CONTENT_LICENSES) { 604 content::RecordAction( 605 UserMetricsAction("ClearBrowsingData_ContentLicenses")); 606 607 waiting_for_clear_content_licenses_ = true; 608 if (!pepper_flash_settings_manager_.get()) { 609 pepper_flash_settings_manager_.reset( 610 new PepperFlashSettingsManager(this, profile_)); 611 } 612 deauthorize_content_licenses_request_id_ = 613 pepper_flash_settings_manager_->DeauthorizeContentLicenses(prefs); 614 #if defined(OS_CHROMEOS) 615 // On Chrome OS, also delete any content protection platform keys. 616 chromeos::User* user = chromeos::UserManager::Get()-> 617 GetUserByProfile(profile_); 618 if (!user) { 619 LOG(WARNING) << "Failed to find user for current profile."; 620 } else { 621 chromeos::DBusThreadManager::Get()->GetCryptohomeClient()-> 622 TpmAttestationDeleteKeys( 623 chromeos::attestation::KEY_USER, 624 user->email(), 625 chromeos::attestation::kContentProtectionKeyPrefix, 626 base::Bind(&BrowsingDataRemover::OnClearPlatformKeys, 627 base::Unretained(this))); 628 waiting_for_clear_platform_keys_ = true; 629 } 630 #endif 631 } 632 #endif 633 634 // Always wipe accumulated network related data (TransportSecurityState and 635 // HttpServerPropertiesManager data). 636 waiting_for_clear_networking_history_ = true; 637 profile_->ClearNetworkingHistorySince( 638 delete_begin_, 639 base::Bind(&BrowsingDataRemover::OnClearedNetworkingHistory, 640 base::Unretained(this))); 641 } 642 643 void BrowsingDataRemover::AddObserver(Observer* observer) { 644 observer_list_.AddObserver(observer); 645 } 646 647 void BrowsingDataRemover::RemoveObserver(Observer* observer) { 648 observer_list_.RemoveObserver(observer); 649 } 650 651 void BrowsingDataRemover::OnHistoryDeletionDone() { 652 waiting_for_clear_history_ = false; 653 NotifyAndDeleteIfDone(); 654 } 655 656 void BrowsingDataRemover::OverrideStoragePartitionForTesting( 657 content::StoragePartition* storage_partition) { 658 storage_partition_for_testing_ = storage_partition; 659 } 660 661 base::Time BrowsingDataRemover::CalculateBeginDeleteTime( 662 TimePeriod time_period) { 663 base::TimeDelta diff; 664 base::Time delete_begin_time = base::Time::Now(); 665 switch (time_period) { 666 case LAST_HOUR: 667 diff = base::TimeDelta::FromHours(1); 668 break; 669 case LAST_DAY: 670 diff = base::TimeDelta::FromHours(24); 671 break; 672 case LAST_WEEK: 673 diff = base::TimeDelta::FromHours(7*24); 674 break; 675 case FOUR_WEEKS: 676 diff = base::TimeDelta::FromHours(4*7*24); 677 break; 678 case EVERYTHING: 679 delete_begin_time = base::Time(); 680 break; 681 default: 682 NOTREACHED() << L"Missing item"; 683 break; 684 } 685 return delete_begin_time - diff; 686 } 687 688 bool BrowsingDataRemover::AllDone() { 689 return !waiting_for_clear_keyword_data_ && 690 !waiting_for_clear_autofill_origin_urls_ && 691 !waiting_for_clear_cache_ && !waiting_for_clear_nacl_cache_ && 692 !waiting_for_clear_cookies_count_ && !waiting_for_clear_history_ && 693 !waiting_for_clear_logged_in_predictor_ && 694 !waiting_for_clear_networking_history_ && 695 !waiting_for_clear_server_bound_certs_ && 696 !waiting_for_clear_plugin_data_ && 697 !waiting_for_clear_pnacl_cache_ && 698 !waiting_for_clear_content_licenses_ && !waiting_for_clear_form_ && 699 !waiting_for_clear_hostname_resolution_cache_ && 700 !waiting_for_clear_network_predictor_ && 701 !waiting_for_clear_platform_keys_ && 702 !waiting_for_clear_storage_partition_data_; 703 } 704 705 void BrowsingDataRemover::OnKeywordsLoaded() { 706 // Deletes the entries from the model, and if we're not waiting on anything 707 // else notifies observers and deletes this BrowsingDataRemover. 708 TemplateURLService* model = 709 TemplateURLServiceFactory::GetForProfile(profile_); 710 DCHECK_EQ(profile_, model->profile()); 711 model->RemoveAutoGeneratedBetween(delete_begin_, delete_end_); 712 waiting_for_clear_keyword_data_ = false; 713 template_url_sub_.reset(); 714 NotifyAndDeleteIfDone(); 715 } 716 717 void BrowsingDataRemover::NotifyAndDeleteIfDone() { 718 // TODO(brettw) http://crbug.com/305259: This should also observe session 719 // clearing (what about other things such as passwords, etc.?) and wait for 720 // them to complete before continuing. 721 722 if (!AllDone()) 723 return; 724 725 set_removing(false); 726 727 // Send global notification, then notify any explicit observers. 728 BrowsingDataRemover::NotificationDetails details(delete_begin_, remove_mask_, 729 origin_set_mask_); 730 content::NotificationService::current()->Notify( 731 chrome::NOTIFICATION_BROWSING_DATA_REMOVED, 732 content::Source<Profile>(profile_), 733 content::Details<BrowsingDataRemover::NotificationDetails>(&details)); 734 735 FOR_EACH_OBSERVER(Observer, observer_list_, OnBrowsingDataRemoverDone()); 736 737 // History requests aren't happy if you delete yourself from the callback. 738 // As such, we do a delete later. 739 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); 740 } 741 742 void BrowsingDataRemover::OnClearedHostnameResolutionCache() { 743 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 744 waiting_for_clear_hostname_resolution_cache_ = false; 745 NotifyAndDeleteIfDone(); 746 } 747 748 void BrowsingDataRemover::ClearHostnameResolutionCacheOnIOThread( 749 IOThread* io_thread) { 750 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 751 752 io_thread->ClearHostCache(); 753 754 // Notify the UI thread that we are done. 755 BrowserThread::PostTask( 756 BrowserThread::UI, 757 FROM_HERE, 758 base::Bind(&BrowsingDataRemover::OnClearedHostnameResolutionCache, 759 base::Unretained(this))); 760 } 761 762 void BrowsingDataRemover::OnClearedLoggedInPredictor() { 763 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 764 DCHECK(waiting_for_clear_logged_in_predictor_); 765 waiting_for_clear_logged_in_predictor_ = false; 766 NotifyAndDeleteIfDone(); 767 } 768 769 void BrowsingDataRemover::ClearLoggedInPredictor() { 770 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 771 DCHECK(!waiting_for_clear_logged_in_predictor_); 772 773 predictors::PredictorDatabase* predictor_db = 774 predictors::PredictorDatabaseFactory::GetForProfile(profile_); 775 if (!predictor_db) 776 return; 777 778 predictors::LoggedInPredictorTable* logged_in_table = 779 predictor_db->logged_in_table().get(); 780 if (!logged_in_table) 781 return; 782 783 waiting_for_clear_logged_in_predictor_ = true; 784 785 BrowserThread::PostTaskAndReply( 786 BrowserThread::DB, 787 FROM_HERE, 788 base::Bind(&predictors::LoggedInPredictorTable::DeleteAllCreatedBetween, 789 logged_in_table, 790 delete_begin_, 791 delete_end_), 792 base::Bind(&BrowsingDataRemover::OnClearedLoggedInPredictor, 793 base::Unretained(this))); 794 } 795 796 void BrowsingDataRemover::OnClearedNetworkPredictor() { 797 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 798 waiting_for_clear_network_predictor_ = false; 799 NotifyAndDeleteIfDone(); 800 } 801 802 void BrowsingDataRemover::ClearNetworkPredictorOnIOThread() { 803 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 804 805 chrome_browser_net::Predictor* predictor = profile_->GetNetworkPredictor(); 806 if (predictor) { 807 predictor->DiscardInitialNavigationHistory(); 808 predictor->DiscardAllResults(); 809 } 810 811 // Notify the UI thread that we are done. 812 BrowserThread::PostTask( 813 BrowserThread::UI, 814 FROM_HERE, 815 base::Bind(&BrowsingDataRemover::OnClearedNetworkPredictor, 816 base::Unretained(this))); 817 } 818 819 void BrowsingDataRemover::OnClearedNetworkingHistory() { 820 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 821 waiting_for_clear_networking_history_ = false; 822 NotifyAndDeleteIfDone(); 823 } 824 825 void BrowsingDataRemover::ClearedCache() { 826 waiting_for_clear_cache_ = false; 827 828 NotifyAndDeleteIfDone(); 829 } 830 831 void BrowsingDataRemover::ClearCacheOnIOThread() { 832 // This function should be called on the IO thread. 833 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 834 DCHECK_EQ(STATE_NONE, next_cache_state_); 835 DCHECK(main_context_getter_.get()); 836 DCHECK(media_context_getter_.get()); 837 838 next_cache_state_ = STATE_CREATE_MAIN; 839 DoClearCache(net::OK); 840 } 841 842 // The expected state sequence is STATE_NONE --> STATE_CREATE_MAIN --> 843 // STATE_DELETE_MAIN --> STATE_CREATE_MEDIA --> STATE_DELETE_MEDIA --> 844 // STATE_DONE, and any errors are ignored. 845 void BrowsingDataRemover::DoClearCache(int rv) { 846 DCHECK_NE(STATE_NONE, next_cache_state_); 847 848 while (rv != net::ERR_IO_PENDING && next_cache_state_ != STATE_NONE) { 849 switch (next_cache_state_) { 850 case STATE_CREATE_MAIN: 851 case STATE_CREATE_MEDIA: { 852 // Get a pointer to the cache. 853 net::URLRequestContextGetter* getter = 854 (next_cache_state_ == STATE_CREATE_MAIN) 855 ? main_context_getter_.get() 856 : media_context_getter_.get(); 857 net::HttpTransactionFactory* factory = 858 getter->GetURLRequestContext()->http_transaction_factory(); 859 860 next_cache_state_ = (next_cache_state_ == STATE_CREATE_MAIN) ? 861 STATE_DELETE_MAIN : STATE_DELETE_MEDIA; 862 rv = factory->GetCache()->GetBackend( 863 &cache_, base::Bind(&BrowsingDataRemover::DoClearCache, 864 base::Unretained(this))); 865 break; 866 } 867 case STATE_DELETE_MAIN: 868 case STATE_DELETE_MEDIA: { 869 next_cache_state_ = (next_cache_state_ == STATE_DELETE_MAIN) ? 870 STATE_CREATE_MEDIA : STATE_DONE; 871 872 // |cache_| can be null if it cannot be initialized. 873 if (cache_) { 874 if (delete_begin_.is_null()) { 875 rv = cache_->DoomAllEntries( 876 base::Bind(&BrowsingDataRemover::DoClearCache, 877 base::Unretained(this))); 878 } else { 879 rv = cache_->DoomEntriesBetween( 880 delete_begin_, delete_end_, 881 base::Bind(&BrowsingDataRemover::DoClearCache, 882 base::Unretained(this))); 883 } 884 cache_ = NULL; 885 } 886 break; 887 } 888 case STATE_DONE: { 889 cache_ = NULL; 890 next_cache_state_ = STATE_NONE; 891 892 // Notify the UI thread that we are done. 893 BrowserThread::PostTask( 894 BrowserThread::UI, FROM_HERE, 895 base::Bind(&BrowsingDataRemover::ClearedCache, 896 base::Unretained(this))); 897 return; 898 } 899 default: { 900 NOTREACHED() << "bad state"; 901 next_cache_state_ = STATE_NONE; // Stop looping. 902 return; 903 } 904 } 905 } 906 } 907 908 #if !defined(DISABLE_NACL) 909 void BrowsingDataRemover::ClearedNaClCache() { 910 // This function should be called on the UI thread. 911 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 912 913 waiting_for_clear_nacl_cache_ = false; 914 915 NotifyAndDeleteIfDone(); 916 } 917 918 void BrowsingDataRemover::ClearedNaClCacheOnIOThread() { 919 // This function should be called on the IO thread. 920 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 921 922 // Notify the UI thread that we are done. 923 BrowserThread::PostTask( 924 BrowserThread::UI, FROM_HERE, 925 base::Bind(&BrowsingDataRemover::ClearedNaClCache, 926 base::Unretained(this))); 927 } 928 929 void BrowsingDataRemover::ClearNaClCacheOnIOThread() { 930 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 931 932 nacl::NaClBrowser::GetInstance()->ClearValidationCache( 933 base::Bind(&BrowsingDataRemover::ClearedNaClCacheOnIOThread, 934 base::Unretained(this))); 935 } 936 937 void BrowsingDataRemover::ClearedPnaclCache() { 938 // This function should be called on the UI thread. 939 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 940 941 waiting_for_clear_pnacl_cache_ = false; 942 943 NotifyAndDeleteIfDone(); 944 } 945 946 void BrowsingDataRemover::ClearedPnaclCacheOnIOThread() { 947 // This function should be called on the IO thread. 948 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 949 950 // Notify the UI thread that we are done. 951 BrowserThread::PostTask( 952 BrowserThread::UI, FROM_HERE, 953 base::Bind(&BrowsingDataRemover::ClearedPnaclCache, 954 base::Unretained(this))); 955 } 956 957 void BrowsingDataRemover::ClearPnaclCacheOnIOThread(base::Time begin, 958 base::Time end) { 959 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 960 961 pnacl::PnaclHost::GetInstance()->ClearTranslationCacheEntriesBetween( 962 begin, end, 963 base::Bind(&BrowsingDataRemover::ClearedPnaclCacheOnIOThread, 964 base::Unretained(this))); 965 } 966 #endif 967 968 void BrowsingDataRemover::OnWaitableEventSignaled( 969 base::WaitableEvent* waitable_event) { 970 waiting_for_clear_plugin_data_ = false; 971 NotifyAndDeleteIfDone(); 972 } 973 974 #if defined(ENABLE_PLUGINS) 975 void BrowsingDataRemover::OnDeauthorizeContentLicensesCompleted( 976 uint32 request_id, 977 bool /* success */) { 978 DCHECK(waiting_for_clear_content_licenses_); 979 DCHECK_EQ(request_id, deauthorize_content_licenses_request_id_); 980 981 waiting_for_clear_content_licenses_ = false; 982 NotifyAndDeleteIfDone(); 983 } 984 #endif 985 986 #if defined(OS_CHROMEOS) 987 void BrowsingDataRemover::OnClearPlatformKeys( 988 chromeos::DBusMethodCallStatus call_status, 989 bool result) { 990 DCHECK(waiting_for_clear_platform_keys_); 991 if (call_status != chromeos::DBUS_METHOD_CALL_SUCCESS || !result) { 992 LOG(ERROR) << "Failed to clear platform keys."; 993 } 994 waiting_for_clear_platform_keys_ = false; 995 NotifyAndDeleteIfDone(); 996 } 997 #endif 998 999 void BrowsingDataRemover::OnClearedCookies(int num_deleted) { 1000 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 1001 BrowserThread::PostTask( 1002 BrowserThread::UI, FROM_HERE, 1003 base::Bind(&BrowsingDataRemover::OnClearedCookies, 1004 base::Unretained(this), num_deleted)); 1005 return; 1006 } 1007 1008 DCHECK_GT(waiting_for_clear_cookies_count_, 0); 1009 --waiting_for_clear_cookies_count_; 1010 NotifyAndDeleteIfDone(); 1011 } 1012 1013 void BrowsingDataRemover::ClearCookiesOnIOThread( 1014 net::URLRequestContextGetter* rq_context) { 1015 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1016 net::CookieStore* cookie_store = rq_context-> 1017 GetURLRequestContext()->cookie_store(); 1018 cookie_store->DeleteAllCreatedBetweenAsync( 1019 delete_begin_, delete_end_, 1020 base::Bind(&BrowsingDataRemover::OnClearedCookies, 1021 base::Unretained(this))); 1022 } 1023 1024 void BrowsingDataRemover::ClearServerBoundCertsOnIOThread( 1025 net::URLRequestContextGetter* rq_context) { 1026 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1027 net::ServerBoundCertService* server_bound_cert_service = 1028 rq_context->GetURLRequestContext()->server_bound_cert_service(); 1029 server_bound_cert_service->GetCertStore()->DeleteAllCreatedBetween( 1030 delete_begin_, delete_end_, 1031 base::Bind(&BrowsingDataRemover::OnClearedServerBoundCertsOnIOThread, 1032 base::Unretained(this), base::Unretained(rq_context))); 1033 } 1034 1035 void BrowsingDataRemover::OnClearedServerBoundCertsOnIOThread( 1036 net::URLRequestContextGetter* rq_context) { 1037 // Need to close open SSL connections which may be using the channel ids we 1038 // are deleting. 1039 // TODO(mattm): http://crbug.com/166069 Make the server bound cert 1040 // service/store have observers that can notify relevant things directly. 1041 rq_context->GetURLRequestContext()->ssl_config_service()-> 1042 NotifySSLConfigChange(); 1043 BrowserThread::PostTask( 1044 BrowserThread::UI, FROM_HERE, 1045 base::Bind(&BrowsingDataRemover::OnClearedServerBoundCerts, 1046 base::Unretained(this))); 1047 } 1048 1049 void BrowsingDataRemover::OnClearedServerBoundCerts() { 1050 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1051 waiting_for_clear_server_bound_certs_ = false; 1052 NotifyAndDeleteIfDone(); 1053 } 1054 1055 void BrowsingDataRemover::OnClearedFormData() { 1056 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1057 waiting_for_clear_form_ = false; 1058 NotifyAndDeleteIfDone(); 1059 } 1060 1061 void BrowsingDataRemover::OnClearedAutofillOriginURLs() { 1062 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1063 waiting_for_clear_autofill_origin_urls_ = false; 1064 NotifyAndDeleteIfDone(); 1065 } 1066 1067 void BrowsingDataRemover::OnClearedStoragePartitionData() { 1068 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1069 waiting_for_clear_storage_partition_data_ = false; 1070 NotifyAndDeleteIfDone(); 1071 } 1072