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