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