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