browsing_data_remover.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
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"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/download/download_prefs.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_service_factory.h"
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/activity_log/activity_log.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_special_storage_policy.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/io_thread.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/nacl_host/nacl_browser.h"
29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/nacl_host/pnacl_host.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/chrome_url_request_context.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/predictor.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_store.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_store_factory.h"
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/predictors/logged_in_predictor_table.h"
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/predictors/predictor_database.h"
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/predictors/predictor_database_factory.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager_factory.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_host/web_cache_manager.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service_factory.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/tab_restore_service.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/tab_restore_service_factory.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h"
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/dom_storage_context.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h"
55bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/public/browser/local_storage_usage_info.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/plugin_data_remover.h"
58bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/public/browser/session_storage_usage_info.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/storage_partition.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_store.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_cache.h"
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/transport_security_state.h"
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/server_bound_cert_service.h"
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/server_bound_cert_store.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/quota/quota_manager.h"
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/quota/special_storage_policy.h"
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/quota/quota_types.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserContext;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DOMStorageContext;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::UserMetricsAction;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowsingDataRemover::is_removing_ = false;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover::NotificationDetails::NotificationDetails()
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : removal_begin(base::Time()),
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      removal_mask(-1),
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_set_mask(-1) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover::NotificationDetails::NotificationDetails(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BrowsingDataRemover::NotificationDetails& details)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : removal_begin(details.removal_begin),
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      removal_mask(details.removal_mask),
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_set_mask(details.origin_set_mask) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover::NotificationDetails::NotificationDetails(
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time removal_begin,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int removal_mask,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int origin_set_mask)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : removal_begin(removal_begin),
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      removal_mask(removal_mask),
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_set_mask(origin_set_mask) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover::NotificationDetails::~NotificationDetails() {}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Static.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover* BrowsingDataRemover::CreateForUnboundedRange(
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new BrowsingDataRemover(profile, base::Time(), base::Time::Max());
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Static.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover* BrowsingDataRemover::CreateForRange(Profile* profile,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time start, base::Time end) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new BrowsingDataRemover(profile, start, end);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Static.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover* BrowsingDataRemover::CreateForPeriod(Profile* profile,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TimePeriod period) {
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  switch (period) {
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case LAST_HOUR:
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content::RecordAction(
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          UserMetricsAction("ClearBrowsingData_LastHour"));
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case LAST_DAY:
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content::RecordAction(
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          UserMetricsAction("ClearBrowsingData_LastDay"));
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case LAST_WEEK:
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content::RecordAction(
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          UserMetricsAction("ClearBrowsingData_LastWeek"));
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case FOUR_WEEKS:
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content::RecordAction(
1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          UserMetricsAction("ClearBrowsingData_LastMonth"));
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case EVERYTHING:
1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content::RecordAction(
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          UserMetricsAction("ClearBrowsingData_Everything"));
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new BrowsingDataRemover(profile,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowsingDataRemover::CalculateBeginDeleteTime(period),
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Time::Max());
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover::BrowsingDataRemover(Profile* profile,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         base::Time delete_begin,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         base::Time delete_end)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : profile_(profile),
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      quota_manager_(NULL),
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dom_storage_context_(NULL),
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      special_storage_policy_(profile->GetExtensionSpecialStoragePolicy()),
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_begin_(delete_begin),
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_end_(delete_end),
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      next_cache_state_(STATE_NONE),
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cache_(NULL),
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      main_context_getter_(profile->GetRequestContext()),
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      media_context_getter_(profile->GetMediaRequestContext()),
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      deauthorize_content_licenses_request_id_(0),
16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      waiting_for_clear_autofill_origin_urls_(false),
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_cache_(false),
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_content_licenses_(false),
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_cookies_count_(0),
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_form_(false),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_history_(false),
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_hostname_resolution_cache_(false),
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_local_storage_(false),
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      waiting_for_clear_logged_in_predictor_(false),
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_nacl_cache_(false),
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_network_predictor_(false),
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_networking_history_(false),
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_plugin_data_(false),
174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      waiting_for_clear_pnacl_cache_(false),
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_quota_managed_data_(false),
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_server_bound_certs_(false),
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_session_storage_(false),
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      waiting_for_clear_shader_cache_(false),
179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      waiting_for_clear_webrtc_identity_store_(false),
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      remove_mask_(0),
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      remove_origin_(GURL()),
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_set_mask_(0) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crbug.com/140910: Many places were calling this with base::Time() as
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // delete_end, even though they should've used base::Time::Max(). Work around
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it here. New code should use base::Time::Max().
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(delete_end_ != base::Time());
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delete_end_ == base::Time())
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete_end_ = base::Time::Max();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingDataRemover::~BrowsingDataRemover() {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(AllDone());
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Static.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::set_removing(bool is_removing) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(is_removing_ != is_removing);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_removing_ = is_removing;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Static.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BrowsingDataRemover::GenerateQuotaClientMask(int remove_mask) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int quota_client_mask = 0;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & BrowsingDataRemover::REMOVE_FILE_SYSTEMS)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_client_mask |= quota::QuotaClient::kFileSystem;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & BrowsingDataRemover::REMOVE_WEBSQL)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_client_mask |= quota::QuotaClient::kDatabase;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & BrowsingDataRemover::REMOVE_APPCACHE)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_client_mask |= quota::QuotaClient::kAppcache;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & BrowsingDataRemover::REMOVE_INDEXEDDB)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_client_mask |= quota::QuotaClient::kIndexedDatabase;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return quota_client_mask;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::Remove(int remove_mask, int origin_set_mask) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveImpl(remove_mask, GURL(), origin_set_mask);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::RemoveImpl(int remove_mask,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const GURL& origin,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     int origin_set_mask) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_removing(true);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  remove_mask_ = remove_mask;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  remove_origin_ = origin;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  origin_set_mask_ = origin_set_mask;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefService* prefs = profile_->GetPrefs();
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool may_delete_history = prefs->GetBoolean(
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kAllowDeletingBrowserHistory);
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All the UI entry points into the BrowsingDataRemover should be disabled,
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // but this will fire if something was missed or added.
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(may_delete_history ||
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (!(remove_mask & REMOVE_HISTORY) && !(remove_mask & REMOVE_DOWNLOADS)));
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UserMetricsAction("ClearBrowsingData_MaskContainsUnprotectedWeb"));
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (origin_set_mask_ & BrowsingDataHelper::PROTECTED_WEB) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UserMetricsAction("ClearBrowsingData_MaskContainsProtectedWeb"));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (origin_set_mask_ & BrowsingDataHelper::EXTENSION) {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UserMetricsAction("ClearBrowsingData_MaskContainsExtension"));
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If this fires, we added a new BrowsingDataHelper::OriginSetMask without
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updating the user metrics above.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPILE_ASSERT(
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowsingDataHelper::ALL == (BrowsingDataHelper::UNPROTECTED_WEB |
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  BrowsingDataHelper::PROTECTED_WEB |
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  BrowsingDataHelper::EXTENSION),
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      forgotten_to_add_origin_mask_type);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((remove_mask & REMOVE_HISTORY) && may_delete_history) {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HistoryService* history_service = HistoryServiceFactory::GetForProfile(
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        profile_, Profile::EXPLICIT_ACCESS);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (history_service) {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::set<GURL> restrict_urls;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!remove_origin_.is_empty())
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        restrict_urls.insert(remove_origin_);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(UserMetricsAction("ClearBrowsingData_History"));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_history_ = true;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      history_service->ExpireLocalAndRemoteHistoryBetween(
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          restrict_urls, delete_begin_, delete_end_,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&BrowsingDataRemover::OnHistoryDeletionDone,
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::Unretained(this)),
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &history_task_tracker_);
27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
27568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // The extension activity contains details of which websites extensions
27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // were active on. It therefore indirectly stores details of websites a
27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // user has visited so best clean from here as well.
27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      extensions::ActivityLog::GetInstance(profile_)->RemoveURLs(restrict_urls);
28068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Need to clear the host cache and accumulated speculative data, as it also
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // reveals some history: we have no mechanism to track when these items were
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // created, so we'll clear them all. Better safe than sorry.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (g_browser_process->io_thread()) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_hostname_resolution_cache_ = true;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::PostTask(
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::IO, FROM_HERE,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              &BrowsingDataRemover::ClearHostnameResolutionCacheOnIOThread,
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              base::Unretained(this),
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              g_browser_process->io_thread()));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (profile_->GetNetworkPredictor()) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_network_predictor_ = true;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::PostTask(
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::IO, FROM_HERE,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&BrowsingDataRemover::ClearNetworkPredictorOnIOThread,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     base::Unretained(this)));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // As part of history deletion we also delete the auto-generated keywords.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TemplateURLService* keywords_model =
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TemplateURLServiceFactory::GetForProfile(profile_);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (keywords_model && !keywords_model->loaded()) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      registrar_.Add(this, chrome::NOTIFICATION_TEMPLATE_URL_SERVICE_LOADED,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     content::Source<TemplateURLService>(keywords_model));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keywords_model->Load();
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (keywords_model) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keywords_model->RemoveAutoGeneratedForOriginBetween(remove_origin_,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          delete_begin_, delete_end_);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The PrerenderManager keeps history of prerendered pages, so clear that.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // It also may have a prerendered page. If so, the page could be
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // considered to have a small amount of historical information, so delete
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // it, too.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prerender::PrerenderManager* prerender_manager =
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prerender::PrerenderManagerFactory::GetForProfile(profile_);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prerender_manager) {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager->ClearData(
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS |
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prerender::PrerenderManager::CLEAR_PRERENDER_HISTORY);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the caller is removing history for all hosts, then clear ancillary
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // historical information.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (remove_origin_.is_empty()) {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We also delete the list of recently closed tabs. Since these expire,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // they can't be more than a day old, so we can simply clear them all.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabRestoreService* tab_service =
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          TabRestoreServiceFactory::GetForProfile(profile_);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (tab_service) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tab_service->ClearEntries();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tab_service->DeleteLastSession();
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_SESSION_SERVICE)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We also delete the last session when we delete the history.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SessionService* session_service =
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SessionServiceFactory::GetForProfile(profile_);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (session_service)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        session_service->DeleteLastSession();
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // The saved Autofill profiles and credit cards can include the origin from
34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // which these profiles and credit cards were learned.  These are a form of
35090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // history, so clear them as well.
35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    scoped_refptr<autofill::AutofillWebDataService> web_data_service =
35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        autofill::AutofillWebDataService::FromBrowserContext(profile_);
35390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (web_data_service.get()) {
35490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      waiting_for_clear_autofill_origin_urls_ = true;
35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      web_data_service->RemoveOriginURLsModifiedBetween(
35690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          delete_begin_, delete_end_);
35790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // The above calls are done on the UI thread but do their work on the DB
35890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // thread. So wait for it.
35990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      BrowserThread::PostTaskAndReply(
36090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          BrowserThread::DB, FROM_HERE,
36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          base::Bind(&base::DoNothing),
36290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          base::Bind(&BrowsingDataRemover::OnClearedAutofillOriginURLs,
36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                     base::Unretained(this)));
36490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
36590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      autofill::PersonalDataManager* data_manager =
36690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          autofill::PersonalDataManagerFactory::GetForProfile(profile_);
36790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (data_manager)
36890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        data_manager->Refresh();
36990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
37090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((remove_mask & REMOVE_DOWNLOADS) && may_delete_history) {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(UserMetricsAction("ClearBrowsingData_Downloads"));
375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    content::DownloadManager* download_manager =
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserContext::GetDownloadManager(profile_);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager->RemoveDownloadsBetween(delete_begin_, delete_end_);
378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DownloadPrefs* download_prefs = DownloadPrefs::FromDownloadManager(
379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        download_manager);
380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    download_prefs->SetSaveFilePath(download_prefs->DownloadPath());
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We ignore the REMOVE_COOKIES request if UNPROTECTED_WEB is not set,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so that callers who request REMOVE_SITE_DATA with PROTECTED_WEB
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // don't accidentally remove the cookies that are associated with the
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UNPROTECTED_WEB origin. This is necessary because cookies are not separated
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // between UNPROTECTED_WEB and PROTECTED_WEB.
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & REMOVE_COOKIES &&
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(UserMetricsAction("ClearBrowsingData_Cookies"));
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Since we are running on the UI thread don't call GetURLRequestContext().
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContextGetter* rq_context = profile_->GetRequestContext();
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rq_context) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++waiting_for_clear_cookies_count_;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::PostTask(
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::IO, FROM_HERE,
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&BrowsingDataRemover::ClearCookiesOnIOThread,
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     base::Unretained(this), base::Unretained(rq_context)));
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Also delete the LoggedIn Predictor, which tries to keep track of which
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // sites a user is logged into.
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ClearLoggedInPredictor();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) || defined(MOBILE_SAFE_BROWSING)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Clear the safebrowsing cookies only if time period is for "all time".  It
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // doesn't make sense to apply the time period of deleting in the last X
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // hours/days to the safebrowsing cookies since they aren't the result of
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // any user action.
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (delete_begin_ == base::Time()) {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SafeBrowsingService* sb_service =
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          g_browser_process->safe_browsing_service();
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (sb_service) {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::URLRequestContextGetter* sb_context =
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sb_service->url_request_context();
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ++waiting_for_clear_cookies_count_;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::PostTask(
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            BrowserThread::IO, FROM_HERE,
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Bind(&BrowsingDataRemover::ClearCookiesOnIOThread,
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Unretained(this), base::Unretained(sb_context)));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Server bound certs are not separated for protected and unprotected web
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // origins. We check the origin_set_mask_ to prevent unintended deletion.
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & REMOVE_SERVER_BOUND_CERTS &&
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UserMetricsAction("ClearBrowsingData_ServerBoundCerts"));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Since we are running on the UI thread don't call GetURLRequestContext().
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContextGetter* rq_context = profile_->GetRequestContext();
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rq_context) {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_server_bound_certs_ = true;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::PostTask(
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::IO, FROM_HERE,
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&BrowsingDataRemover::ClearServerBoundCertsOnIOThread,
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     base::Unretained(this), base::Unretained(rq_context)));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & REMOVE_LOCAL_STORAGE) {
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_for_clear_local_storage_ = true;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_for_clear_session_storage_ = true;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!dom_storage_context_) {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dom_storage_context_ =
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserContext::GetDefaultStoragePartition(profile_)->
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GetDOMStorageContext();
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClearLocalStorageOnUIThread();
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClearSessionStorageOnUIThread();
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & REMOVE_INDEXEDDB || remove_mask & REMOVE_WEBSQL ||
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      remove_mask & REMOVE_APPCACHE || remove_mask & REMOVE_FILE_SYSTEMS) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!quota_manager_) {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      quota_manager_ =
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserContext::GetDefaultStoragePartition(profile_)->
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GetQuotaManager();
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_for_clear_quota_managed_data_ = true;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataRemover::ClearQuotaManagedDataOnIOThread,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this)));
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Plugin is data not separated for protected and unprotected web origins. We
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check the origin_set_mask_ to prevent unintended deletion.
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & REMOVE_PLUGIN_DATA &&
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) {
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(UserMetricsAction("ClearBrowsingData_LSOData"));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_for_clear_plugin_data_ = true;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!plugin_data_remover_.get())
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin_data_remover_.reset(content::PluginDataRemover::Create(profile_));
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::WaitableEvent* event =
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        plugin_data_remover_->StartRemoving(delete_begin_);
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::WaitableEventWatcher::EventCallback watcher_callback =
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&BrowsingDataRemover::OnWaitableEventSignaled,
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   base::Unretained(this));
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    watcher_.StartWatching(event, watcher_callback);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & REMOVE_PASSWORDS) {
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(UserMetricsAction("ClearBrowsingData_Passwords"));
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PasswordStore* password_store = PasswordStoreFactory::GetForProfile(
4917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        profile_, Profile::EXPLICIT_ACCESS).get();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (password_store)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      password_store->RemoveLoginsCreatedBetween(delete_begin_, delete_end_);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & REMOVE_FORM_DATA) {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(UserMetricsAction("ClearBrowsingData_Autofill"));
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<autofill::AutofillWebDataService> web_data_service =
500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        autofill::AutofillWebDataService::FromBrowserContext(profile_);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (web_data_service.get()) {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_for_clear_form_ = true;
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_data_service->RemoveFormElementsAddedBetween(delete_begin_,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          delete_end_);
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      web_data_service->RemoveAutofillDataModifiedBetween(
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          delete_begin_, delete_end_);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The above calls are done on the UI thread but do their work on the DB
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // thread. So wait for it.
51090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      BrowserThread::PostTaskAndReply(
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::DB, FROM_HERE,
51290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          base::Bind(&base::DoNothing),
51390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          base::Bind(&BrowsingDataRemover::OnClearedFormData,
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     base::Unretained(this)));
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      autofill::PersonalDataManager* data_manager =
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          autofill::PersonalDataManagerFactory::GetForProfile(profile_);
51890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (data_manager)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data_manager->Refresh();
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & REMOVE_CACHE) {
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Tell the renderers to clear their cache.
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebCacheManager::GetInstance()->ClearCache();
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Invoke DoClearCache on the IO thread.
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_for_clear_cache_ = true;
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(UserMetricsAction("ClearBrowsingData_Cache"));
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataRemover::ClearCacheOnIOThread,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this)));
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(DISABLE_NACL)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_for_clear_nacl_cache_ = true;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataRemover::ClearNaClCacheOnIOThread,
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this)));
543ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
544ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    waiting_for_clear_pnacl_cache_ = true;
545ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    BrowserThread::PostTask(
546ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        BrowserThread::IO, FROM_HERE,
547ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        base::Bind(&BrowsingDataRemover::ClearPnaclCacheOnIOThread,
548ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                   base::Unretained(this), delete_begin_, delete_end_));
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The PrerenderManager may have a page actively being prerendered, which
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // is essentially a preemptively cached page.
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prerender::PrerenderManager* prerender_manager =
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prerender::PrerenderManagerFactory::GetForProfile(profile_);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prerender_manager) {
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender_manager->ClearData(
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Tell the shader disk cache to clear.
5617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    waiting_for_clear_shader_cache_ = true;
5627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    content::RecordAction(UserMetricsAction("ClearBrowsingData_ShaderCache"));
5637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ClearShaderCacheOnUIThread();
565ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
566ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    waiting_for_clear_webrtc_identity_store_ = true;
567ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    BrowserContext::GetDefaultStoragePartition(profile_)->ClearDataForRange(
568ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        content::StoragePartition::REMOVE_DATA_MASK_WEBRTC_IDENTITY,
569ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
570ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        delete_begin_,
571ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        delete_end_,
572ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        base::Bind(&BrowsingDataRemover::OnClearWebRTCIdentityStore,
573ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                   base::Unretained(this)));
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (remove_mask & REMOVE_CONTENT_LICENSES) {
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UserMetricsAction("ClearBrowsingData_ContentLicenses"));
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    waiting_for_clear_content_licenses_ = true;
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!pepper_flash_settings_manager_.get()) {
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pepper_flash_settings_manager_.reset(
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          new PepperFlashSettingsManager(this, profile_));
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    deauthorize_content_licenses_request_id_ =
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        pepper_flash_settings_manager_->DeauthorizeContentLicenses(prefs);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Always wipe accumulated network related data (TransportSecurityState and
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HttpServerPropertiesManager data).
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_networking_history_ = true;
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_->ClearNetworkingHistorySince(
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_begin_,
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnClearedNetworkingHistory,
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::AddObserver(Observer* observer) {
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer_list_.AddObserver(observer);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::RemoveObserver(Observer* observer) {
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer_list_.RemoveObserver(observer);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnHistoryDeletionDone() {
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_history_ = false;
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OverrideQuotaManagerForTesting(
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota::QuotaManager* quota_manager) {
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager_ = quota_manager;
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Time BrowsingDataRemover::CalculateBeginDeleteTime(
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TimePeriod time_period) {
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta diff;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time delete_begin_time = base::Time::Now();
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (time_period) {
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case LAST_HOUR:
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      diff = base::TimeDelta::FromHours(1);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case LAST_DAY:
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      diff = base::TimeDelta::FromHours(24);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case LAST_WEEK:
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      diff = base::TimeDelta::FromHours(7*24);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FOUR_WEEKS:
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      diff = base::TimeDelta::FromHours(4*7*24);
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case EVERYTHING:
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_begin_time = base::Time();
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << L"Missing item";
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return delete_begin_time - diff;
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowsingDataRemover::AllDone() {
646ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return registrar_.IsEmpty() && !waiting_for_clear_autofill_origin_urls_ &&
647ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_cache_ && !waiting_for_clear_nacl_cache_ &&
648ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_cookies_count_ && !waiting_for_clear_history_ &&
649ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_local_storage_ &&
650ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_logged_in_predictor_ &&
651ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_session_storage_ &&
652ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_networking_history_ &&
653ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_server_bound_certs_ &&
654ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_plugin_data_ &&
655ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_pnacl_cache_ &&
656ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_quota_managed_data_ &&
657ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_content_licenses_ && !waiting_for_clear_form_ &&
658ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_hostname_resolution_cache_ &&
659ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_network_predictor_ &&
660ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_shader_cache_ &&
661ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch         !waiting_for_clear_webrtc_identity_store_;
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::Observe(int type,
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const content::NotificationSource& source,
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const content::NotificationDetails& details) {
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(brettw) bug 1139736: This should also observe session
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clearing (what about other things such as passwords, etc.?) and wait for
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // them to complete before continuing.
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(type == chrome::NOTIFICATION_TEMPLATE_URL_SERVICE_LOADED);
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLService* model = content::Source<TemplateURLService>(source).ptr();
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (model->profile() == profile_) {
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registrar_.RemoveAll();
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model->RemoveAutoGeneratedBetween(delete_begin_, delete_end_);
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyAndDeleteIfDone();
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::NotifyAndDeleteIfDone() {
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(brettw) bug 1139736: see TODO in Observe() above.
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!AllDone())
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_removing(false);
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send global notification, then notify any explicit observers.
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowsingDataRemover::NotificationDetails details(delete_begin_, remove_mask_,
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_set_mask_);
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_BROWSING_DATA_REMOVED,
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<Profile>(profile_),
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Details<BrowsingDataRemover::NotificationDetails>(&details));
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(Observer, observer_list_, OnBrowsingDataRemoverDone());
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // History requests aren't happy if you delete yourself from the callback.
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // As such, we do a delete later.
69890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnClearedHostnameResolutionCache() {
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_hostname_resolution_cache_ = false;
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearHostnameResolutionCacheOnIOThread(
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IOThread* io_thread) {
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io_thread->ClearHostCache();
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify the UI thread that we are done.
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI,
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnClearedHostnameResolutionCache,
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowsingDataRemover::OnClearedLoggedInPredictor() {
722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(waiting_for_clear_logged_in_predictor_);
724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  waiting_for_clear_logged_in_predictor_ = false;
725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NotifyAndDeleteIfDone();
726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowsingDataRemover::ClearLoggedInPredictor() {
729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!waiting_for_clear_logged_in_predictor_);
731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
732a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  predictors::PredictorDatabase* predictor_db =
733a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      predictors::PredictorDatabaseFactory::GetForProfile(profile_);
734a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (!predictor_db)
735a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return;
736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
737a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  predictors::LoggedInPredictorTable* logged_in_table =
7387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      predictor_db->logged_in_table().get();
739a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (!logged_in_table)
740a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return;
741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  waiting_for_clear_logged_in_predictor_ = true;
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BrowserThread::PostTaskAndReply(
745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      BrowserThread::DB,
746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&predictors::LoggedInPredictorTable::DeleteAllCreatedBetween,
748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 logged_in_table,
749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 delete_begin_,
750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 delete_end_),
751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnClearedLoggedInPredictor,
752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 base::Unretained(this)));
753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnClearedNetworkPredictor() {
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_network_predictor_ = false;
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearNetworkPredictorOnIOThread() {
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_browser_net::Predictor* predictor = profile_->GetNetworkPredictor();
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (predictor) {
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    predictor->DiscardInitialNavigationHistory();
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    predictor->DiscardAllResults();
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify the UI thread that we are done.
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI,
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnClearedNetworkPredictor,
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnClearedNetworkingHistory() {
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_networking_history_ = false;
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearedCache() {
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_cache_ = false;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearCacheOnIOThread() {
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function should be called on the IO thread.
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(STATE_NONE, next_cache_state_);
794868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(main_context_getter_.get());
795868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(media_context_getter_.get());
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  next_cache_state_ = STATE_CREATE_MAIN;
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoClearCache(net::OK);
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The expected state sequence is STATE_NONE --> STATE_CREATE_MAIN -->
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// STATE_DELETE_MAIN --> STATE_CREATE_MEDIA --> STATE_DELETE_MEDIA -->
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// STATE_DONE, and any errors are ignored.
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::DoClearCache(int rv) {
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(STATE_NONE, next_cache_state_);
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (rv != net::ERR_IO_PENDING && next_cache_state_ != STATE_NONE) {
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (next_cache_state_) {
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_CREATE_MAIN:
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_CREATE_MEDIA: {
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Get a pointer to the cache.
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::URLRequestContextGetter* getter =
813868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            (next_cache_state_ == STATE_CREATE_MAIN)
814868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                ? main_context_getter_.get()
815868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                : media_context_getter_.get();
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::HttpTransactionFactory* factory =
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            getter->GetURLRequestContext()->http_transaction_factory();
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        next_cache_state_ = (next_cache_state_ == STATE_CREATE_MAIN) ?
820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                STATE_DELETE_MAIN : STATE_DELETE_MEDIA;
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv = factory->GetCache()->GetBackend(
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            &cache_, base::Bind(&BrowsingDataRemover::DoClearCache,
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                base::Unretained(this)));
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_DELETE_MAIN:
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_DELETE_MEDIA: {
828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        next_cache_state_ = (next_cache_state_ == STATE_DELETE_MAIN) ?
829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                STATE_CREATE_MEDIA : STATE_DONE;
830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // |cache_| can be null if it cannot be initialized.
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (cache_) {
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (delete_begin_.is_null()) {
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            rv = cache_->DoomAllEntries(
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                base::Bind(&BrowsingDataRemover::DoClearCache,
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::Unretained(this)));
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else {
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            rv = cache_->DoomEntriesBetween(
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                delete_begin_, delete_end_,
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                base::Bind(&BrowsingDataRemover::DoClearCache,
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::Unretained(this)));
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cache_ = NULL;
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case STATE_DONE: {
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cache_ = NULL;
849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        next_cache_state_ = STATE_NONE;
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Notify the UI thread that we are done.
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::PostTask(
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            BrowserThread::UI, FROM_HERE,
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Bind(&BrowsingDataRemover::ClearedCache,
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Unretained(this)));
856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return;
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default: {
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED() << "bad state";
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        next_cache_state_ = STATE_NONE;  // Stop looping.
861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return;
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowsingDataRemover::ClearedShaderCache() {
868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  waiting_for_clear_shader_cache_ = false;
871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NotifyAndDeleteIfDone();
872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowsingDataRemover::ClearShaderCacheOnUIThread() {
875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
877a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  BrowserContext::GetDefaultStoragePartition(profile_)->ClearDataForRange(
878a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      content::StoragePartition::REMOVE_DATA_MASK_SHADER_CACHE,
879a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL,
880a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      delete_begin_, delete_end_,
881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&BrowsingDataRemover::ClearedShaderCache,
882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 base::Unretained(this)));
883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(DISABLE_NACL)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearedNaClCache() {
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function should be called on the UI thread.
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_nacl_cache_ = false;
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearedNaClCacheOnIOThread() {
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function should be called on the IO thread.
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify the UI thread that we are done.
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::ClearedNaClCache,
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearNaClCacheOnIOThread() {
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NaClBrowser::GetInstance()->ClearValidationCache(
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::ClearedNaClCacheOnIOThread,
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
913ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
914ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid BrowsingDataRemover::ClearedPnaclCache() {
915ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // This function should be called on the UI thread.
916ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
917ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
918ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  waiting_for_clear_pnacl_cache_ = false;
919ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
920ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  NotifyAndDeleteIfDone();
921ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
922ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
923ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid BrowsingDataRemover::ClearedPnaclCacheOnIOThread() {
924ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // This function should be called on the IO thread.
925ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
926ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
927ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Notify the UI thread that we are done.
928ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  BrowserThread::PostTask(
929ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      BrowserThread::UI, FROM_HERE,
930ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&BrowsingDataRemover::ClearedPnaclCache,
931ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 base::Unretained(this)));
932ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
933ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
934ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid BrowsingDataRemover::ClearPnaclCacheOnIOThread(base::Time begin,
935ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                    base::Time end) {
936ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
937ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
938ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  PnaclHost::GetInstance()->ClearTranslationCacheEntriesBetween(
939ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      begin, end,
940ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&BrowsingDataRemover::ClearedPnaclCacheOnIOThread,
941ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 base::Unretained(this)));
942ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearLocalStorageOnUIThread() {
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(waiting_for_clear_local_storage_);
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dom_storage_context_->GetLocalStorageUsage(
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnGotLocalStorageUsageInfo,
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnGotLocalStorageUsageInfo(
954bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    const std::vector<content::LocalStorageUsageInfo>& infos) {
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(waiting_for_clear_local_storage_);
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < infos.size(); ++i) {
959868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (!BrowsingDataHelper::DoesOriginMatchMask(
960868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            infos[i].origin, origin_set_mask_, special_storage_policy_.get()))
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (infos[i].last_modified >= delete_begin_ &&
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        infos[i].last_modified <= delete_end_) {
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dom_storage_context_->DeleteLocalStorage(infos[i].origin);
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_local_storage_ = false;
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearSessionStorageOnUIThread() {
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(waiting_for_clear_session_storage_);
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dom_storage_context_->GetSessionStorageUsage(
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnGotSessionStorageUsageInfo,
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnGotSessionStorageUsageInfo(
982bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    const std::vector<content::SessionStorageUsageInfo>& infos) {
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(waiting_for_clear_session_storage_);
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < infos.size(); ++i) {
987868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (!BrowsingDataHelper::DoesOriginMatchMask(
988868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            infos[i].origin, origin_set_mask_, special_storage_policy_.get()))
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dom_storage_context_->DeleteSessionStorage(infos[i]);
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_session_storage_ = false;
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearQuotaManagedDataOnIOThread() {
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ask the QuotaManager for all origins with temporary quota modified within
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the user-specified timeframe, and deal with the resulting set in
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OnGotQuotaManagedOrigins().
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_managed_origins_to_delete_count_ = 0;
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_managed_storage_types_to_delete_count_ = 0;
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delete_begin_ == base::Time() ||
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      origin_set_mask_ &
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (BrowsingDataHelper::PROTECTED_WEB | BrowsingDataHelper::EXTENSION)) {
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If we're deleting since the beginning of time, or we're removing
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // protected origins, then ask the QuotaManager for all origins with
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // persistent quota modified within the user-specified timeframe, and deal
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // with the resulting set in OnGotQuotaManagedOrigins.
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++quota_managed_storage_types_to_delete_count_;
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->GetOriginsModifiedSince(
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        quota::kStorageTypePersistent, delete_begin_,
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataRemover::OnGotQuotaManagedOrigins,
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this)));
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do the same for temporary quota.
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++quota_managed_storage_types_to_delete_count_;
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quota_manager_->GetOriginsModifiedSince(
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      quota::kStorageTypeTemporary, delete_begin_,
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnGotQuotaManagedOrigins,
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Do the same for syncable quota.
1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ++quota_managed_storage_types_to_delete_count_;
1029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  quota_manager_->GetOriginsModifiedSince(
1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      quota::kStorageTypeSyncable, delete_begin_,
1031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnGotQuotaManagedOrigins,
1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 base::Unretained(this)));
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnGotQuotaManagedOrigins(
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::set<GURL>& origins, quota::StorageType type) {
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GT(quota_managed_storage_types_to_delete_count_, 0);
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Walk through the origins passed in, delete quota of |type| from each that
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // matches the |origin_set_mask_|.
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<GURL>::const_iterator origin;
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (origin = origins.begin(); origin != origins.end(); ++origin) {
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(mkwst): Clean this up, it's slow. http://crbug.com/130746
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!remove_origin_.is_empty() && remove_origin_ != origin->GetOrigin())
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!BrowsingDataHelper::DoesOriginMatchMask(origin->GetOrigin(),
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 origin_set_mask_,
1048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 special_storage_policy_.get()))
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++quota_managed_origins_to_delete_count_;
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota_manager_->DeleteOriginData(
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        origin->GetOrigin(), type,
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowsingDataRemover::GenerateQuotaClientMask(remove_mask_),
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataRemover::OnQuotaManagedOriginDeletion,
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this), origin->GetOrigin(), type));
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  --quota_managed_storage_types_to_delete_count_;
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckQuotaManagedDataDeletionStatus();
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnQuotaManagedOriginDeletion(
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& origin,
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota::StorageType type,
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quota::QuotaStatusCode status) {
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GT(quota_managed_origins_to_delete_count_, 0);
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status != quota::kQuotaStatusOk) {
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DLOG(ERROR) << "Couldn't remove data of type " << type << " for origin "
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << origin << ". Status: " << status;
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  --quota_managed_origins_to_delete_count_;
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckQuotaManagedDataDeletionStatus();
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::CheckQuotaManagedDataDeletionStatus() {
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (quota_managed_storage_types_to_delete_count_ != 0 ||
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      quota_managed_origins_to_delete_count_ != 0) {
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnQuotaManagedDataDeleted,
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnQuotaManagedDataDeleted() {
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(waiting_for_clear_quota_managed_data_);
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_quota_managed_data_ = false;
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnWaitableEventSignaled(
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::WaitableEvent* waitable_event) {
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_plugin_data_ = false;
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS)
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnDeauthorizeContentLicensesCompleted(
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool /* success */) {
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(waiting_for_clear_content_licenses_);
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(request_id, deauthorize_content_licenses_request_id_);
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_content_licenses_ = false;
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnClearedCookies(int num_deleted) {
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::UI, FROM_HERE,
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&BrowsingDataRemover::OnClearedCookies,
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this), num_deleted));
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1122a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  DCHECK_GT(waiting_for_clear_cookies_count_, 0);
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  --waiting_for_clear_cookies_count_;
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearCookiesOnIOThread(
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContextGetter* rq_context) {
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::CookieStore* cookie_store = rq_context->
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetURLRequestContext()->cookie_store();
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_store->DeleteAllCreatedBetweenAsync(
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_begin_, delete_end_,
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnClearedCookies,
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::ClearServerBoundCertsOnIOThread(
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContextGetter* rq_context) {
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::ServerBoundCertService* server_bound_cert_service =
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rq_context->GetURLRequestContext()->server_bound_cert_service();
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  server_bound_cert_service->GetCertStore()->DeleteAllCreatedBetween(
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delete_begin_, delete_end_,
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnClearedServerBoundCertsOnIOThread,
11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this), base::Unretained(rq_context)));
11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowsingDataRemover::OnClearedServerBoundCertsOnIOThread(
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::URLRequestContextGetter* rq_context) {
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Need to close open SSL connections which may be using the channel ids we
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // are deleting.
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(mattm): http://crbug.com/166069 Make the server bound cert
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // service/store have observers that can notify relevant things directly.
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rq_context->GetURLRequestContext()->ssl_config_service()->
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NotifySSLConfigChange();
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&BrowsingDataRemover::OnClearedServerBoundCerts,
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnClearedServerBoundCerts() {
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_server_bound_certs_ = false;
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingDataRemover::OnClearedFormData() {
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  waiting_for_clear_form_ = false;
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyAndDeleteIfDone();
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
117490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
117590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void BrowsingDataRemover::OnClearedAutofillOriginURLs() {
117690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
117790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  waiting_for_clear_autofill_origin_urls_ = false;
117890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NotifyAndDeleteIfDone();
117990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
1180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid BrowsingDataRemover::OnClearWebRTCIdentityStore() {
1182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  waiting_for_clear_webrtc_identity_store_ = false;
1184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  NotifyAndDeleteIfDone();
1185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1186