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