Index: chrome/browser/browsing_data_remover.cc |
diff --git a/chrome/browser/browsing_data_remover.cc b/chrome/browser/browsing_data_remover.cc |
deleted file mode 100644 |
index 01347ee7a0d7834f292b22a8fd41d2e0223e5371..0000000000000000000000000000000000000000 |
--- a/chrome/browser/browsing_data_remover.cc |
+++ /dev/null |
@@ -1,887 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/browsing_data_remover.h" |
- |
-#include <map> |
-#include <set> |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/callback.h" |
-#include "base/file_util.h" |
-#include "base/logging.h" |
-#include "base/platform_file.h" |
-#include "chrome/browser/autofill/personal_data_manager.h" |
-#include "chrome/browser/autofill/personal_data_manager_factory.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/browsing_data_helper.h" |
-#include "chrome/browser/download/download_service.h" |
-#include "chrome/browser/download/download_service_factory.h" |
-#include "chrome/browser/extensions/extension_service.h" |
-#include "chrome/browser/extensions/extension_special_storage_policy.h" |
-#include "chrome/browser/history/history.h" |
-#include "chrome/browser/history/history_service_factory.h" |
-#include "chrome/browser/io_thread.h" |
-#include "chrome/browser/nacl_host/nacl_browser.h" |
-#include "chrome/browser/net/chrome_url_request_context.h" |
-#include "chrome/browser/net/predictor.h" |
-#include "chrome/browser/password_manager/password_store.h" |
-#include "chrome/browser/password_manager/password_store_factory.h" |
-#include "chrome/browser/prefs/pref_member.h" |
-#include "chrome/browser/prerender/prerender_manager.h" |
-#include "chrome/browser/prerender/prerender_manager_factory.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/renderer_host/web_cache_manager.h" |
-#include "chrome/browser/safe_browsing/safe_browsing_service.h" |
-#include "chrome/browser/search_engines/template_url_service.h" |
-#include "chrome/browser/search_engines/template_url_service_factory.h" |
-#include "chrome/browser/sessions/session_service.h" |
-#include "chrome/browser/sessions/session_service_factory.h" |
-#include "chrome/browser/sessions/tab_restore_service.h" |
-#include "chrome/browser/sessions/tab_restore_service_factory.h" |
-#include "chrome/browser/webdata/web_data_service.h" |
-#include "chrome/browser/webdata/web_data_service_factory.h" |
-#include "chrome/common/chrome_notification_types.h" |
-#include "chrome/common/pref_names.h" |
-#include "chrome/common/url_constants.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "content/public/browser/dom_storage_context.h" |
-#include "content/public/browser/download_manager.h" |
-#include "content/public/browser/notification_service.h" |
-#include "content/public/browser/plugin_data_remover.h" |
-#include "content/public/browser/user_metrics.h" |
-#include "net/base/net_errors.h" |
-#include "net/base/server_bound_cert_service.h" |
-#include "net/base/server_bound_cert_store.h" |
-#include "net/base/transport_security_state.h" |
-#include "net/cookies/cookie_store.h" |
-#include "net/disk_cache/disk_cache.h" |
-#include "net/http/http_cache.h" |
-#include "net/url_request/url_request_context.h" |
-#include "net/url_request/url_request_context_getter.h" |
-#include "webkit/dom_storage/dom_storage_context.h" |
-#include "webkit/quota/quota_manager.h" |
-#include "webkit/quota/quota_types.h" |
-#include "webkit/quota/special_storage_policy.h" |
- |
-using content::BrowserContext; |
-using content::BrowserThread; |
-using content::DOMStorageContext; |
-using content::DownloadManager; |
-using content::UserMetricsAction; |
- |
-bool BrowsingDataRemover::removing_ = false; |
- |
-BrowsingDataRemover::NotificationDetails::NotificationDetails() |
- : removal_begin(base::Time()), |
- removal_mask(-1), |
- origin_set_mask(-1) { |
-} |
- |
-BrowsingDataRemover::NotificationDetails::NotificationDetails( |
- const BrowsingDataRemover::NotificationDetails& details) |
- : removal_begin(details.removal_begin), |
- removal_mask(details.removal_mask), |
- origin_set_mask(details.origin_set_mask) { |
-} |
- |
-BrowsingDataRemover::NotificationDetails::NotificationDetails( |
- base::Time removal_begin, |
- int removal_mask, |
- int origin_set_mask) |
- : removal_begin(removal_begin), |
- removal_mask(removal_mask), |
- origin_set_mask(origin_set_mask) { |
-} |
- |
-BrowsingDataRemover::NotificationDetails::~NotificationDetails() {} |
- |
-// TODO(mkwst): We should have one constructor, not two. http://crbug.com/130732 |
-BrowsingDataRemover::BrowsingDataRemover(Profile* profile, |
- base::Time delete_begin, |
- base::Time delete_end) |
- : profile_(profile), |
- quota_manager_(NULL), |
- dom_storage_context_(NULL), |
- special_storage_policy_(profile->GetExtensionSpecialStoragePolicy()), |
- delete_begin_(delete_begin), |
- delete_end_(delete_end), |
- next_cache_state_(STATE_NONE), |
- cache_(NULL), |
- main_context_getter_(profile->GetRequestContext()), |
- media_context_getter_(profile->GetRequestContextForMedia()), |
- deauthorize_content_licenses_request_id_(0), |
- waiting_for_clear_cache_(false), |
- waiting_for_clear_nacl_cache_(false), |
- waiting_for_clear_cookies_count_(0), |
- waiting_for_clear_history_(false), |
- waiting_for_clear_local_storage_(false), |
- waiting_for_clear_networking_history_(false), |
- waiting_for_clear_server_bound_certs_(false), |
- waiting_for_clear_plugin_data_(false), |
- waiting_for_clear_quota_managed_data_(false), |
- waiting_for_clear_content_licenses_(false), |
- remove_mask_(0), |
- remove_origin_(GURL()), |
- origin_set_mask_(0) { |
- DCHECK(profile); |
-} |
- |
-BrowsingDataRemover::BrowsingDataRemover(Profile* profile, |
- TimePeriod time_period, |
- base::Time delete_end) |
- : profile_(profile), |
- quota_manager_(NULL), |
- dom_storage_context_(NULL), |
- special_storage_policy_(profile->GetExtensionSpecialStoragePolicy()), |
- delete_begin_(CalculateBeginDeleteTime(time_period)), |
- delete_end_(delete_end), |
- next_cache_state_(STATE_NONE), |
- cache_(NULL), |
- main_context_getter_(profile->GetRequestContext()), |
- media_context_getter_(profile->GetRequestContextForMedia()), |
- deauthorize_content_licenses_request_id_(0), |
- waiting_for_clear_cache_(false), |
- waiting_for_clear_nacl_cache_(false), |
- waiting_for_clear_cookies_count_(0), |
- waiting_for_clear_history_(false), |
- waiting_for_clear_local_storage_(false), |
- waiting_for_clear_networking_history_(false), |
- waiting_for_clear_server_bound_certs_(false), |
- waiting_for_clear_plugin_data_(false), |
- waiting_for_clear_quota_managed_data_(false), |
- waiting_for_clear_content_licenses_(false), |
- remove_mask_(0), |
- remove_origin_(GURL()), |
- origin_set_mask_(0) { |
- DCHECK(profile); |
-} |
- |
-BrowsingDataRemover::~BrowsingDataRemover() { |
- DCHECK(AllDone()); |
-} |
- |
-// Static. |
-void BrowsingDataRemover::set_removing(bool removing) { |
- DCHECK(removing_ != removing); |
- removing_ = removing; |
-} |
- |
-// Static. |
-int BrowsingDataRemover::GenerateQuotaClientMask(int remove_mask) { |
- int quota_client_mask = 0; |
- if (remove_mask & BrowsingDataRemover::REMOVE_FILE_SYSTEMS) |
- quota_client_mask |= quota::QuotaClient::kFileSystem; |
- if (remove_mask & BrowsingDataRemover::REMOVE_WEBSQL) |
- quota_client_mask |= quota::QuotaClient::kDatabase; |
- if (remove_mask & BrowsingDataRemover::REMOVE_APPCACHE) |
- quota_client_mask |= quota::QuotaClient::kAppcache; |
- if (remove_mask & BrowsingDataRemover::REMOVE_INDEXEDDB) |
- quota_client_mask |= quota::QuotaClient::kIndexedDatabase; |
- |
- return quota_client_mask; |
-} |
- |
-void BrowsingDataRemover::Remove(int remove_mask, int origin_set_mask) { |
- RemoveImpl(remove_mask, GURL(), origin_set_mask); |
-} |
- |
-void BrowsingDataRemover::RemoveImpl(int remove_mask, |
- const GURL& origin, |
- int origin_set_mask) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- set_removing(true); |
- remove_mask_ = remove_mask; |
- remove_origin_ = origin; |
- origin_set_mask_ = origin_set_mask; |
- |
- if (origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) { |
- content::RecordAction( |
- UserMetricsAction("ClearBrowsingData_MaskContainsUnprotectedWeb")); |
- } |
- if (origin_set_mask_ & BrowsingDataHelper::PROTECTED_WEB) { |
- content::RecordAction( |
- UserMetricsAction("ClearBrowsingData_MaskContainsProtectedWeb")); |
- } |
- if (origin_set_mask_ & BrowsingDataHelper::EXTENSION) { |
- content::RecordAction( |
- UserMetricsAction("ClearBrowsingData_MaskContainsExtension")); |
- } |
- // If this fires, we added a new BrowsingDataHelper::OriginSetMask without |
- // updating the user metrics above. |
- COMPILE_ASSERT( |
- BrowsingDataHelper::ALL == (BrowsingDataHelper::UNPROTECTED_WEB | |
- BrowsingDataHelper::PROTECTED_WEB | |
- BrowsingDataHelper::EXTENSION), |
- forgotten_to_add_origin_mask_type); |
- |
- if (remove_mask & REMOVE_HISTORY) { |
- HistoryService* history_service = HistoryServiceFactory::GetForProfile( |
- profile_, Profile::EXPLICIT_ACCESS); |
- if (history_service) { |
- std::set<GURL> restrict_urls; |
- if (!remove_origin_.is_empty()) |
- restrict_urls.insert(remove_origin_); |
- content::RecordAction(UserMetricsAction("ClearBrowsingData_History")); |
- waiting_for_clear_history_ = true; |
- history_service->ExpireHistoryBetween(restrict_urls, |
- delete_begin_, delete_end_, |
- &request_consumer_, |
- base::Bind(&BrowsingDataRemover::OnHistoryDeletionDone, |
- base::Unretained(this))); |
- } |
- |
- // Need to clear the host cache and accumulated speculative data, as it also |
- // reveals some history: we have no mechanism to track when these items were |
- // created, so we'll clear them all. Better safe than sorry. |
- if (g_browser_process->io_thread()) { |
- waiting_for_clear_networking_history_ = true; |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&BrowsingDataRemover::ClearNetworkingHistory, |
- base::Unretained(this), g_browser_process->io_thread())); |
- } |
- |
- // As part of history deletion we also delete the auto-generated keywords. |
- TemplateURLService* keywords_model = |
- TemplateURLServiceFactory::GetForProfile(profile_); |
- if (keywords_model && !keywords_model->loaded()) { |
- registrar_.Add(this, chrome::NOTIFICATION_TEMPLATE_URL_SERVICE_LOADED, |
- content::Source<TemplateURLService>(keywords_model)); |
- keywords_model->Load(); |
- } else if (keywords_model) { |
- keywords_model->RemoveAutoGeneratedForOriginBetween(remove_origin_, |
- delete_begin_, delete_end_); |
- } |
- |
- // The PrerenderManager keeps history of prerendered pages, so clear that. |
- // It also may have a prerendered page. If so, the page could be |
- // considered to have a small amount of historical information, so delete |
- // it, too. |
- prerender::PrerenderManager* prerender_manager = |
- prerender::PrerenderManagerFactory::GetForProfile(profile_); |
- if (prerender_manager) { |
- prerender_manager->ClearData( |
- prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS | |
- prerender::PrerenderManager::CLEAR_PRERENDER_HISTORY); |
- } |
- |
- // If the caller is removing history for all hosts, then clear ancillary |
- // historical information. |
- if (remove_origin_.is_empty()) { |
- // We also delete the list of recently closed tabs. Since these expire, |
- // they can't be more than a day old, so we can simply clear them all. |
- TabRestoreService* tab_service = |
- TabRestoreServiceFactory::GetForProfile(profile_); |
- if (tab_service) { |
- tab_service->ClearEntries(); |
- tab_service->DeleteLastSession(); |
- } |
- |
-#if defined(ENABLE_SESSION_SERVICE) |
- // We also delete the last session when we delete the history. |
- SessionService* session_service = |
- SessionServiceFactory::GetForProfile(profile_); |
- if (session_service) |
- session_service->DeleteLastSession(); |
-#endif |
- } |
- } |
- |
- if (remove_mask & REMOVE_DOWNLOADS) { |
- content::RecordAction(UserMetricsAction("ClearBrowsingData_Downloads")); |
- DownloadManager* download_manager = |
- BrowserContext::GetDownloadManager(profile_); |
- download_manager->RemoveDownloadsBetween(delete_begin_, delete_end_); |
- download_manager->ClearLastDownloadPath(); |
- } |
- |
- // We ignore the REMOVE_COOKIES request if UNPROTECTED_WEB is not set, |
- // so that callers who request REMOVE_SITE_DATA with PROTECTED_WEB |
- // don't accidentally remove the cookies that are associated with the |
- // UNPROTECTED_WEB origin. This is necessary because cookies are not separated |
- // between UNPROTECTED_WEB and PROTECTED_WEB. |
- if (remove_mask & REMOVE_COOKIES && |
- origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) { |
- content::RecordAction(UserMetricsAction("ClearBrowsingData_Cookies")); |
- // Since we are running on the UI thread don't call GetURLRequestContext(). |
- net::URLRequestContextGetter* rq_context = profile_->GetRequestContext(); |
- if (rq_context) { |
- ++waiting_for_clear_cookies_count_; |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&BrowsingDataRemover::ClearCookiesOnIOThread, |
- base::Unretained(this), base::Unretained(rq_context))); |
- } |
- |
-#if defined(ENABLE_SAFE_BROWSING) |
- // Clear the safebrowsing cookies only if time period is for "all time". It |
- // doesn't make sense to apply the time period of deleting in the last X |
- // hours/days to the safebrowsing cookies since they aren't the result of |
- // any user action. |
- if (delete_begin_ == base::Time()) { |
- SafeBrowsingService* sb_service = |
- g_browser_process->safe_browsing_service(); |
- if (sb_service) { |
- net::URLRequestContextGetter* sb_context = |
- sb_service->url_request_context(); |
- ++waiting_for_clear_cookies_count_; |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&BrowsingDataRemover::ClearCookiesOnIOThread, |
- base::Unretained(this), base::Unretained(sb_context))); |
- } |
- } |
-#endif |
- } |
- |
- // Server bound certs are not separated for protected and unprotected web |
- // origins. We check the origin_set_mask_ to prevent unintended deletion. |
- if (remove_mask & REMOVE_SERVER_BOUND_CERTS && |
- origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) { |
- content::RecordAction( |
- UserMetricsAction("ClearBrowsingData_ServerBoundCerts")); |
- // Since we are running on the UI thread don't call GetURLRequestContext(). |
- net::URLRequestContextGetter* rq_context = profile_->GetRequestContext(); |
- if (rq_context) { |
- waiting_for_clear_server_bound_certs_ = true; |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&BrowsingDataRemover::ClearServerBoundCertsOnIOThread, |
- base::Unretained(this), base::Unretained(rq_context))); |
- } |
- } |
- |
- if (remove_mask & REMOVE_LOCAL_STORAGE) { |
- waiting_for_clear_local_storage_ = true; |
- if (!dom_storage_context_) |
- dom_storage_context_ = |
- BrowserContext::GetDefaultDOMStorageContext(profile_); |
- ClearLocalStorageOnUIThread(); |
- } |
- |
- if (remove_mask & REMOVE_INDEXEDDB || remove_mask & REMOVE_WEBSQL || |
- remove_mask & REMOVE_APPCACHE || remove_mask & REMOVE_FILE_SYSTEMS) { |
- if (!quota_manager_) |
- quota_manager_ = content::BrowserContext::GetQuotaManager(profile_); |
- waiting_for_clear_quota_managed_data_ = true; |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&BrowsingDataRemover::ClearQuotaManagedDataOnIOThread, |
- base::Unretained(this))); |
- } |
- |
- // Plugin is data not separated for protected and unprotected web origins. We |
- // check the origin_set_mask_ to prevent unintended deletion. |
- if (remove_mask & REMOVE_PLUGIN_DATA && |
- origin_set_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) { |
- content::RecordAction(UserMetricsAction("ClearBrowsingData_LSOData")); |
- |
- waiting_for_clear_plugin_data_ = true; |
- if (!plugin_data_remover_.get()) |
- plugin_data_remover_.reset(content::PluginDataRemover::Create(profile_)); |
- base::WaitableEvent* event = |
- plugin_data_remover_->StartRemoving(delete_begin_); |
- watcher_.StartWatching(event, this); |
- } |
- |
- if (remove_mask & REMOVE_PASSWORDS) { |
- content::RecordAction(UserMetricsAction("ClearBrowsingData_Passwords")); |
- PasswordStore* password_store = PasswordStoreFactory::GetForProfile( |
- profile_, Profile::EXPLICIT_ACCESS); |
- |
- if (password_store) |
- password_store->RemoveLoginsCreatedBetween(delete_begin_, delete_end_); |
- } |
- |
- if (remove_mask & REMOVE_FORM_DATA) { |
- content::RecordAction(UserMetricsAction("ClearBrowsingData_Autofill")); |
- scoped_refptr<WebDataService> web_data_service = |
- WebDataServiceFactory::GetForProfile(profile_, |
- Profile::EXPLICIT_ACCESS); |
- |
- if (web_data_service.get()) { |
- web_data_service->RemoveFormElementsAddedBetween(delete_begin_, |
- delete_end_); |
- web_data_service->RemoveAutofillProfilesAndCreditCardsModifiedBetween( |
- delete_begin_, delete_end_); |
- PersonalDataManager* data_manager = |
- PersonalDataManagerFactory::GetForProfile(profile_); |
- if (data_manager) { |
- data_manager->Refresh(); |
- } |
- } |
- } |
- |
- if (remove_mask & REMOVE_CACHE) { |
- // Tell the renderers to clear their cache. |
- WebCacheManager::GetInstance()->ClearCache(); |
- |
- // Invoke DoClearCache on the IO thread. |
- waiting_for_clear_cache_ = true; |
- content::RecordAction(UserMetricsAction("ClearBrowsingData_Cache")); |
- |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&BrowsingDataRemover::ClearCacheOnIOThread, |
- base::Unretained(this))); |
- |
-#if !defined(DISABLE_NACL) |
- waiting_for_clear_nacl_cache_ = true; |
- |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&BrowsingDataRemover::ClearNaClCacheOnIOThread, |
- base::Unretained(this))); |
-#endif |
- |
- // The PrerenderManager may have a page actively being prerendered, which |
- // is essentially a preemptively cached page. |
- prerender::PrerenderManager* prerender_manager = |
- prerender::PrerenderManagerFactory::GetForProfile(profile_); |
- if (prerender_manager) { |
- prerender_manager->ClearData( |
- prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS); |
- } |
- } |
- |
- if (remove_mask & REMOVE_CONTENT_LICENSES) { |
- content::RecordAction( |
- UserMetricsAction("ClearBrowsingData_ContentLicenses")); |
- |
- waiting_for_clear_content_licenses_ = true; |
- if (!pepper_flash_settings_manager_.get()) { |
- pepper_flash_settings_manager_.reset( |
- new PepperFlashSettingsManager(this, profile_)); |
- } |
- deauthorize_content_licenses_request_id_ = |
- pepper_flash_settings_manager_->DeauthorizeContentLicenses(); |
- } |
- |
- // Also delete cached network related data (like TransportSecurityState, |
- // HttpServerProperties data). |
- profile_->ClearNetworkingHistorySince(delete_begin_); |
- |
- NotifyAndDeleteIfDone(); |
-} |
- |
-void BrowsingDataRemover::AddObserver(Observer* observer) { |
- observer_list_.AddObserver(observer); |
-} |
- |
-void BrowsingDataRemover::RemoveObserver(Observer* observer) { |
- observer_list_.RemoveObserver(observer); |
-} |
- |
-void BrowsingDataRemover::OnHistoryDeletionDone() { |
- waiting_for_clear_history_ = false; |
- NotifyAndDeleteIfDone(); |
-} |
- |
-void BrowsingDataRemover::OverrideQuotaManagerForTesting( |
- quota::QuotaManager* quota_manager) { |
- quota_manager_ = quota_manager; |
-} |
- |
-base::Time BrowsingDataRemover::CalculateBeginDeleteTime( |
- TimePeriod time_period) { |
- base::TimeDelta diff; |
- base::Time delete_begin_time = base::Time::Now(); |
- switch (time_period) { |
- case LAST_HOUR: |
- diff = base::TimeDelta::FromHours(1); |
- break; |
- case LAST_DAY: |
- diff = base::TimeDelta::FromHours(24); |
- break; |
- case LAST_WEEK: |
- diff = base::TimeDelta::FromHours(7*24); |
- break; |
- case FOUR_WEEKS: |
- diff = base::TimeDelta::FromHours(4*7*24); |
- break; |
- case EVERYTHING: |
- delete_begin_time = base::Time(); |
- break; |
- default: |
- NOTREACHED() << L"Missing item"; |
- break; |
- } |
- return delete_begin_time - diff; |
-} |
- |
-bool BrowsingDataRemover::AllDone() { |
- return registrar_.IsEmpty() && |
- !waiting_for_clear_cache_ && |
- !waiting_for_clear_nacl_cache_ && |
- !waiting_for_clear_cookies_count_&& |
- !waiting_for_clear_history_ && |
- !waiting_for_clear_local_storage_ && |
- !waiting_for_clear_networking_history_ && |
- !waiting_for_clear_server_bound_certs_ && |
- !waiting_for_clear_plugin_data_ && |
- !waiting_for_clear_quota_managed_data_ && |
- !waiting_for_clear_content_licenses_; |
-} |
- |
-void BrowsingDataRemover::Observe(int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- // TODO(brettw) bug 1139736: This should also observe session |
- // clearing (what about other things such as passwords, etc.?) and wait for |
- // them to complete before continuing. |
- DCHECK(type == chrome::NOTIFICATION_TEMPLATE_URL_SERVICE_LOADED); |
- TemplateURLService* model = content::Source<TemplateURLService>(source).ptr(); |
- if (model->profile() == profile_) { |
- registrar_.RemoveAll(); |
- model->RemoveAutoGeneratedBetween(delete_begin_, delete_end_); |
- NotifyAndDeleteIfDone(); |
- } |
-} |
- |
-void BrowsingDataRemover::NotifyAndDeleteIfDone() { |
- // TODO(brettw) bug 1139736: see TODO in Observe() above. |
- if (!AllDone()) |
- return; |
- |
- set_removing(false); |
- |
- // Send global notification, then notify any explicit observers. |
- BrowsingDataRemover::NotificationDetails details(delete_begin_, remove_mask_, |
- origin_set_mask_); |
- content::NotificationService::current()->Notify( |
- chrome::NOTIFICATION_BROWSING_DATA_REMOVED, |
- content::Source<Profile>(profile_), |
- content::Details<BrowsingDataRemover::NotificationDetails>(&details)); |
- |
- FOR_EACH_OBSERVER(Observer, observer_list_, OnBrowsingDataRemoverDone()); |
- |
- // History requests aren't happy if you delete yourself from the callback. |
- // As such, we do a delete later. |
- MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
-} |
- |
-void BrowsingDataRemover::ClearedNetworkHistory() { |
- waiting_for_clear_networking_history_ = false; |
- |
- NotifyAndDeleteIfDone(); |
-} |
- |
-void BrowsingDataRemover::ClearNetworkingHistory(IOThread* io_thread) { |
- // This function should be called on the IO thread. |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- io_thread->ClearHostCache(); |
- |
- chrome_browser_net::Predictor* predictor = profile_->GetNetworkPredictor(); |
- if (predictor) { |
- predictor->DiscardInitialNavigationHistory(); |
- predictor->DiscardAllResults(); |
- } |
- |
- // Notify the UI thread that we are done. |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&BrowsingDataRemover::ClearedNetworkHistory, |
- base::Unretained(this))); |
-} |
- |
-void BrowsingDataRemover::ClearedCache() { |
- waiting_for_clear_cache_ = false; |
- |
- NotifyAndDeleteIfDone(); |
-} |
- |
-void BrowsingDataRemover::ClearCacheOnIOThread() { |
- // This function should be called on the IO thread. |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- DCHECK_EQ(STATE_NONE, next_cache_state_); |
- DCHECK(main_context_getter_); |
- DCHECK(media_context_getter_); |
- |
- next_cache_state_ = STATE_CREATE_MAIN; |
- DoClearCache(net::OK); |
-} |
- |
-// The expected state sequence is STATE_NONE --> STATE_CREATE_MAIN --> |
-// STATE_DELETE_MAIN --> STATE_CREATE_MEDIA --> STATE_DELETE_MEDIA --> |
-// STATE_DONE, and any errors are ignored. |
-void BrowsingDataRemover::DoClearCache(int rv) { |
- DCHECK_NE(STATE_NONE, next_cache_state_); |
- |
- while (rv != net::ERR_IO_PENDING && next_cache_state_ != STATE_NONE) { |
- switch (next_cache_state_) { |
- case STATE_CREATE_MAIN: |
- case STATE_CREATE_MEDIA: { |
- // Get a pointer to the cache. |
- net::URLRequestContextGetter* getter = |
- (next_cache_state_ == STATE_CREATE_MAIN) ? |
- main_context_getter_ : media_context_getter_; |
- net::HttpTransactionFactory* factory = |
- getter->GetURLRequestContext()->http_transaction_factory(); |
- |
- rv = factory->GetCache()->GetBackend( |
- &cache_, base::Bind(&BrowsingDataRemover::DoClearCache, |
- base::Unretained(this))); |
- next_cache_state_ = (next_cache_state_ == STATE_CREATE_MAIN) ? |
- STATE_DELETE_MAIN : STATE_DELETE_MEDIA; |
- break; |
- } |
- case STATE_DELETE_MAIN: |
- case STATE_DELETE_MEDIA: { |
- // |cache_| can be null if it cannot be initialized. |
- if (cache_) { |
- if (delete_begin_.is_null()) { |
- rv = cache_->DoomAllEntries( |
- base::Bind(&BrowsingDataRemover::DoClearCache, |
- base::Unretained(this))); |
- } else { |
- rv = cache_->DoomEntriesBetween( |
- delete_begin_, delete_end_, |
- base::Bind(&BrowsingDataRemover::DoClearCache, |
- base::Unretained(this))); |
- } |
- cache_ = NULL; |
- } |
- next_cache_state_ = (next_cache_state_ == STATE_DELETE_MAIN) ? |
- STATE_CREATE_MEDIA : STATE_DONE; |
- break; |
- } |
- case STATE_DONE: { |
- cache_ = NULL; |
- |
- // Notify the UI thread that we are done. |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&BrowsingDataRemover::ClearedCache, |
- base::Unretained(this))); |
- |
- next_cache_state_ = STATE_NONE; |
- break; |
- } |
- default: { |
- NOTREACHED() << "bad state"; |
- next_cache_state_ = STATE_NONE; // Stop looping. |
- break; |
- } |
- } |
- } |
-} |
- |
-#if !defined(DISABLE_NACL) |
-void BrowsingDataRemover::ClearedNaClCache() { |
- // This function should be called on the UI thread. |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- waiting_for_clear_nacl_cache_ = false; |
- |
- NotifyAndDeleteIfDone(); |
-} |
- |
-void BrowsingDataRemover::ClearedNaClCacheOnIOThread() { |
- // This function should be called on the IO thread. |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- // Notify the UI thread that we are done. |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&BrowsingDataRemover::ClearedNaClCache, |
- base::Unretained(this))); |
-} |
- |
-void BrowsingDataRemover::ClearNaClCacheOnIOThread() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- NaClBrowser::GetInstance()->ClearValidationCache( |
- base::Bind(&BrowsingDataRemover::ClearedNaClCacheOnIOThread, |
- base::Unretained(this))); |
-} |
-#endif |
- |
-void BrowsingDataRemover::ClearLocalStorageOnUIThread() { |
- DCHECK(waiting_for_clear_local_storage_); |
- |
- dom_storage_context_->GetUsageInfo( |
- base::Bind(&BrowsingDataRemover::OnGotLocalStorageUsageInfo, |
- base::Unretained(this))); |
-} |
- |
-void BrowsingDataRemover::OnGotLocalStorageUsageInfo( |
- const std::vector<dom_storage::DomStorageContext::UsageInfo>& infos) { |
- DCHECK(waiting_for_clear_local_storage_); |
- |
- for (size_t i = 0; i < infos.size(); ++i) { |
- if (!BrowsingDataHelper::DoesOriginMatchMask(infos[i].origin, |
- origin_set_mask_, |
- special_storage_policy_)) |
- continue; |
- |
- if (infos[i].last_modified >= delete_begin_ && |
- infos[i].last_modified <= delete_end_) |
- dom_storage_context_->DeleteOrigin(infos[i].origin); |
- } |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&BrowsingDataRemover::OnLocalStorageCleared, |
- base::Unretained(this))); |
-} |
- |
-void BrowsingDataRemover::OnLocalStorageCleared() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(waiting_for_clear_local_storage_); |
- waiting_for_clear_local_storage_ = false; |
- NotifyAndDeleteIfDone(); |
-} |
- |
-void BrowsingDataRemover::ClearQuotaManagedDataOnIOThread() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- // Ask the QuotaManager for all origins with temporary quota modified within |
- // the user-specified timeframe, and deal with the resulting set in |
- // OnGotQuotaManagedOrigins(). |
- quota_managed_origins_to_delete_count_ = 0; |
- quota_managed_storage_types_to_delete_count_ = 0; |
- |
- if (delete_begin_ == base::Time() || |
- origin_set_mask_ & |
- (BrowsingDataHelper::PROTECTED_WEB | BrowsingDataHelper::EXTENSION)) { |
- // If we're deleting since the beginning of time, or we're removing |
- // protected origins, then ask the QuotaManager for all origins with |
- // persistent quota modified within the user-specified timeframe, and deal |
- // with the resulting set in OnGotQuotaManagedOrigins. |
- ++quota_managed_storage_types_to_delete_count_; |
- quota_manager_->GetOriginsModifiedSince( |
- quota::kStorageTypePersistent, delete_begin_, |
- base::Bind(&BrowsingDataRemover::OnGotQuotaManagedOrigins, |
- base::Unretained(this))); |
- } |
- |
- // Do the same for temporary quota. |
- ++quota_managed_storage_types_to_delete_count_; |
- quota_manager_->GetOriginsModifiedSince( |
- quota::kStorageTypeTemporary, delete_begin_, |
- base::Bind(&BrowsingDataRemover::OnGotQuotaManagedOrigins, |
- base::Unretained(this))); |
-} |
- |
-void BrowsingDataRemover::OnGotQuotaManagedOrigins( |
- const std::set<GURL>& origins, quota::StorageType type) { |
- DCHECK_GT(quota_managed_storage_types_to_delete_count_, 0); |
- // Walk through the origins passed in, delete quota of |type| from each that |
- // matches the |origin_set_mask_|. |
- std::set<GURL>::const_iterator origin; |
- for (origin = origins.begin(); origin != origins.end(); ++origin) { |
- // TODO(mkwst): Clean this up, it's slow. http://crbug.com/130746 |
- if (!remove_origin_.is_empty() && remove_origin_ != origin->GetOrigin()) |
- continue; |
- |
- if (!BrowsingDataHelper::DoesOriginMatchMask(origin->GetOrigin(), |
- origin_set_mask_, |
- special_storage_policy_)) |
- continue; |
- |
- ++quota_managed_origins_to_delete_count_; |
- quota_manager_->DeleteOriginData( |
- origin->GetOrigin(), type, |
- BrowsingDataRemover::GenerateQuotaClientMask(remove_mask_), |
- base::Bind(&BrowsingDataRemover::OnQuotaManagedOriginDeletion, |
- base::Unretained(this), origin->GetOrigin(), type)); |
- } |
- |
- --quota_managed_storage_types_to_delete_count_; |
- CheckQuotaManagedDataDeletionStatus(); |
-} |
- |
-void BrowsingDataRemover::OnQuotaManagedOriginDeletion( |
- const GURL& origin, |
- quota::StorageType type, |
- quota::QuotaStatusCode status) { |
- DCHECK_GT(quota_managed_origins_to_delete_count_, 0); |
- if (status != quota::kQuotaStatusOk) { |
- DLOG(ERROR) << "Couldn't remove data of type " << type << " for origin " |
- << origin << ". Status: " << status; |
- } |
- |
- --quota_managed_origins_to_delete_count_; |
- CheckQuotaManagedDataDeletionStatus(); |
-} |
- |
-void BrowsingDataRemover::CheckQuotaManagedDataDeletionStatus() { |
- if (quota_managed_storage_types_to_delete_count_ != 0 || |
- quota_managed_origins_to_delete_count_ != 0) { |
- return; |
- } |
- |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&BrowsingDataRemover::OnQuotaManagedDataDeleted, |
- base::Unretained(this))); |
-} |
- |
-void BrowsingDataRemover::OnQuotaManagedDataDeleted() { |
- DCHECK(waiting_for_clear_quota_managed_data_); |
- waiting_for_clear_quota_managed_data_ = false; |
- NotifyAndDeleteIfDone(); |
-} |
- |
-void BrowsingDataRemover::OnWaitableEventSignaled( |
- base::WaitableEvent* waitable_event) { |
- waiting_for_clear_plugin_data_ = false; |
- NotifyAndDeleteIfDone(); |
-} |
- |
-void BrowsingDataRemover::OnDeauthorizeContentLicensesCompleted( |
- uint32 request_id, |
- bool /* success */) { |
- DCHECK(waiting_for_clear_content_licenses_); |
- DCHECK_EQ(request_id, deauthorize_content_licenses_request_id_); |
- |
- waiting_for_clear_content_licenses_ = false; |
- NotifyAndDeleteIfDone(); |
-} |
- |
-void BrowsingDataRemover::OnClearedCookies(int num_deleted) { |
- if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&BrowsingDataRemover::OnClearedCookies, |
- base::Unretained(this), num_deleted)); |
- return; |
- } |
- |
- DCHECK(waiting_for_clear_cookies_count_ > 0); |
- --waiting_for_clear_cookies_count_; |
- NotifyAndDeleteIfDone(); |
-} |
- |
-void BrowsingDataRemover::ClearCookiesOnIOThread( |
- net::URLRequestContextGetter* rq_context) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- net::CookieStore* cookie_store = rq_context-> |
- GetURLRequestContext()->cookie_store(); |
- cookie_store->DeleteAllCreatedBetweenAsync( |
- delete_begin_, delete_end_, |
- base::Bind(&BrowsingDataRemover::OnClearedCookies, |
- base::Unretained(this))); |
-} |
- |
-void BrowsingDataRemover::ClearServerBoundCertsOnIOThread( |
- net::URLRequestContextGetter* rq_context) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- net::ServerBoundCertService* server_bound_cert_service = |
- rq_context->GetURLRequestContext()->server_bound_cert_service(); |
- server_bound_cert_service->GetCertStore()->DeleteAllCreatedBetween( |
- delete_begin_, delete_end_); |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&BrowsingDataRemover::OnClearedServerBoundCerts, |
- base::Unretained(this))); |
-} |
- |
-void BrowsingDataRemover::OnClearedServerBoundCerts() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- waiting_for_clear_server_bound_certs_ = false; |
- NotifyAndDeleteIfDone(); |
-} |