browsing_data_remover.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_remover.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/platform_file.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autofill/personal_data_manager_factory.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_helper.h"
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(OS_CHROMEOS)
210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/chromeos/login/user.h"
220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h"
230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#endif
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/download/download_prefs.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service_factory.h"
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/activity_log/activity_log.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_special_storage_policy.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/io_thread.h"
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/media/media_device_id_salt.h"
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(ENABLE_WEBRTC)
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/media/webrtc_log_list.h"
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/media/webrtc_log_util.h"
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/chrome_url_request_context.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/predictor.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_store_factory.h"
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/predictors/logged_in_predictor_table.h"
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/predictors/predictor_database.h"
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/predictors/predictor_database_factory.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager_factory.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_host/web_cache_manager.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service_factory.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/tab_restore_service.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/tab_restore_service_factory.h"
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/webdata/web_data_service_factory.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/password_manager/core/browser/password_store.h"
590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(OS_CHROMEOS)
600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chromeos/attestation/attestation_constants.h"
610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chromeos/dbus/cryptohome_client.h"
620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#endif
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h"
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "components/nacl/browser/nacl_browser.h"
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/nacl/browser/pnacl_host.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/dom_storage_context.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h"
71bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/public/browser/local_storage_usage_info.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/plugin_data_remover.h"
74bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/public/browser/session_storage_usage_info.h"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_store.h"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache.h"
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_cache.h"
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/transport_security_state.h"
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/server_bound_cert_service.h"
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/server_bound_cert_store.h"
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h"
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/quota/quota_manager.h"
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/quota/special_storage_policy.h"
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/quota/quota_types.h"
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::UserMetricsAction;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserContext;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DOMStorageContext;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowsingDataRemover::is_removing_ = false;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Helper to create callback for BrowsingDataRemover::DoesOriginMatchMask.
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Static.
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool DoesOriginMatchMask(int origin_set_mask,
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                         const GURL& origin,
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                         quota::SpecialStoragePolicy* special_storage_policy) {
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return BrowsingDataHelper::DoesOriginMatchMask(
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      origin, origin_set_mask,
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      static_cast<ExtensionSpecialStoragePolicy*>(special_storage_policy));
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover::NotificationDetails::NotificationDetails()
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : removal_begin(base::Time()),
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      removal_mask(-1),
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_set_mask(-1) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover::NotificationDetails::NotificationDetails(
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BrowsingDataRemover::NotificationDetails& details)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : removal_begin(details.removal_begin),
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      removal_mask(details.removal_mask),
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_set_mask(details.origin_set_mask) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover::NotificationDetails::NotificationDetails(
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time removal_begin,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int removal_mask,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int origin_set_mask)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : removal_begin(removal_begin),
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      removal_mask(removal_mask),
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_set_mask(origin_set_mask) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover::NotificationDetails::~NotificationDetails() {}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Static.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover* BrowsingDataRemover::CreateForUnboundedRange(
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new BrowsingDataRemover(profile, base::Time(), base::Time::Max());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Static.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover* BrowsingDataRemover::CreateForRange(Profile* profile,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time start, base::Time end) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new BrowsingDataRemover(profile, start, end);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Static.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover* BrowsingDataRemover::CreateForPeriod(Profile* profile,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TimePeriod period) {
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  switch (period) {
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case LAST_HOUR:
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content::RecordAction(
1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          UserMetricsAction("ClearBrowsingData_LastHour"));
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case LAST_DAY:
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content::RecordAction(
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          UserMetricsAction("ClearBrowsingData_LastDay"));
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case LAST_WEEK:
1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content::RecordAction(
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          UserMetricsAction("ClearBrowsingData_LastWeek"));
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case FOUR_WEEKS:
1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content::RecordAction(
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          UserMetricsAction("ClearBrowsingData_LastMonth"));
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case EVERYTHING:
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content::RecordAction(
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          UserMetricsAction("ClearBrowsingData_Everything"));
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new BrowsingDataRemover(profile,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowsingDataRemover::CalculateBeginDeleteTime(period),
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Time::Max());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover::BrowsingDataRemover(Profile* profile,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         base::Time delete_begin,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         base::Time delete_end)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : profile_(profile),
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      special_storage_policy_(profile->GetExtensionSpecialStoragePolicy()),
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_begin_(delete_begin),
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_end_(delete_end),
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      next_cache_state_(STATE_NONE),
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cache_(NULL),
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      main_context_getter_(profile->GetRequestContext()),
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      media_context_getter_(profile->GetMediaRequestContext()),
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      deauthorize_content_licenses_request_id_(0),
18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      waiting_for_clear_autofill_origin_urls_(false),
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_cache_(false),
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_content_licenses_(false),
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_cookies_count_(0),
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_form_(false),
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_history_(false),
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_hostname_resolution_cache_(false),
192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      waiting_for_clear_keyword_data_(false),
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      waiting_for_clear_logged_in_predictor_(false),
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_nacl_cache_(false),
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_network_predictor_(false),
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_networking_history_(false),
197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      waiting_for_clear_platform_keys_(false),
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_plugin_data_(false),
199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      waiting_for_clear_pnacl_cache_(false),
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_server_bound_certs_(false),
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      waiting_for_clear_storage_partition_data_(false),
202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(ENABLE_WEBRTC)
203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      waiting_for_clear_webrtc_logs_(false),
204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      remove_mask_(0),
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      remove_origin_(GURL()),
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      origin_set_mask_(0),
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      storage_partition_for_testing_(NULL) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crbug.com/140910: Many places were calling this with base::Time() as
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // delete_end, even though they should've used base::Time::Max(). Work around
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it here. New code should use base::Time::Max().
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(delete_end_ != base::Time());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delete_end_ == base::Time())
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete_end_ = base::Time::Max();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover::~BrowsingDataRemover() {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(AllDone());
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Static.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::set_removing(bool is_removing) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(is_removing_ != is_removing);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_removing_ = is_removing;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::Remove(int remove_mask, int origin_set_mask) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveImpl(remove_mask, GURL(), origin_set_mask);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::RemoveImpl(int remove_mask,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const GURL& origin,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     int origin_set_mask) {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_removing(true);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  remove_mask_ = remove_mask;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  remove_origin_ = origin;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  origin_set_mask_ = origin_set_mask;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefService* prefs = profile_->GetPrefs();
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool may_delete_history = prefs->GetBoolean(
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kAllowDeletingBrowserHistory);
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All the UI entry points into the BrowsingDataRemover should be disabled,
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // but this will fire if something was missed or added.
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(may_delete_history ||
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (!(remove_mask & REMOVE_HISTORY) && !(remove_mask & REMOVE_DOWNLOADS)));
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UserMetricsAction("ClearBrowsingData_MaskContainsUnprotectedWeb"));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (origin_set_mask_ & BrowsingDataHelper::PROTECTED_WEB) {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UserMetricsAction("ClearBrowsingData_MaskContainsProtectedWeb"));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (origin_set_mask_ & BrowsingDataHelper::EXTENSION) {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UserMetricsAction("ClearBrowsingData_MaskContainsExtension"));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If this fires, we added a new BrowsingDataHelper::OriginSetMask without
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updating the user metrics above.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPILE_ASSERT(
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowsingDataHelper::ALL == (BrowsingDataHelper::UNPROTECTED_WEB |
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  BrowsingDataHelper::PROTECTED_WEB |
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  BrowsingDataHelper::EXTENSION),
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      forgotten_to_add_origin_mask_type);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((remove_mask & REMOVE_HISTORY) && may_delete_history) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HistoryService* history_service = HistoryServiceFactory::GetForProfile(
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        profile_, Profile::EXPLICIT_ACCESS);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (history_service) {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::set<GURL> restrict_urls;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!remove_origin_.is_empty())
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        restrict_urls.insert(remove_origin_);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(UserMetricsAction("ClearBrowsingData_History"));
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_history_ = true;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      history_service->ExpireLocalAndRemoteHistoryBetween(
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          restrict_urls, delete_begin_, delete_end_,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&BrowsingDataRemover::OnHistoryDeletionDone,
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::Unretained(this)),
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &history_task_tracker_);
28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
28668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // The extension activity contains details of which websites extensions
28858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // were active on. It therefore indirectly stores details of websites a
28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // user has visited so best clean from here as well.
29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      extensions::ActivityLog::GetInstance(profile_)->RemoveURLs(restrict_urls);
29168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Need to clear the host cache and accumulated speculative data, as it also
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // reveals some history: we have no mechanism to track when these items were
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // created, so we'll clear them all. Better safe than sorry.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (g_browser_process->io_thread()) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_hostname_resolution_cache_ = true;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::PostTask(
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::IO, FROM_HERE,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              &BrowsingDataRemover::ClearHostnameResolutionCacheOnIOThread,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              base::Unretained(this),
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              g_browser_process->io_thread()));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (profile_->GetNetworkPredictor()) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_network_predictor_ = true;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::PostTask(
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::IO, FROM_HERE,
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&BrowsingDataRemover::ClearNetworkPredictorOnIOThread,
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     base::Unretained(this)));
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // As part of history deletion we also delete the auto-generated keywords.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TemplateURLService* keywords_model =
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TemplateURLServiceFactory::GetForProfile(profile_);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (keywords_model && !keywords_model->loaded()) {
3184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      template_url_sub_ = keywords_model->RegisterOnLoadedCallback(
3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          base::Bind(&BrowsingDataRemover::OnKeywordsLoaded,
3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     base::Unretained(this)));
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keywords_model->Load();
3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      waiting_for_clear_keyword_data_ = true;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (keywords_model) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keywords_model->RemoveAutoGeneratedForOriginBetween(remove_origin_,
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          delete_begin_, delete_end_);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The PrerenderManager keeps history of prerendered pages, so clear that.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // It also may have a prerendered page. If so, the page could be
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // considered to have a small amount of historical information, so delete
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // it, too.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prerender::PrerenderManager* prerender_manager =
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prerender::PrerenderManagerFactory::GetForProfile(profile_);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prerender_manager) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager->ClearData(
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS |
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prerender::PrerenderManager::CLEAR_PRERENDER_HISTORY);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the caller is removing history for all hosts, then clear ancillary
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // historical information.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (remove_origin_.is_empty()) {
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We also delete the list of recently closed tabs. Since these expire,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // they can't be more than a day old, so we can simply clear them all.
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabRestoreService* tab_service =
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          TabRestoreServiceFactory::GetForProfile(profile_);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (tab_service) {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tab_service->ClearEntries();
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tab_service->DeleteLastSession();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_SESSION_SERVICE)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We also delete the last session when we delete the history.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SessionService* session_service =
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SessionServiceFactory::GetForProfile(profile_);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (session_service)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        session_service->DeleteLastSession();
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // The saved Autofill profiles and credit cards can include the origin from
36290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // which these profiles and credit cards were learned.  These are a form of
36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // history, so clear them as well.
36490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    scoped_refptr<autofill::AutofillWebDataService> web_data_service =
365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        WebDataServiceFactory::GetAutofillWebDataForProfile(
366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            profile_, Profile::EXPLICIT_ACCESS);
36790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (web_data_service.get()) {
36890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      waiting_for_clear_autofill_origin_urls_ = true;
36990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      web_data_service->RemoveOriginURLsModifiedBetween(
37090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          delete_begin_, delete_end_);
37190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // The above calls are done on the UI thread but do their work on the DB
37290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // thread. So wait for it.
37390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      BrowserThread::PostTaskAndReply(
37490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          BrowserThread::DB, FROM_HERE,
37590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          base::Bind(&base::DoNothing),
37690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          base::Bind(&BrowsingDataRemover::OnClearedAutofillOriginURLs,
37790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                     base::Unretained(this)));
37890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
37990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      autofill::PersonalDataManager* data_manager =
38090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          autofill::PersonalDataManagerFactory::GetForProfile(profile_);
38190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (data_manager)
38290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        data_manager->Refresh();
38390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
38490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
385effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(ENABLE_WEBRTC)
386effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    waiting_for_clear_webrtc_logs_ = true;
387effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    BrowserThread::PostTaskAndReply(
388effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        BrowserThread::FILE,
389effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        FROM_HERE,
390effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        base::Bind(
391effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            &WebRtcLogUtil::DeleteOldAndRecentWebRtcLogFiles,
392effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            WebRtcLogList::GetWebRtcLogDirectoryForProfile(profile_->GetPath()),
393effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            delete_begin_),
394effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        base::Bind(&BrowsingDataRemover::OnClearedWebRtcLogs,
395effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   base::Unretained(this)));
396effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((remove_mask & REMOVE_DOWNLOADS) && may_delete_history) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(UserMetricsAction("ClearBrowsingData_Downloads"));
401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    content::DownloadManager* download_manager =
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserContext::GetDownloadManager(profile_);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager->RemoveDownloadsBetween(delete_begin_, delete_end_);
404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DownloadPrefs* download_prefs = DownloadPrefs::FromDownloadManager(
405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        download_manager);
406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    download_prefs->SetSaveFilePath(download_prefs->DownloadPath());
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  uint32 storage_partition_remove_mask = 0;
410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We ignore the REMOVE_COOKIES request if UNPROTECTED_WEB is not set,
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so that callers who request REMOVE_SITE_DATA with PROTECTED_WEB
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // don't accidentally remove the cookies that are associated with the
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UNPROTECTED_WEB origin. This is necessary because cookies are not separated
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // between UNPROTECTED_WEB and PROTECTED_WEB.
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & REMOVE_COOKIES &&
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) {
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(UserMetricsAction("ClearBrowsingData_Cookies"));
419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    storage_partition_remove_mask |=
421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        content::StoragePartition::REMOVE_DATA_MASK_COOKIES;
422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Also delete the LoggedIn Predictor, which tries to keep track of which
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // sites a user is logged into.
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ClearLoggedInPredictor();
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) || defined(MOBILE_SAFE_BROWSING)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Clear the safebrowsing cookies only if time period is for "all time".  It
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // doesn't make sense to apply the time period of deleting in the last X
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // hours/days to the safebrowsing cookies since they aren't the result of
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // any user action.
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (delete_begin_ == base::Time()) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SafeBrowsingService* sb_service =
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          g_browser_process->safe_browsing_service();
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (sb_service) {
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::URLRequestContextGetter* sb_context =
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sb_service->url_request_context();
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ++waiting_for_clear_cookies_count_;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::PostTask(
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            BrowserThread::IO, FROM_HERE,
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Bind(&BrowsingDataRemover::ClearCookiesOnIOThread,
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Unretained(this), base::Unretained(sb_context)));
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    MediaDeviceIDSalt::Reset(profile_->GetPrefs());
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Server bound certs are not separated for protected and unprotected web
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // origins. We check the origin_set_mask_ to prevent unintended deletion.
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & REMOVE_SERVER_BOUND_CERTS &&
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UserMetricsAction("ClearBrowsingData_ServerBoundCerts"));
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Since we are running on the UI thread don't call GetURLRequestContext().
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContextGetter* rq_context = profile_->GetRequestContext();
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rq_context) {
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_server_bound_certs_ = true;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::PostTask(
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::IO, FROM_HERE,
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&BrowsingDataRemover::ClearServerBoundCertsOnIOThread,
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     base::Unretained(this), base::Unretained(rq_context)));
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & REMOVE_LOCAL_STORAGE) {
467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    storage_partition_remove_mask |=
468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        content::StoragePartition::REMOVE_DATA_MASK_LOCAL_STORAGE;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (remove_mask & REMOVE_INDEXEDDB) {
472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    storage_partition_remove_mask |=
473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        content::StoragePartition::REMOVE_DATA_MASK_INDEXEDDB;
474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (remove_mask & REMOVE_WEBSQL) {
476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    storage_partition_remove_mask |=
477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        content::StoragePartition::REMOVE_DATA_MASK_WEBSQL;
478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (remove_mask & REMOVE_APPCACHE) {
480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    storage_partition_remove_mask |=
481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        content::StoragePartition::REMOVE_DATA_MASK_APPCACHE;
482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (remove_mask & REMOVE_FILE_SYSTEMS) {
484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    storage_partition_remove_mask |=
485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        content::StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Plugin is data not separated for protected and unprotected web origins. We
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check the origin_set_mask_ to prevent unintended deletion.
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & REMOVE_PLUGIN_DATA &&
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) {
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(UserMetricsAction("ClearBrowsingData_LSOData"));
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_for_clear_plugin_data_ = true;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!plugin_data_remover_.get())
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin_data_remover_.reset(content::PluginDataRemover::Create(profile_));
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::WaitableEvent* event =
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        plugin_data_remover_->StartRemoving(delete_begin_);
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::WaitableEventWatcher::EventCallback watcher_callback =
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&BrowsingDataRemover::OnWaitableEventSignaled,
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   base::Unretained(this));
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    watcher_.StartWatching(event, watcher_callback);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_ANDROID)
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (remove_mask & REMOVE_APP_BANNER_DATA) {
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    profile_->GetHostContentSettingsMap()->ClearSettingsForOneType(
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        CONTENT_SETTINGS_TYPE_APP_BANNER);
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & REMOVE_PASSWORDS) {
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(UserMetricsAction("ClearBrowsingData_Passwords"));
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PasswordStore* password_store = PasswordStoreFactory::GetForProfile(
5187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        profile_, Profile::EXPLICIT_ACCESS).get();
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (password_store)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      password_store->RemoveLoginsCreatedBetween(delete_begin_, delete_end_);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & REMOVE_FORM_DATA) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(UserMetricsAction("ClearBrowsingData_Autofill"));
526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<autofill::AutofillWebDataService> web_data_service =
527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        WebDataServiceFactory::GetAutofillWebDataForProfile(
528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            profile_, Profile::EXPLICIT_ACCESS);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (web_data_service.get()) {
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_form_ = true;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_data_service->RemoveFormElementsAddedBetween(delete_begin_,
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          delete_end_);
534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      web_data_service->RemoveAutofillDataModifiedBetween(
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          delete_begin_, delete_end_);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The above calls are done on the UI thread but do their work on the DB
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // thread. So wait for it.
53890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      BrowserThread::PostTaskAndReply(
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::DB, FROM_HERE,
54090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          base::Bind(&base::DoNothing),
54190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          base::Bind(&BrowsingDataRemover::OnClearedFormData,
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     base::Unretained(this)));
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      autofill::PersonalDataManager* data_manager =
545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          autofill::PersonalDataManagerFactory::GetForProfile(profile_);
54690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (data_manager)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data_manager->Refresh();
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & REMOVE_CACHE) {
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Tell the renderers to clear their cache.
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebCacheManager::GetInstance()->ClearCache();
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Invoke DoClearCache on the IO thread.
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_for_clear_cache_ = true;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(UserMetricsAction("ClearBrowsingData_Cache"));
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataRemover::ClearCacheOnIOThread,
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this)));
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(DISABLE_NACL)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_for_clear_nacl_cache_ = true;
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataRemover::ClearNaClCacheOnIOThread,
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this)));
571ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
572ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    waiting_for_clear_pnacl_cache_ = true;
573ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    BrowserThread::PostTask(
574ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        BrowserThread::IO, FROM_HERE,
575ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        base::Bind(&BrowsingDataRemover::ClearPnaclCacheOnIOThread,
576ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                   base::Unretained(this), delete_begin_, delete_end_));
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The PrerenderManager may have a page actively being prerendered, which
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // is essentially a preemptively cached page.
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prerender::PrerenderManager* prerender_manager =
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prerender::PrerenderManagerFactory::GetForProfile(profile_);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prerender_manager) {
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager->ClearData(
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Tell the shader disk cache to clear.
5897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    content::RecordAction(UserMetricsAction("ClearBrowsingData_ShaderCache"));
590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    storage_partition_remove_mask |=
591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        content::StoragePartition::REMOVE_DATA_MASK_SHADER_CACHE;
592f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    storage_partition_remove_mask |=
594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        content::StoragePartition::REMOVE_DATA_MASK_WEBRTC_IDENTITY;
595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
5967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (storage_partition_remove_mask) {
598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    waiting_for_clear_storage_partition_data_ = true;
599ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::StoragePartition* storage_partition;
601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (storage_partition_for_testing_)
602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      storage_partition = storage_partition_for_testing_;
603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    else
604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      storage_partition = BrowserContext::GetDefaultStoragePartition(profile_);
605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    uint32 quota_storage_remove_mask =
607f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        ~content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT;
608f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
609f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (delete_begin_ == base::Time() ||
610f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        origin_set_mask_ &
611f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          (BrowsingDataHelper::PROTECTED_WEB | BrowsingDataHelper::EXTENSION)) {
612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      // If we're deleting since the beginning of time, or we're removing
613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      // protected origins, then remove persistent quota data.
614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      quota_storage_remove_mask |=
615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT;
616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
617f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    storage_partition->ClearData(
619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        storage_partition_remove_mask,
620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        quota_storage_remove_mask,
6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        remove_origin_,
622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::Bind(&DoesOriginMatchMask, origin_set_mask_),
623ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        delete_begin_,
624ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        delete_end_,
625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::Bind(&BrowsingDataRemover::OnClearedStoragePartitionData,
626ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                   base::Unretained(this)));
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & REMOVE_CONTENT_LICENSES) {
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UserMetricsAction("ClearBrowsingData_ContentLicenses"));
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_for_clear_content_licenses_ = true;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!pepper_flash_settings_manager_.get()) {
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pepper_flash_settings_manager_.reset(
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          new PepperFlashSettingsManager(this, profile_));
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    deauthorize_content_licenses_request_id_ =
640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        pepper_flash_settings_manager_->DeauthorizeContentLicenses(prefs);
6410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(OS_CHROMEOS)
6420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // On Chrome OS, also delete any content protection platform keys.
6430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    chromeos::User* user = chromeos::UserManager::Get()->
6440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        GetUserByProfile(profile_);
6450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (!user) {
6460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      LOG(WARNING) << "Failed to find user for current profile.";
6470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    } else {
6480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      chromeos::DBusThreadManager::Get()->GetCryptohomeClient()->
6490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          TpmAttestationDeleteKeys(
6500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              chromeos::attestation::KEY_USER,
6510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              user->email(),
6520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              chromeos::attestation::kContentProtectionKeyPrefix,
6530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              base::Bind(&BrowsingDataRemover::OnClearPlatformKeys,
6540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                         base::Unretained(this)));
6550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      waiting_for_clear_platform_keys_ = true;
6560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
6570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#endif
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Always wipe accumulated network related data (TransportSecurityState and
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HttpServerPropertiesManager data).
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_networking_history_ = true;
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->ClearNetworkingHistorySince(
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_begin_,
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnClearedNetworkingHistory,
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::AddObserver(Observer* observer) {
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer_list_.AddObserver(observer);
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::RemoveObserver(Observer* observer) {
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer_list_.RemoveObserver(observer);
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnHistoryDeletionDone() {
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_history_ = false;
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
683f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void BrowsingDataRemover::OverrideStoragePartitionForTesting(
684f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::StoragePartition* storage_partition) {
685f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  storage_partition_for_testing_ = storage_partition;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Time BrowsingDataRemover::CalculateBeginDeleteTime(
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TimePeriod time_period) {
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta diff;
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time delete_begin_time = base::Time::Now();
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (time_period) {
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case LAST_HOUR:
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      diff = base::TimeDelta::FromHours(1);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case LAST_DAY:
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      diff = base::TimeDelta::FromHours(24);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case LAST_WEEK:
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      diff = base::TimeDelta::FromHours(7*24);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FOUR_WEEKS:
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      diff = base::TimeDelta::FromHours(4*7*24);
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case EVERYTHING:
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_begin_time = base::Time();
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << L"Missing item";
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return delete_begin_time - diff;
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowsingDataRemover::AllDone() {
7164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return !waiting_for_clear_keyword_data_ &&
7174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)         !waiting_for_clear_autofill_origin_urls_ &&
718ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_cache_ && !waiting_for_clear_nacl_cache_ &&
719ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_cookies_count_ && !waiting_for_clear_history_ &&
720ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_logged_in_predictor_ &&
721ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_networking_history_ &&
722ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_server_bound_certs_ &&
723ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_plugin_data_ &&
724ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_pnacl_cache_ &&
725ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_content_licenses_ && !waiting_for_clear_form_ &&
726ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_hostname_resolution_cache_ &&
727ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_network_predictor_ &&
728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         !waiting_for_clear_platform_keys_ &&
729effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(ENABLE_WEBRTC)
730effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch         !waiting_for_clear_webrtc_logs_ &&
731effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
732f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         !waiting_for_clear_storage_partition_data_;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void BrowsingDataRemover::OnKeywordsLoaded() {
7364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Deletes the entries from the model, and if we're not waiting on anything
7374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // else notifies observers and deletes this BrowsingDataRemover.
7384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TemplateURLService* model =
7394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(profile_);
7404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK_EQ(profile_, model->profile());
7414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  model->RemoveAutoGeneratedBetween(delete_begin_, delete_end_);
7424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  waiting_for_clear_keyword_data_ = false;
7434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  template_url_sub_.reset();
7444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NotifyAndDeleteIfDone();
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::NotifyAndDeleteIfDone() {
7484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(brettw) http://crbug.com/305259: This should also observe session
7494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // clearing (what about other things such as passwords, etc.?) and wait for
7504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // them to complete before continuing.
7514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!AllDone())
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_removing(false);
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send global notification, then notify any explicit observers.
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowsingDataRemover::NotificationDetails details(delete_begin_, remove_mask_,
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_set_mask_);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_BROWSING_DATA_REMOVED,
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<Profile>(profile_),
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Details<BrowsingDataRemover::NotificationDetails>(&details));
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(Observer, observer_list_, OnBrowsingDataRemoverDone());
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // History requests aren't happy if you delete yourself from the callback.
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // As such, we do a delete later.
76990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnClearedHostnameResolutionCache() {
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_hostname_resolution_cache_ = false;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearHostnameResolutionCacheOnIOThread(
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IOThread* io_thread) {
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io_thread->ClearHostCache();
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify the UI thread that we are done.
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI,
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnClearedHostnameResolutionCache,
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowsingDataRemover::OnClearedLoggedInPredictor() {
793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(waiting_for_clear_logged_in_predictor_);
795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  waiting_for_clear_logged_in_predictor_ = false;
796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NotifyAndDeleteIfDone();
797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowsingDataRemover::ClearLoggedInPredictor() {
800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!waiting_for_clear_logged_in_predictor_);
802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
803a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  predictors::PredictorDatabase* predictor_db =
804a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      predictors::PredictorDatabaseFactory::GetForProfile(profile_);
805a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (!predictor_db)
806a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return;
807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
808a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  predictors::LoggedInPredictorTable* logged_in_table =
8097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      predictor_db->logged_in_table().get();
810a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (!logged_in_table)
811a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return;
812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  waiting_for_clear_logged_in_predictor_ = true;
814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BrowserThread::PostTaskAndReply(
816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      BrowserThread::DB,
817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&predictors::LoggedInPredictorTable::DeleteAllCreatedBetween,
819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 logged_in_table,
820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 delete_begin_,
821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 delete_end_),
822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnClearedLoggedInPredictor,
823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 base::Unretained(this)));
824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnClearedNetworkPredictor() {
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_network_predictor_ = false;
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearNetworkPredictorOnIOThread() {
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_browser_net::Predictor* predictor = profile_->GetNetworkPredictor();
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (predictor) {
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    predictor->DiscardInitialNavigationHistory();
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    predictor->DiscardAllResults();
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify the UI thread that we are done.
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI,
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnClearedNetworkPredictor,
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnClearedNetworkingHistory() {
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_networking_history_ = false;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearedCache() {
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_cache_ = false;
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearCacheOnIOThread() {
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function should be called on the IO thread.
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(STATE_NONE, next_cache_state_);
865868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(main_context_getter_.get());
866868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(media_context_getter_.get());
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  next_cache_state_ = STATE_CREATE_MAIN;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoClearCache(net::OK);
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The expected state sequence is STATE_NONE --> STATE_CREATE_MAIN -->
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// STATE_DELETE_MAIN --> STATE_CREATE_MEDIA --> STATE_DELETE_MEDIA -->
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// STATE_DONE, and any errors are ignored.
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::DoClearCache(int rv) {
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(STATE_NONE, next_cache_state_);
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (rv != net::ERR_IO_PENDING && next_cache_state_ != STATE_NONE) {
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (next_cache_state_) {
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_CREATE_MAIN:
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_CREATE_MEDIA: {
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Get a pointer to the cache.
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::URLRequestContextGetter* getter =
884868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            (next_cache_state_ == STATE_CREATE_MAIN)
885868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                ? main_context_getter_.get()
886868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                : media_context_getter_.get();
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::HttpTransactionFactory* factory =
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            getter->GetURLRequestContext()->http_transaction_factory();
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        next_cache_state_ = (next_cache_state_ == STATE_CREATE_MAIN) ?
891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                STATE_DELETE_MAIN : STATE_DELETE_MEDIA;
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = factory->GetCache()->GetBackend(
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            &cache_, base::Bind(&BrowsingDataRemover::DoClearCache,
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                base::Unretained(this)));
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_DELETE_MAIN:
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_DELETE_MEDIA: {
899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        next_cache_state_ = (next_cache_state_ == STATE_DELETE_MAIN) ?
900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                STATE_CREATE_MEDIA : STATE_DONE;
901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // |cache_| can be null if it cannot be initialized.
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (cache_) {
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (delete_begin_.is_null()) {
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            rv = cache_->DoomAllEntries(
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                base::Bind(&BrowsingDataRemover::DoClearCache,
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::Unretained(this)));
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else {
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            rv = cache_->DoomEntriesBetween(
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                delete_begin_, delete_end_,
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                base::Bind(&BrowsingDataRemover::DoClearCache,
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::Unretained(this)));
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cache_ = NULL;
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_DONE: {
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cache_ = NULL;
920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        next_cache_state_ = STATE_NONE;
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Notify the UI thread that we are done.
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::PostTask(
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            BrowserThread::UI, FROM_HERE,
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Bind(&BrowsingDataRemover::ClearedCache,
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Unretained(this)));
927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return;
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default: {
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED() << "bad state";
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        next_cache_state_ = STATE_NONE;  // Stop looping.
932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return;
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(DISABLE_NACL)
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearedNaClCache() {
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function should be called on the UI thread.
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_nacl_cache_ = false;
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearedNaClCacheOnIOThread() {
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function should be called on the IO thread.
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify the UI thread that we are done.
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::ClearedNaClCache,
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearNaClCacheOnIOThread() {
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  nacl::NaClBrowser::GetInstance()->ClearValidationCache(
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::ClearedNaClCacheOnIOThread,
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
966ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
967ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid BrowsingDataRemover::ClearedPnaclCache() {
968ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // This function should be called on the UI thread.
969ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
970ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
971ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  waiting_for_clear_pnacl_cache_ = false;
972ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
973ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  NotifyAndDeleteIfDone();
974ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
975ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
976ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid BrowsingDataRemover::ClearedPnaclCacheOnIOThread() {
977ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // This function should be called on the IO thread.
978ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
979ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
980ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Notify the UI thread that we are done.
981ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  BrowserThread::PostTask(
982ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      BrowserThread::UI, FROM_HERE,
983ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&BrowsingDataRemover::ClearedPnaclCache,
984ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 base::Unretained(this)));
985ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
986ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
987ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid BrowsingDataRemover::ClearPnaclCacheOnIOThread(base::Time begin,
988ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                    base::Time end) {
989ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
990ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
991f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  pnacl::PnaclHost::GetInstance()->ClearTranslationCacheEntriesBetween(
992ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      begin, end,
993ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&BrowsingDataRemover::ClearedPnaclCacheOnIOThread,
994ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 base::Unretained(this)));
995ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnWaitableEventSignaled(
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::WaitableEvent* waitable_event) {
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_plugin_data_ = false;
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS)
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnDeauthorizeContentLicensesCompleted(
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool /* success */) {
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(waiting_for_clear_content_licenses_);
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(request_id, deauthorize_content_licenses_request_id_);
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_content_licenses_ = false;
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(OS_CHROMEOS)
10170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void BrowsingDataRemover::OnClearPlatformKeys(
10180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    chromeos::DBusMethodCallStatus call_status,
10190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    bool result) {
10200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DCHECK(waiting_for_clear_platform_keys_);
10210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (call_status != chromeos::DBUS_METHOD_CALL_SUCCESS || !result) {
10220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    LOG(ERROR) << "Failed to clear platform keys.";
10230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
10240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  waiting_for_clear_platform_keys_ = false;
10250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  NotifyAndDeleteIfDone();
10260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
10270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#endif
10280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnClearedCookies(int num_deleted) {
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::UI, FROM_HERE,
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataRemover::OnClearedCookies,
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this), num_deleted));
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1038a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  DCHECK_GT(waiting_for_clear_cookies_count_, 0);
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  --waiting_for_clear_cookies_count_;
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearCookiesOnIOThread(
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContextGetter* rq_context) {
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::CookieStore* cookie_store = rq_context->
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetURLRequestContext()->cookie_store();
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_store->DeleteAllCreatedBetweenAsync(
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_begin_, delete_end_,
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnClearedCookies,
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearServerBoundCertsOnIOThread(
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContextGetter* rq_context) {
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::ServerBoundCertService* server_bound_cert_service =
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rq_context->GetURLRequestContext()->server_bound_cert_service();
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server_bound_cert_service->GetCertStore()->DeleteAllCreatedBetween(
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delete_begin_, delete_end_,
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnClearedServerBoundCertsOnIOThread,
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this), base::Unretained(rq_context)));
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowsingDataRemover::OnClearedServerBoundCertsOnIOThread(
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::URLRequestContextGetter* rq_context) {
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Need to close open SSL connections which may be using the channel ids we
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // are deleting.
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(mattm): http://crbug.com/166069 Make the server bound cert
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // service/store have observers that can notify relevant things directly.
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rq_context->GetURLRequestContext()->ssl_config_service()->
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NotifySSLConfigChange();
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnClearedServerBoundCerts,
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnClearedServerBoundCerts() {
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_server_bound_certs_ = false;
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnClearedFormData() {
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_form_ = false;
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
109090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
109190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void BrowsingDataRemover::OnClearedAutofillOriginURLs() {
109290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
109390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  waiting_for_clear_autofill_origin_urls_ = false;
109490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NotifyAndDeleteIfDone();
109590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
1096ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1097f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void BrowsingDataRemover::OnClearedStoragePartitionData() {
1098ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1099f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  waiting_for_clear_storage_partition_data_ = false;
1100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  NotifyAndDeleteIfDone();
1101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(ENABLE_WEBRTC)
1104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid BrowsingDataRemover::OnClearedWebRtcLogs() {
1105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  waiting_for_clear_webrtc_logs_ = false;
1107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NotifyAndDeleteIfDone();
1108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
1109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
1110