summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbauerb <bauerb@chromium.org>2016-01-12 06:44:45 -0800
committerCommit bot <commit-bot@chromium.org>2016-01-12 14:46:14 +0000
commit4530f30c2142ea9ec55b41b6a202772c73a8f5a4 (patch)
treee34ed7c511e8b4c392473960b2061a9a9f7cfbb0
parentc4acda4f422f1b7255f9723092a1b6d4f1d67262 (diff)
downloadchromium_src-4530f30c2142ea9ec55b41b6a202772c73a8f5a4.zip
chromium_src-4530f30c2142ea9ec55b41b6a202772c73a8f5a4.tar.gz
chromium_src-4530f30c2142ea9ec55b41b6a202772c73a8f5a4.tar.bz2
Make BrowsingDataRemover a KeyedService.
As part of this, BrowsingDataRemover is now UI-thread only, using weak pointers for callbacks to itself. Anything happening on the IO thread happens in static methods, using PostTaskAndReply if possible, or continuation passing otherwise. Also, observers now have to unregister themselves when the BrowsingDataRemover finishes. To ensure that, the ObserverList now checks that it is empty on destruction. BUG=483528 Review URL: https://codereview.chromium.org/1555333003 Cr-Commit-Position: refs/heads/master@{#368873}
-rw-r--r--chrome/browser/android/preferences/pref_service_bridge.cc27
-rw-r--r--chrome/browser/android/signin/signin_manager_android.cc6
-rw-r--r--chrome/browser/browsing_data/browsing_data_remover.cc517
-rw-r--r--chrome/browser/browsing_data/browsing_data_remover.h165
-rw-r--r--chrome/browser/browsing_data/browsing_data_remover_browsertest.cc8
-rw-r--r--chrome/browser/browsing_data/browsing_data_remover_factory.cc97
-rw-r--r--chrome/browser/browsing_data/browsing_data_remover_factory.h41
-rw-r--r--chrome/browser/browsing_data/browsing_data_remover_test_util.cc5
-rw-r--r--chrome/browser/browsing_data/browsing_data_remover_test_util.h4
-rw-r--r--chrome/browser/browsing_data/browsing_data_remover_unittest.cc56
-rw-r--r--chrome/browser/chrome_content_browser_client.cc13
-rw-r--r--chrome/browser/chromeos/profiles/profile_helper.cc13
-rw-r--r--chrome/browser/errorpage_browsertest.cc11
-rw-r--r--chrome/browser/extensions/api/browsing_data/browsing_data_api.cc20
-rw-r--r--chrome/browser/extensions/api/browsing_data/browsing_data_api.h6
-rw-r--r--chrome/browser/extensions/api/browsing_data/browsing_data_test.cc8
-rw-r--r--chrome/browser/net/sdch_browsertest.cc8
-rw-r--r--chrome/browser/prerender/prerender_browsertest.cc6
-rw-r--r--chrome/browser/profile_resetter/profile_resetter.cc13
-rw-r--r--chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc2
-rw-r--r--chrome/browser/profiles/profiles_state.cc7
-rw-r--r--chrome/browser/push_messaging/push_messaging_browsertest.cc7
-rw-r--r--chrome/browser/ssl/chrome_ssl_host_state_delegate_test.cc8
-rw-r--r--chrome/browser/sync/chrome_sync_client.cc17
-rw-r--r--chrome/browser/sync/test/integration/single_client_backup_rollback_test.cc5
-rw-r--r--chrome/browser/ui/browser_commands.cc6
-rw-r--r--chrome/browser/ui/webui/net_internals/net_internals_ui.cc9
-rw-r--r--chrome/browser/ui/webui/options/clear_browser_data_handler.cc17
-rw-r--r--chrome/browser/ui/webui/options/clear_browser_data_handler.h3
-rw-r--r--chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc17
-rw-r--r--chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h3
-rw-r--r--chrome/chrome_browser.gypi2
32 files changed, 653 insertions, 474 deletions
diff --git a/chrome/browser/android/preferences/pref_service_bridge.cc b/chrome/browser/android/preferences/pref_service_bridge.cc
index 08706d3..e294758 100644
--- a/chrome/browser/android/preferences/pref_service_bridge.cc
+++ b/chrome/browser/android/preferences/pref_service_bridge.cc
@@ -16,11 +16,13 @@
#include "base/files/file_util.h"
#include "base/memory/scoped_ptr.h"
#include "base/prefs/pref_service.h"
+#include "base/scoped_observer.h"
#include "base/strings/string_util.h"
#include "base/values.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/net/prediction_options.h"
#include "chrome/browser/prefs/incognito_mode_prefs.h"
@@ -472,14 +474,15 @@ class ClearBrowsingDataObserver : public BrowsingDataRemover::Observer {
public:
// |obj| is expected to be the object passed into ClearBrowsingData(); e.g. a
// ChromePreference.
- ClearBrowsingDataObserver(JNIEnv* env, jobject obj)
- : weak_chrome_native_preferences_(env, obj) {
+ ClearBrowsingDataObserver(JNIEnv* env,
+ jobject obj,
+ BrowsingDataRemover* browsing_data_remover)
+ : weak_chrome_native_preferences_(env, obj), observer_(this) {
+ observer_.Add(browsing_data_remover);
}
void OnBrowsingDataRemoverDone() override {
- // Just as a BrowsingDataRemover deletes itself when done, we delete ourself
- // when done. No need to remove ourself as an observer given the lifetime
- // of BrowsingDataRemover.
+ // We delete ourselves when done.
scoped_ptr<ClearBrowsingDataObserver> auto_delete(this);
JNIEnv* env = AttachCurrentThread();
@@ -492,7 +495,9 @@ class ClearBrowsingDataObserver : public BrowsingDataRemover::Observer {
private:
JavaObjectWeakGlobalRef weak_chrome_native_preferences_;
+ ScopedObserver<BrowsingDataRemover, BrowsingDataRemover::Observer> observer_;
};
+
} // namespace
static void ClearBrowsingData(JNIEnv* env,
@@ -502,13 +507,11 @@ static void ClearBrowsingData(JNIEnv* env,
jboolean cookies_and_site_data,
jboolean passwords,
jboolean form_data) {
- // BrowsingDataRemover deletes itself.
BrowsingDataRemover* browsing_data_remover =
- BrowsingDataRemover::CreateForPeriod(
- GetOriginalProfile(),
- static_cast<BrowsingDataRemover::TimePeriod>(
- BrowsingDataRemover::EVERYTHING));
- browsing_data_remover->AddObserver(new ClearBrowsingDataObserver(env, obj));
+ BrowsingDataRemoverFactory::GetForBrowserContext(GetOriginalProfile());
+ // ClearBrowsingDataObserver removes itself when |browsing_data_remover| is
+ // done.
+ new ClearBrowsingDataObserver(env, obj, browsing_data_remover);
int remove_mask = 0;
if (history)
@@ -523,7 +526,7 @@ static void ClearBrowsingData(JNIEnv* env,
remove_mask |= BrowsingDataRemover::REMOVE_PASSWORDS;
if (form_data)
remove_mask |= BrowsingDataRemover::REMOVE_FORM_DATA;
- browsing_data_remover->Remove(remove_mask,
+ browsing_data_remover->Remove(BrowsingDataRemover::Unbounded(), remove_mask,
BrowsingDataHelper::UNPROTECTED_WEB);
}
diff --git a/chrome/browser/android/signin/signin_manager_android.cc b/chrome/browser/android/signin/signin_manager_android.cc
index 7d3ea29..fcfd74e 100644
--- a/chrome/browser/android/signin/signin_manager_android.cc
+++ b/chrome/browser/android/signin/signin_manager_android.cc
@@ -20,6 +20,7 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/signin/account_tracker_service_factory.h"
#include "chrome/browser/signin/oauth2_token_service_delegate_android.h"
@@ -58,9 +59,10 @@ class ProfileDataRemover : public BrowsingDataRemover::Observer {
ProfileDataRemover(Profile* profile, const base::Closure& callback)
: callback_(callback),
origin_runner_(base::ThreadTaskRunnerHandle::Get()),
- remover_(BrowsingDataRemover::CreateForUnboundedRange(profile)) {
+ remover_(BrowsingDataRemoverFactory::GetForBrowserContext(profile)) {
remover_->AddObserver(this);
- remover_->Remove(BrowsingDataRemover::REMOVE_ALL, BrowsingDataHelper::ALL);
+ remover_->Remove(BrowsingDataRemover::Unbounded(),
+ BrowsingDataRemover::REMOVE_ALL, BrowsingDataHelper::ALL);
}
~ProfileDataRemover() override {}
diff --git a/chrome/browser/browsing_data/browsing_data_remover.cc b/chrome/browser/browsing_data/browsing_data_remover.cc
index 490b3cf..d8350d9 100644
--- a/chrome/browser/browsing_data/browsing_data_remover.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover.cc
@@ -18,11 +18,11 @@
#include "chrome/browser/autofill/personal_data_manager_factory.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/domain_reliability/service_factory.h"
#include "chrome/browser/download/download_prefs.h"
-#include "chrome/browser/download/download_service_factory.h"
#include "chrome/browser/history/history_service_factory.h"
#include "chrome/browser/history/web_history_service_factory.h"
#include "chrome/browser/io_thread.h"
@@ -36,8 +36,6 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/safe_browsing/safe_browsing_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_factory.h"
#include "chrome/browser/web_data_service_factory.h"
#include "chrome/common/features.h"
@@ -97,11 +95,14 @@
#if defined(ENABLE_EXTENSIONS)
#include "chrome/browser/extensions/activity_log/activity_log.h"
-#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_special_storage_policy.h"
#include "extensions/browser/extension_prefs.h"
#endif
+#if defined(ENABLE_SESSION_SERVICE)
+#include "chrome/browser/sessions/session_service.h"
+#include "chrome/browser/sessions/session_service_factory.h"
+#endif
+
#if defined(ENABLE_WEBRTC)
#include "chrome/browser/media/webrtc_log_list.h"
#include "chrome/browser/media/webrtc_log_util.h"
@@ -128,15 +129,32 @@ CallbackList* GetOnBrowsingDataRemovedCallbacks() {
return g_on_browsing_data_removed_callbacks;
}
-} // namespace
+void UIThreadTrampolineHelper(const base::Closure& callback) {
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, callback);
+}
-bool BrowsingDataRemover::is_removing_ = false;
+// Convenience method to create a callback that can be run on any thread and
+// will post the given |callback| back to the UI thread.
+base::Closure UIThreadTrampoline(const base::Closure& callback) {
+ // We could directly bind &BrowserThread::PostTask, but that would require
+ // evaluating FROM_HERE when this method is called, as opposed to when the
+ // task is actually posted.
+ return base::Bind(&UIThreadTrampolineHelper, callback);
+}
-BrowsingDataRemover::CompletionInhibitor*
- BrowsingDataRemover::completion_inhibitor_ = nullptr;
+template <typename T>
+void IgnoreArgumentHelper(const base::Closure& callback, T unused_argument) {
+ callback.Run();
+}
+
+// Another convenience method to turn a callback without arguments into one that
+// accepts (and ignores) a single argument.
+template <typename T>
+base::Callback<void(T)> IgnoreArgument(const base::Closure& callback) {
+ return base::Bind(&IgnoreArgumentHelper<T>, callback);
+}
// Helper to create callback for BrowsingDataRemover::DoesOriginMatchMask.
-// Static.
bool DoesOriginMatchMask(
int origin_type_mask,
const GURL& origin,
@@ -145,6 +163,80 @@ bool DoesOriginMatchMask(
origin, origin_type_mask, special_storage_policy);
}
+void ClearHostnameResolutionCacheOnIOThread(IOThread* io_thread) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+ io_thread->ClearHostCache();
+}
+
+void ClearNetworkPredictorOnIOThread(chrome_browser_net::Predictor* predictor) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ DCHECK(predictor);
+
+ predictor->DiscardInitialNavigationHistory();
+ predictor->DiscardAllResults();
+}
+
+#if !defined(DISABLE_NACL)
+void ClearNaClCacheOnIOThread(const base::Closure& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+ nacl::NaClBrowser::GetInstance()->ClearValidationCache(callback);
+}
+
+void ClearPnaclCacheOnIOThread(base::Time begin,
+ base::Time end,
+ const base::Closure& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+ pnacl::PnaclHost::GetInstance()->ClearTranslationCacheEntriesBetween(
+ begin, end, callback);
+}
+#endif
+
+void ClearCookiesOnIOThread(base::Time delete_begin,
+ base::Time delete_end,
+ net::URLRequestContextGetter* rq_context,
+ const base::Closure& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ net::CookieStore* cookie_store =
+ rq_context->GetURLRequestContext()->cookie_store();
+ cookie_store->DeleteAllCreatedBetweenAsync(delete_begin, delete_end,
+ IgnoreArgument<int>(callback));
+}
+
+void OnClearedChannelIDsOnIOThread(net::URLRequestContextGetter* rq_context,
+ const base::Closure& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+ // Need to close open SSL connections which may be using the channel ids we
+ // are deleting.
+ // TODO(mattm): http://crbug.com/166069 Make the server bound cert
+ // service/store have observers that can notify relevant things directly.
+ rq_context->GetURLRequestContext()
+ ->ssl_config_service()
+ ->NotifySSLConfigChange();
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, callback);
+}
+
+void ClearChannelIDsOnIOThread(
+ base::Time delete_begin,
+ base::Time delete_end,
+ scoped_refptr<net::URLRequestContextGetter> rq_context,
+ const base::Closure& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ net::ChannelIDService* channel_id_service =
+ rq_context->GetURLRequestContext()->channel_id_service();
+ channel_id_service->GetChannelIDStore()->DeleteAllCreatedBetween(
+ delete_begin, delete_end, base::Bind(&OnClearedChannelIDsOnIOThread,
+ std::move(rq_context), callback));
+}
+
+} // namespace
+
+BrowsingDataRemover::CompletionInhibitor*
+ BrowsingDataRemover::completion_inhibitor_ = nullptr;
+
BrowsingDataRemover::NotificationDetails::NotificationDetails()
: removal_begin(base::Time()),
removal_mask(-1),
@@ -169,21 +261,13 @@ BrowsingDataRemover::NotificationDetails::NotificationDetails(
BrowsingDataRemover::NotificationDetails::~NotificationDetails() {}
-// Static.
-BrowsingDataRemover* BrowsingDataRemover::CreateForUnboundedRange(
- Profile* profile) {
- return new BrowsingDataRemover(profile, base::Time(), base::Time::Max());
-}
-
-// Static.
-BrowsingDataRemover* BrowsingDataRemover::CreateForRange(Profile* profile,
- base::Time start, base::Time end) {
- return new BrowsingDataRemover(profile, start, end);
+// static
+BrowsingDataRemover::TimeRange BrowsingDataRemover::Unbounded() {
+ return TimeRange(base::Time(), base::Time::Max());
}
-// Static.
-BrowsingDataRemover* BrowsingDataRemover::CreateForPeriod(Profile* profile,
- TimePeriod period) {
+// static
+BrowsingDataRemover::TimeRange BrowsingDataRemover::Period(TimePeriod period) {
switch (period) {
case LAST_HOUR:
content::RecordAction(
@@ -206,47 +290,57 @@ BrowsingDataRemover* BrowsingDataRemover::CreateForPeriod(Profile* profile,
UserMetricsAction("ClearBrowsingData_Everything"));
break;
}
- return new BrowsingDataRemover(profile,
- BrowsingDataRemover::CalculateBeginDeleteTime(period),
- base::Time::Max());
+ return TimeRange(CalculateBeginDeleteTime(period), base::Time::Max());
}
-BrowsingDataRemover::BrowsingDataRemover(Profile* profile,
- base::Time delete_begin,
- base::Time delete_end)
- : profile_(profile),
- delete_begin_(delete_begin),
- delete_end_(delete_end),
- main_context_getter_(profile->GetRequestContext()),
- media_context_getter_(profile->GetMediaRequestContext()) {
- DCHECK(profile);
- // crbug.com/140910: Many places were calling this with base::Time() as
- // delete_end, even though they should've used base::Time::Max(). Work around
- // it here. New code should use base::Time::Max().
- DCHECK(delete_end_ != base::Time());
- if (delete_end_ == base::Time())
- delete_end_ = base::Time::Max();
+BrowsingDataRemover::BrowsingDataRemover(
+ content::BrowserContext* browser_context)
+ : profile_(Profile::FromBrowserContext(browser_context)),
+ is_removing_(false),
+ main_context_getter_(browser_context->GetRequestContext()),
+ media_context_getter_(browser_context->GetMediaRequestContext()),
+ weak_ptr_factory_(this) {
+ DCHECK(browser_context);
}
BrowsingDataRemover::~BrowsingDataRemover() {
- DCHECK(AllDone());
+ // If we are still removing data, notify observers so they can remove
+ // themselves from the observer list.
+ // TODO(bauerb): If it becomes a problem that browsing data might not actually
+ // be fully cleared when an observer is notified, add a success flag.
+ if (is_removing_)
+ Notify();
+}
+
+void BrowsingDataRemover::Shutdown() {
+ history_task_tracker_.TryCancelAll();
+ template_url_sub_.reset();
}
-// Static.
-void BrowsingDataRemover::set_removing(bool is_removing) {
- DCHECK(is_removing_ != is_removing);
+void BrowsingDataRemover::SetRemoving(bool is_removing) {
+ DCHECK_NE(is_removing_, is_removing);
is_removing_ = is_removing;
}
-void BrowsingDataRemover::Remove(int remove_mask, int origin_type_mask) {
- RemoveImpl(remove_mask, GURL(), origin_type_mask);
+void BrowsingDataRemover::Remove(const TimeRange& time_range,
+ int remove_mask,
+ int origin_type_mask) {
+ RemoveImpl(time_range, remove_mask, GURL(), origin_type_mask);
}
-void BrowsingDataRemover::RemoveImpl(int remove_mask,
+void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range,
+ int remove_mask,
const GURL& remove_url,
int origin_type_mask) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- set_removing(true);
+
+ // crbug.com/140910: Many places were calling this with base::Time() as
+ // delete_end, even though they should've used base::Time::Max().
+ DCHECK_NE(base::Time(), time_range.end);
+
+ SetRemoving(true);
+ delete_begin_ = time_range.begin;
+ delete_end_ = time_range.end;
remove_mask_ = remove_mask;
origin_type_mask_ = origin_type_mask;
url::Origin remove_origin(remove_url);
@@ -292,10 +386,10 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
waiting_for_clear_history_ = true;
history_service->ExpireLocalAndRemoteHistoryBetween(
- WebHistoryServiceFactory::GetForProfile(profile_),
- restrict_urls, delete_begin_, delete_end_,
+ WebHistoryServiceFactory::GetForProfile(profile_), restrict_urls,
+ delete_begin_, delete_end_,
base::Bind(&BrowsingDataRemover::OnHistoryDeletionDone,
- base::Unretained(this)),
+ weak_ptr_factory_.GetWeakPtr()),
&history_task_tracker_);
#if defined(ENABLE_EXTENSIONS)
@@ -325,20 +419,21 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
// created, so we'll clear them all. Better safe than sorry.
if (g_browser_process->io_thread()) {
waiting_for_clear_hostname_resolution_cache_ = true;
- BrowserThread::PostTask(
+ BrowserThread::PostTaskAndReply(
BrowserThread::IO, FROM_HERE,
- base::Bind(
- &BrowsingDataRemover::ClearHostnameResolutionCacheOnIOThread,
- base::Unretained(this),
- g_browser_process->io_thread()));
+ base::Bind(&ClearHostnameResolutionCacheOnIOThread,
+ g_browser_process->io_thread()),
+ base::Bind(&BrowsingDataRemover::OnClearedHostnameResolutionCache,
+ weak_ptr_factory_.GetWeakPtr()));
}
if (profile_->GetNetworkPredictor()) {
waiting_for_clear_network_predictor_ = true;
- BrowserThread::PostTask(
+ BrowserThread::PostTaskAndReply(
BrowserThread::IO, FROM_HERE,
- base::Bind(&BrowsingDataRemover::ClearNetworkPredictorOnIOThread,
- base::Unretained(this),
- profile_->GetNetworkPredictor()));
+ base::Bind(&ClearNetworkPredictorOnIOThread,
+ profile_->GetNetworkPredictor()),
+ base::Bind(&BrowsingDataRemover::OnClearedNetworkPredictor,
+ weak_ptr_factory_.GetWeakPtr()));
}
// As part of history deletion we also delete the auto-generated keywords.
@@ -347,7 +442,7 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
if (keywords_model && !keywords_model->loaded()) {
template_url_sub_ = keywords_model->RegisterOnLoadedCallback(
base::Bind(&BrowsingDataRemover::OnKeywordsLoaded,
- base::Unretained(this)));
+ weak_ptr_factory_.GetWeakPtr()));
keywords_model->Load();
waiting_for_clear_keyword_data_ = true;
} else if (keywords_model) {
@@ -401,10 +496,9 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
// The above calls are done on the UI thread but do their work on the DB
// thread. So wait for it.
BrowserThread::PostTaskAndReply(
- BrowserThread::DB, FROM_HERE,
- base::Bind(&base::DoNothing),
+ BrowserThread::DB, FROM_HERE, base::Bind(&base::DoNothing),
base::Bind(&BrowsingDataRemover::OnClearedAutofillOriginURLs,
- base::Unretained(this)));
+ weak_ptr_factory_.GetWeakPtr()));
autofill::PersonalDataManager* data_manager =
autofill::PersonalDataManagerFactory::GetForProfile(profile_);
@@ -415,14 +509,13 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
#if defined(ENABLE_WEBRTC)
waiting_for_clear_webrtc_logs_ = true;
BrowserThread::PostTaskAndReply(
- BrowserThread::FILE,
- FROM_HERE,
+ BrowserThread::FILE, FROM_HERE,
base::Bind(
&WebRtcLogUtil::DeleteOldAndRecentWebRtcLogFiles,
WebRtcLogList::GetWebRtcLogDirectoryForProfile(profile_->GetPath()),
delete_begin_),
base::Bind(&BrowsingDataRemover::OnClearedWebRtcLogs,
- base::Unretained(this)));
+ weak_ptr_factory_.GetWeakPtr()));
#endif
// The SSL Host State that tracks SSL interstitial "proceed" decisions may
@@ -440,10 +533,9 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
// The above calls are done on the UI thread but do their work on the DB
// thread. So wait for it.
BrowserThread::PostTaskAndReply(
- BrowserThread::DB, FROM_HERE,
- base::Bind(&base::DoNothing),
+ BrowserThread::DB, FROM_HERE, base::Bind(&base::DoNothing),
base::Bind(&BrowsingDataRemover::OnClearedPrecacheHistory,
- base::Unretained(this)));
+ weak_ptr_factory_.GetWeakPtr()));
}
#endif
@@ -499,13 +591,16 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
safe_browsing::SafeBrowsingService* sb_service =
g_browser_process->safe_browsing_service();
if (sb_service) {
- net::URLRequestContextGetter* sb_context =
+ scoped_refptr<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)));
+ base::Bind(&ClearCookiesOnIOThread, delete_begin_, delete_end_,
+ std::move(sb_context),
+ UIThreadTrampoline(
+ base::Bind(&BrowsingDataRemover::OnClearedCookies,
+ weak_ptr_factory_.GetWeakPtr()))));
}
}
@@ -522,13 +617,16 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
content::RecordAction(
UserMetricsAction("ClearBrowsingData_ChannelIDs"));
// Since we are running on the UI thread don't call GetURLRequestContext().
- net::URLRequestContextGetter* rq_context = profile_->GetRequestContext();
+ scoped_refptr<net::URLRequestContextGetter> rq_context =
+ profile_->GetRequestContext();
if (rq_context) {
waiting_for_clear_channel_ids_ = true;
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
- base::Bind(&BrowsingDataRemover::ClearChannelIDsOnIOThread,
- base::Unretained(this), base::Unretained(rq_context)));
+ base::Bind(&ClearChannelIDsOnIOThread, delete_begin_, delete_end_,
+ std::move(rq_context),
+ base::Bind(&BrowsingDataRemover::OnClearedChannelIDs,
+ weak_ptr_factory_.GetWeakPtr())));
}
}
@@ -570,14 +668,14 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
content::RecordAction(UserMetricsAction("ClearBrowsingData_LSOData"));
waiting_for_clear_plugin_data_ = true;
- if (!plugin_data_remover_.get())
- plugin_data_remover_.reset(content::PluginDataRemover::Create(profile_));
+ DCHECK(!plugin_data_remover_);
+ plugin_data_remover_.reset(content::PluginDataRemover::Create(profile_));
base::WaitableEvent* event =
plugin_data_remover_->StartRemoving(delete_begin_);
base::WaitableEventWatcher::EventCallback watcher_callback =
base::Bind(&BrowsingDataRemover::OnWaitableEventSignaled,
- base::Unretained(this));
+ weak_ptr_factory_.GetWeakPtr());
watcher_.StartWatching(event, watcher_callback);
}
#endif
@@ -603,7 +701,7 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
password_store->RemoveLoginsCreatedBetween(
delete_begin_, delete_end_,
base::Bind(&BrowsingDataRemover::OnClearedPasswords,
- base::Unretained(this)));
+ weak_ptr_factory_.GetWeakPtr()));
}
}
@@ -617,7 +715,7 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
password_store->RemoveStatisticsCreatedBetween(
delete_begin_, delete_end_,
base::Bind(&BrowsingDataRemover::OnClearedPasswordsStats,
- base::Unretained(this)));
+ weak_ptr_factory_.GetWeakPtr()));
}
}
@@ -636,10 +734,9 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
// The above calls are done on the UI thread but do their work on the DB
// thread. So wait for it.
BrowserThread::PostTaskAndReply(
- BrowserThread::DB, FROM_HERE,
- base::Bind(&base::DoNothing),
+ BrowserThread::DB, FROM_HERE, base::Bind(&base::DoNothing),
base::Bind(&BrowsingDataRemover::OnClearedFormData,
- base::Unretained(this)));
+ weak_ptr_factory_.GetWeakPtr()));
autofill::PersonalDataManager* data_manager =
autofill::PersonalDataManagerFactory::GetForProfile(profile_);
@@ -660,21 +757,25 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
BrowserContext::GetDefaultStoragePartition(profile_), delete_begin_,
delete_end_)
->Remove(base::Bind(&BrowsingDataRemover::ClearedCache,
- base::Unretained(this)));
+ weak_ptr_factory_.GetWeakPtr()));
#if !defined(DISABLE_NACL)
waiting_for_clear_nacl_cache_ = true;
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
- base::Bind(&BrowsingDataRemover::ClearNaClCacheOnIOThread,
- base::Unretained(this)));
+ base::Bind(&ClearNaClCacheOnIOThread,
+ UIThreadTrampoline(
+ base::Bind(&BrowsingDataRemover::ClearedNaClCache,
+ weak_ptr_factory_.GetWeakPtr()))));
waiting_for_clear_pnacl_cache_ = true;
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
- base::Bind(&BrowsingDataRemover::ClearPnaclCacheOnIOThread,
- base::Unretained(this), delete_begin_, delete_end_));
+ base::Bind(&ClearPnaclCacheOnIOThread, delete_begin_, delete_end_,
+ UIThreadTrampoline(
+ base::Bind(&BrowsingDataRemover::ClearedPnaclCache,
+ weak_ptr_factory_.GetWeakPtr()))));
#endif
// The PrerenderManager may have a page actively being prerendered, which
@@ -726,7 +827,7 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
base::Bind(&DoesOriginMatchMask, origin_type_mask_), delete_begin_,
delete_end_,
base::Bind(&BrowsingDataRemover::OnClearedStoragePartitionData,
- base::Unretained(this)));
+ weak_ptr_factory_.GetWeakPtr()));
}
#if defined(ENABLE_PLUGINS)
@@ -748,13 +849,13 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
if (!user) {
LOG(WARNING) << "Failed to find user for current profile.";
} else {
- chromeos::DBusThreadManager::Get()->GetCryptohomeClient()->
- TpmAttestationDeleteKeys(
- chromeos::attestation::KEY_USER,
- user->email(),
+ chromeos::DBusThreadManager::Get()
+ ->GetCryptohomeClient()
+ ->TpmAttestationDeleteKeys(
+ chromeos::attestation::KEY_USER, user->email(),
chromeos::attestation::kContentProtectionKeyPrefix,
base::Bind(&BrowsingDataRemover::OnClearPlatformKeys,
- base::Unretained(this)));
+ weak_ptr_factory_.GetWeakPtr()));
waiting_for_clear_platform_keys_ = true;
}
#endif
@@ -771,7 +872,7 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
profile_->ClearNetworkingHistorySince(
delete_begin_,
base::Bind(&BrowsingDataRemover::OnClearedNetworkingHistory,
- base::Unretained(this)));
+ weak_ptr_factory_.GetWeakPtr()));
if (remove_mask & (REMOVE_COOKIES | REMOVE_HISTORY)) {
domain_reliability::DomainReliabilityService* service =
@@ -788,7 +889,7 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
service->ClearBrowsingData(
mode,
base::Bind(&BrowsingDataRemover::OnClearedDomainReliabilityMonitor,
- base::Unretained(this)));
+ weak_ptr_factory_.GetWeakPtr()));
}
}
@@ -797,15 +898,15 @@ void BrowsingDataRemover::RemoveImpl(int remove_mask,
waiting_for_clear_webapp_data_ = true;
WebappRegistry::UnregisterWebapps(
base::Bind(&BrowsingDataRemover::OnClearedWebappData,
- base::Unretained(this)));
+ weak_ptr_factory_.GetWeakPtr()));
}
if ((remove_mask & REMOVE_OFFLINE_PAGE_DATA) &&
offline_pages::IsOfflinePagesEnabled()) {
waiting_for_clear_offline_page_data_ = true;
- offline_pages::OfflinePageModelFactory::GetForBrowserContext(profile_)->
- ClearAll(base::Bind(&BrowsingDataRemover::OnClearedOfflinePageData,
- base::Unretained(this)));
+ offline_pages::OfflinePageModelFactory::GetForBrowserContext(profile_)
+ ->ClearAll(base::Bind(&BrowsingDataRemover::OnClearedOfflinePageData,
+ weak_ptr_factory_.GetWeakPtr()));
}
#endif
@@ -832,11 +933,6 @@ void BrowsingDataRemover::RemoveObserver(Observer* observer) {
observer_list_.RemoveObserver(observer);
}
-void BrowsingDataRemover::OnHistoryDeletionDone() {
- waiting_for_clear_history_ = false;
- NotifyAndDeleteIfDone();
-}
-
void BrowsingDataRemover::OverrideStoragePartitionForTesting(
content::StoragePartition* storage_partition) {
storage_partition_for_testing_ = storage_partition;
@@ -862,9 +958,6 @@ base::Time BrowsingDataRemover::CalculateBeginDeleteTime(
case EVERYTHING:
delete_begin_time = base::Time();
break;
- default:
- NOTREACHED() << L"Missing item";
- break;
}
return delete_begin_time - diff;
}
@@ -907,11 +1000,11 @@ void BrowsingDataRemover::OnKeywordsLoaded() {
model->RemoveAutoGeneratedBetween(delete_begin_, delete_end_);
waiting_for_clear_keyword_data_ = false;
template_url_sub_.reset();
- NotifyAndDeleteIfDone();
+ NotifyIfDone();
}
-void BrowsingDataRemover::NotifyAndDelete() {
- set_removing(false);
+void BrowsingDataRemover::Notify() {
+ SetRemoving(false);
// Notify observers.
BrowsingDataRemover::NotificationDetails details(delete_begin_, remove_mask_,
@@ -920,13 +1013,9 @@ void BrowsingDataRemover::NotifyAndDelete() {
GetOnBrowsingDataRemovedCallbacks()->Notify(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.
- base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
}
-void BrowsingDataRemover::NotifyAndDeleteIfDone() {
+void BrowsingDataRemover::NotifyIfDone() {
// TODO(brettw) http://crbug.com/305259: This should also observe session
// clearing (what about other things such as passwords, etc.?) and wait for
// them to complete before continuing.
@@ -936,135 +1025,68 @@ void BrowsingDataRemover::NotifyAndDeleteIfDone() {
if (completion_inhibitor_) {
completion_inhibitor_->OnBrowsingDataRemoverWouldComplete(
- this,
- base::Bind(&BrowsingDataRemover::NotifyAndDelete,
- base::Unretained(this)));
- } else {
- NotifyAndDelete();
+ this, base::Bind(&BrowsingDataRemover::Notify,
+ weak_ptr_factory_.GetWeakPtr()));
+ return;
}
+
+ Notify();
}
-void BrowsingDataRemover::OnClearedHostnameResolutionCache() {
+void BrowsingDataRemover::OnHistoryDeletionDone() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- waiting_for_clear_hostname_resolution_cache_ = false;
- NotifyAndDeleteIfDone();
+ waiting_for_clear_history_ = false;
+ NotifyIfDone();
}
-void BrowsingDataRemover::ClearHostnameResolutionCacheOnIOThread(
- IOThread* io_thread) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
- io_thread->ClearHostCache();
-
- // Notify the UI thread that we are done.
- BrowserThread::PostTask(
- BrowserThread::UI,
- FROM_HERE,
- base::Bind(&BrowsingDataRemover::OnClearedHostnameResolutionCache,
- base::Unretained(this)));
+void BrowsingDataRemover::OnClearedHostnameResolutionCache() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ waiting_for_clear_hostname_resolution_cache_ = false;
+ NotifyIfDone();
}
void BrowsingDataRemover::OnClearedNetworkPredictor() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
waiting_for_clear_network_predictor_ = false;
- NotifyAndDeleteIfDone();
-}
-
-void BrowsingDataRemover::ClearNetworkPredictorOnIOThread(
- chrome_browser_net::Predictor* predictor) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- DCHECK(predictor);
-
- predictor->DiscardInitialNavigationHistory();
- predictor->DiscardAllResults();
-
- // Notify the UI thread that we are done.
- BrowserThread::PostTask(
- BrowserThread::UI,
- FROM_HERE,
- base::Bind(&BrowsingDataRemover::OnClearedNetworkPredictor,
- base::Unretained(this)));
+ NotifyIfDone();
}
void BrowsingDataRemover::OnClearedNetworkingHistory() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
waiting_for_clear_networking_history_ = false;
- NotifyAndDeleteIfDone();
+ NotifyIfDone();
}
void BrowsingDataRemover::ClearedCache() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
waiting_for_clear_cache_ = false;
-
- NotifyAndDeleteIfDone();
+ NotifyIfDone();
}
#if !defined(DISABLE_NACL)
void BrowsingDataRemover::ClearedNaClCache() {
- // This function should be called on the UI thread.
DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
waiting_for_clear_nacl_cache_ = false;
-
- NotifyAndDeleteIfDone();
-}
-
-void BrowsingDataRemover::ClearedNaClCacheOnIOThread() {
- // This function should be called on the IO thread.
- DCHECK_CURRENTLY_ON(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_CURRENTLY_ON(BrowserThread::IO);
-
- nacl::NaClBrowser::GetInstance()->ClearValidationCache(
- base::Bind(&BrowsingDataRemover::ClearedNaClCacheOnIOThread,
- base::Unretained(this)));
+ NotifyIfDone();
}
void BrowsingDataRemover::ClearedPnaclCache() {
- // This function should be called on the UI thread.
DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
waiting_for_clear_pnacl_cache_ = false;
-
- NotifyAndDeleteIfDone();
-}
-
-void BrowsingDataRemover::ClearedPnaclCacheOnIOThread() {
- // This function should be called on the IO thread.
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
- // Notify the UI thread that we are done.
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&BrowsingDataRemover::ClearedPnaclCache,
- base::Unretained(this)));
-}
-
-void BrowsingDataRemover::ClearPnaclCacheOnIOThread(base::Time begin,
- base::Time end) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
- pnacl::PnaclHost::GetInstance()->ClearTranslationCacheEntriesBetween(
- begin, end,
- base::Bind(&BrowsingDataRemover::ClearedPnaclCacheOnIOThread,
- base::Unretained(this)));
+ NotifyIfDone();
}
#endif
+#if defined(ENABLE_PLUGINS)
void BrowsingDataRemover::OnWaitableEventSignaled(
base::WaitableEvent* waitable_event) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
waiting_for_clear_plugin_data_ = false;
- NotifyAndDeleteIfDone();
+ plugin_data_remover_.reset();
+ watcher_.StopWatching();
+ NotifyIfDone();
}
-#if defined(ENABLE_PLUGINS)
void BrowsingDataRemover::OnDeauthorizeContentLicensesCompleted(
uint32_t request_id,
bool /* success */) {
@@ -1072,7 +1094,7 @@ void BrowsingDataRemover::OnDeauthorizeContentLicensesCompleted(
DCHECK_EQ(request_id, deauthorize_content_licenses_request_id_);
waiting_for_clear_content_licenses_ = false;
- NotifyAndDeleteIfDone();
+ NotifyIfDone();
}
#endif
@@ -1081,11 +1103,10 @@ void BrowsingDataRemover::OnClearPlatformKeys(
chromeos::DBusMethodCallStatus call_status,
bool result) {
DCHECK(waiting_for_clear_platform_keys_);
- if (call_status != chromeos::DBUS_METHOD_CALL_SUCCESS || !result) {
- LOG(ERROR) << "Failed to clear platform keys.";
- }
+ LOG_IF(ERROR, call_status != chromeos::DBUS_METHOD_CALL_SUCCESS || !result)
+ << "Failed to clear platform keys.";
waiting_for_clear_platform_keys_ = false;
- NotifyAndDeleteIfDone();
+ NotifyIfDone();
}
#endif
@@ -1093,94 +1114,52 @@ void BrowsingDataRemover::OnClearPlatformKeys(
void BrowsingDataRemover::OnClearedPasswords() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
waiting_for_clear_passwords_ = false;
- NotifyAndDeleteIfDone();
+ NotifyIfDone();
}
void BrowsingDataRemover::OnClearedPasswordsStats() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
waiting_for_clear_passwords_stats_ = false;
- NotifyAndDeleteIfDone();
+ NotifyIfDone();
}
-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;
- }
+void BrowsingDataRemover::OnClearedCookies() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
DCHECK_GT(waiting_for_clear_cookies_count_, 0);
--waiting_for_clear_cookies_count_;
- NotifyAndDeleteIfDone();
-}
-
-void BrowsingDataRemover::ClearCookiesOnIOThread(
- net::URLRequestContextGetter* rq_context) {
- DCHECK_CURRENTLY_ON(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::ClearChannelIDsOnIOThread(
- net::URLRequestContextGetter* rq_context) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- net::ChannelIDService* channel_id_service =
- rq_context->GetURLRequestContext()->channel_id_service();
- channel_id_service->GetChannelIDStore()->DeleteAllCreatedBetween(
- delete_begin_, delete_end_,
- base::Bind(&BrowsingDataRemover::OnClearedChannelIDsOnIOThread,
- base::Unretained(this), base::Unretained(rq_context)));
-}
-
-void BrowsingDataRemover::OnClearedChannelIDsOnIOThread(
- net::URLRequestContextGetter* rq_context) {
- // Need to close open SSL connections which may be using the channel ids we
- // are deleting.
- // TODO(mattm): http://crbug.com/166069 Make the server bound cert
- // service/store have observers that can notify relevant things directly.
- rq_context->GetURLRequestContext()->ssl_config_service()->
- NotifySSLConfigChange();
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&BrowsingDataRemover::OnClearedChannelIDs,
- base::Unretained(this)));
+ NotifyIfDone();
}
void BrowsingDataRemover::OnClearedChannelIDs() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
waiting_for_clear_channel_ids_ = false;
- NotifyAndDeleteIfDone();
+ NotifyIfDone();
}
void BrowsingDataRemover::OnClearedFormData() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
waiting_for_clear_form_ = false;
- NotifyAndDeleteIfDone();
+ NotifyIfDone();
}
void BrowsingDataRemover::OnClearedAutofillOriginURLs() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
waiting_for_clear_autofill_origin_urls_ = false;
- NotifyAndDeleteIfDone();
+ NotifyIfDone();
}
void BrowsingDataRemover::OnClearedStoragePartitionData() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
waiting_for_clear_storage_partition_data_ = false;
- NotifyAndDeleteIfDone();
+ NotifyIfDone();
}
#if defined(ENABLE_WEBRTC)
void BrowsingDataRemover::OnClearedWebRtcLogs() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
waiting_for_clear_webrtc_logs_ = false;
- NotifyAndDeleteIfDone();
+ NotifyIfDone();
}
#endif
@@ -1188,26 +1167,26 @@ void BrowsingDataRemover::OnClearedWebRtcLogs() {
void BrowsingDataRemover::OnClearedPrecacheHistory() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
waiting_for_clear_precache_history_ = false;
- NotifyAndDeleteIfDone();
+ NotifyIfDone();
}
void BrowsingDataRemover::OnClearedWebappData() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
waiting_for_clear_webapp_data_ = false;
- NotifyAndDeleteIfDone();
+ NotifyIfDone();
}
void BrowsingDataRemover::OnClearedOfflinePageData() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
waiting_for_clear_offline_page_data_ = false;
- NotifyAndDeleteIfDone();
+ NotifyIfDone();
}
#endif
void BrowsingDataRemover::OnClearedDomainReliabilityMonitor() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
waiting_for_clear_domain_reliability_monitor_ = false;
- NotifyAndDeleteIfDone();
+ NotifyIfDone();
}
// static
diff --git a/chrome/browser/browsing_data/browsing_data_remover.h b/chrome/browser/browsing_data/browsing_data_remover.h
index de7414e..c54c63c 100644
--- a/chrome/browser/browsing_data/browsing_data_remover.h
+++ b/chrome/browser/browsing_data/browsing_data_remover.h
@@ -12,6 +12,7 @@
#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/prefs/pref_member.h"
#include "base/sequenced_task_runner_helpers.h"
@@ -19,16 +20,22 @@
#include "base/task/cancelable_task_tracker.h"
#include "base/time/time.h"
#include "build/build_config.h"
-#include "chrome/browser/pepper_flash_settings_manager.h"
#include "chrome/common/features.h"
+#include "components/keyed_service/core/keyed_service.h"
#include "components/search_engines/template_url_service.h"
-#if defined(OS_CHROMEOS)
-#include "chromeos/dbus/dbus_method_call_status.h"
-#endif
#include "storage/common/quota/quota_types.h"
#include "url/gurl.h"
#include "url/origin.h"
+#if defined(ENABLE_PLUGINS)
+#include "chrome/browser/pepper_flash_settings_manager.h"
+#endif
+
+#if defined(OS_CHROMEOS)
+#include "chromeos/dbus/dbus_method_call_status.h"
+#endif
+
+class BrowsingDataRemoverFactory;
class IOThread;
class Profile;
@@ -37,6 +44,7 @@ class Predictor;
}
namespace content {
+class BrowserContext;
class PluginDataRemover;
class StoragePartition;
}
@@ -47,12 +55,11 @@ class URLRequestContextGetter;
// BrowsingDataRemover is responsible for removing data related to browsing:
// visits in url database, downloads, cookies ...
-
-class BrowsingDataRemover
+class BrowsingDataRemover : public KeyedService
#if defined(ENABLE_PLUGINS)
- : public PepperFlashSettingsManager::Client
+ , public PepperFlashSettingsManager::Client
#endif
- {
+{
public:
// Time period ranges available when doing browsing data removals.
enum TimePeriod {
@@ -162,6 +169,13 @@ class BrowsingDataRemover
int origin_type_mask;
};
+ struct TimeRange {
+ TimeRange(base::Time begin, base::Time end) : begin(begin), end(end) {}
+
+ base::Time begin;
+ base::Time end;
+ };
+
// Observer is notified when the removal is done. Done means keywords have
// been deleted, cache cleared and all other tasks scheduled.
class Observer {
@@ -192,33 +206,20 @@ class BrowsingDataRemover
virtual ~CompletionInhibitor() {}
};
- // Creates a BrowsingDataRemover object that removes data regardless of the
- // time it was last modified. Returns a raw pointer, as BrowsingDataRemover
- // retains ownership of itself, and deletes itself once finished.
- static BrowsingDataRemover* CreateForUnboundedRange(Profile* profile);
+ static TimeRange Unbounded();
- // Creates a BrowsingDataRemover object bound on both sides by a time. Returns
- // a raw pointer, as BrowsingDataRemover retains ownership of itself, and
- // deletes itself once finished.
- static BrowsingDataRemover* CreateForRange(Profile* profile,
- base::Time delete_begin,
- base::Time delete_end);
-
- // Creates a BrowsingDataRemover bound to a specific period of time (as
- // defined via a TimePeriod). Returns a raw pointer, as BrowsingDataRemover
- // retains ownership of itself, and deletes itself once finished.
- static BrowsingDataRemover* CreateForPeriod(Profile* profile,
- TimePeriod period);
+ static TimeRange Period(TimePeriod period);
// Calculate the begin time for the deletion range specified by |time_period|.
static base::Time CalculateBeginDeleteTime(TimePeriod time_period);
// Is the BrowsingDataRemover currently in the process of removing data?
- static bool is_removing() { return is_removing_; }
+ bool is_removing() { return is_removing_; }
// Sets a CompletionInhibitor, which will be notified each time an instance is
// about to complete a browsing data removal process, and will be able to
// artificially delay the completion.
+ // TODO(crbug.com/483528): Make this non-static.
static void set_completion_inhibitor_for_testing(
CompletionInhibitor* inhibitor) {
completion_inhibitor_ = inhibitor;
@@ -227,19 +228,20 @@ class BrowsingDataRemover
// Add a callback to the list of callbacks to be called during a browsing data
// removal event. Returns a subscription object that can be used to
// un-register the callback.
+ // TODO(crbug.com/483528): Make this non-static and merge it with the Observer
+ // interface.
static CallbackSubscription RegisterOnBrowsingDataRemovedCallback(
const Callback& callback);
// Removes the specified items related to browsing for all origins that match
// the provided |origin_type_mask| (see BrowsingDataHelper::OriginTypeMask).
- void Remove(int remove_mask, int origin_type_mask);
+ void Remove(const TimeRange& time_range,
+ int remove_mask,
+ int origin_type_mask);
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
- // Called when history deletion is done.
- void OnHistoryDeletionDone();
-
// Used for testing.
void OverrideStoragePartitionForTesting(
content::StoragePartition* storage_partition);
@@ -257,37 +259,27 @@ class BrowsingDataRemover
// TODO(mkwst): See http://crbug.com/113621
friend class BrowsingDataRemoverTest;
- // Setter for |is_removing_|; DCHECKs that we can only start removing if we're
- // not already removing, and vice-versa.
- static void set_removing(bool is_removing);
+ friend class BrowsingDataRemoverFactory;
- // Creates a BrowsingDataRemover to remove browser data from the specified
- // profile in the specified time range. Use Remove to initiate the removal.
- BrowsingDataRemover(Profile* profile,
- base::Time delete_begin,
- base::Time delete_end);
+ // Use BrowsingDataRemoverFactory::GetForBrowserContext to get an instance of
+ // this class.
+ BrowsingDataRemover(content::BrowserContext* browser_context);
+ ~BrowsingDataRemover() override;
- // BrowsingDataRemover deletes itself (using DeleteHelper) and is not supposed
- // to be deleted by other objects so make destructor private and DeleteHelper
- // a friend.
- friend class base::DeleteHelper<BrowsingDataRemover>;
+ void Shutdown() override;
- // When plugins aren't enabled, there is no base class, so adding an override
- // specifier would result in a compile error.
-#if defined(ENABLE_PLUGINS)
- ~BrowsingDataRemover() override;
-#else
- ~BrowsingDataRemover();
-#endif
+ // Setter for |is_removing_|; DCHECKs that we can only start removing if we're
+ // not already removing, and vice-versa.
+ void SetRemoving(bool is_removing);
// Callback for when TemplateURLService has finished loading. Clears the data,
- // clears the respective waiting flag, and invokes NotifyAndDeleteIfDone.
+ // clears the respective waiting flag, and invokes NotifyIfDone.
void OnKeywordsLoaded();
- // Called when plugin data has been cleared. Invokes NotifyAndDeleteIfDone.
+#if defined(ENABLE_PLUGINS)
+ // Called when plugin data has been cleared. Invokes NotifyIfDone.
void OnWaitableEventSignaled(base::WaitableEvent* waitable_event);
-#if defined(ENABLE_PLUGINS)
// PepperFlashSettingsManager::Client implementation.
void OnDeauthorizeContentLicensesCompleted(uint32_t request_id,
bool success) override;
@@ -305,60 +297,45 @@ class BrowsingDataRemover
// TODO(mkwst): The current implementation relies on unique (empty) origins to
// signal removal of all origins. Reconsider this behavior if/when we build
// a "forget this site" feature.
- void RemoveImpl(int remove_mask,
+ void RemoveImpl(const TimeRange& time_range,
+ int remove_mask,
const GURL& remove_url,
int origin_type_mask);
- // Notifies observers and deletes this object.
- void NotifyAndDelete();
+ // Notifies observers and transitions to the idle state.
+ void Notify();
- // Checks if we are all done, and if so, calls NotifyAndDelete().
- void NotifyAndDeleteIfDone();
+ // Checks if we are all done, and if so, calls Notify().
+ void NotifyIfDone();
+
+ // Called when history deletion is done.
+ void OnHistoryDeletionDone();
// Callback for when the hostname resolution cache has been cleared.
- // Clears the respective waiting flag and invokes NotifyAndDeleteIfDone.
+ // Clears the respective waiting flag and invokes NotifyIfDone.
void OnClearedHostnameResolutionCache();
- // Invoked on the IO thread to clear the hostname resolution cache.
- void ClearHostnameResolutionCacheOnIOThread(IOThread* io_thread);
-
// Callback for when speculative data in the network Predictor has been
// cleared. Clears the respective waiting flag and invokes
- // NotifyAndDeleteIfDone.
+ // NotifyIfDone.
void OnClearedNetworkPredictor();
- // Invoked on the IO thread to clear speculative data related to hostname
- // pre-resolution from the network Predictor.
- void ClearNetworkPredictorOnIOThread(
- chrome_browser_net::Predictor* predictor);
-
// Callback for when network related data in ProfileIOData has been cleared.
- // Clears the respective waiting flag and invokes NotifyAndDeleteIfDone.
+ // Clears the respective waiting flag and invokes NotifyIfDone.
void OnClearedNetworkingHistory();
// Callback for when the cache has been deleted. Invokes
- // NotifyAndDeleteIfDone.
+ // NotifyIfDone.
void ClearedCache();
#if !defined(DISABLE_NACL)
// Callback for when the NaCl cache has been deleted. Invokes
- // NotifyAndDeleteIfDone.
+ // NotifyIfDone.
void ClearedNaClCache();
- // Invokes the ClearedNaClCache on the UI thread.
- void ClearedNaClCacheOnIOThread();
-
- // Invoked on the IO thread to delete the NaCl cache.
- void ClearNaClCacheOnIOThread();
-
// Callback for when the PNaCl translation cache has been deleted. Invokes
- // NotifyAndDeleteIfDone.
+ // NotifyIfDone.
void ClearedPnaclCache();
- // Invokes ClearedPnaclCacheOn on the UI thread.
- void ClearedPnaclCacheOnIOThread();
-
- // Invoked on the IO thread to delete entries in the PNaCl translation cache.
- void ClearPnaclCacheOnIOThread(base::Time begin, base::Time end);
#endif
// Callback for when passwords for the requested time range have been cleared.
@@ -368,23 +345,11 @@ class BrowsingDataRemover
// cleared.
void OnClearedPasswordsStats();
- // Callback for when Cookies has been deleted. Invokes NotifyAndDeleteIfDone.
- void OnClearedCookies(int num_deleted);
-
- // Invoked on the IO thread to delete cookies.
- void ClearCookiesOnIOThread(net::URLRequestContextGetter* rq_context);
-
- // Invoked on the IO thread to delete channel IDs.
- void ClearChannelIDsOnIOThread(
- net::URLRequestContextGetter* rq_context);
-
- // Callback on IO Thread when channel IDs have been deleted. Clears SSL
- // connection pool and posts to UI thread to run OnClearedChannelIDs.
- void OnClearedChannelIDsOnIOThread(
- net::URLRequestContextGetter* rq_context);
+ // Callback for when cookies have been deleted. Invokes NotifyIfDone.
+ void OnClearedCookies();
// Callback for when channel IDs have been deleted. Invokes
- // NotifyAndDeleteIfDone.
+ // NotifyIfDone.
void OnClearedChannelIDs();
// Callback from the above method.
@@ -422,13 +387,13 @@ class BrowsingDataRemover
Profile* profile_;
// Start time to delete from.
- const base::Time delete_begin_;
+ base::Time delete_begin_;
// End time to delete to.
base::Time delete_end_;
// True if Remove has been invoked.
- static bool is_removing_;
+ bool is_removing_;
// If non-NULL, the |completion_inhibitor_| is notified each time an instance
// is about to complete a browsing data removal process, and has the ability
@@ -486,7 +451,7 @@ class BrowsingDataRemover
// From which types of origins should we remove data?
int origin_type_mask_ = 0;
- base::ObserverList<Observer> observer_list_;
+ base::ObserverList<Observer, true> observer_list_;
// Used if we need to clear history.
base::CancelableTaskTracker history_task_tracker_;
@@ -496,6 +461,8 @@ class BrowsingDataRemover
// We do not own this.
content::StoragePartition* storage_partition_for_testing_ = nullptr;
+ base::WeakPtrFactory<BrowsingDataRemover> weak_ptr_factory_;
+
DISALLOW_COPY_AND_ASSIGN(BrowsingDataRemover);
};
diff --git a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
index 38310b5..b9321b6 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
@@ -9,6 +9,7 @@
#include "base/prefs/pref_service.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/browsing_data/browsing_data_remover_test_util.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/profiles/profile.h"
@@ -87,10 +88,11 @@ class BrowsingDataRemoverBrowserTest : public InProcessBrowserTest {
}
void RemoveAndWait(int remove_mask) {
- BrowsingDataRemover* remover = BrowsingDataRemover::CreateForPeriod(
- browser()->profile(), BrowsingDataRemover::LAST_HOUR);
+ BrowsingDataRemover* remover =
+ BrowsingDataRemoverFactory::GetForBrowserContext(browser()->profile());
BrowsingDataRemoverCompletionObserver completion_observer(remover);
- remover->Remove(remove_mask, BrowsingDataHelper::UNPROTECTED_WEB);
+ remover->Remove(BrowsingDataRemover::Period(BrowsingDataRemover::LAST_HOUR),
+ remove_mask, BrowsingDataHelper::UNPROTECTED_WEB);
completion_observer.BlockUntilCompletion();
}
};
diff --git a/chrome/browser/browsing_data/browsing_data_remover_factory.cc b/chrome/browser/browsing_data/browsing_data_remover_factory.cc
new file mode 100644
index 0000000..57aa4ab
--- /dev/null
+++ b/chrome/browser/browsing_data/browsing_data_remover_factory.cc
@@ -0,0 +1,97 @@
+// Copyright 2016 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/browsing_data_remover_factory.h"
+
+#include "base/memory/singleton.h"
+#include "chrome/browser/autofill/personal_data_manager_factory.h"
+#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/domain_reliability/service_factory.h"
+#include "chrome/browser/history/history_service_factory.h"
+#include "chrome/browser/history/web_history_service_factory.h"
+#include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings_factory.h"
+#include "chrome/browser/password_manager/password_store_factory.h"
+#include "chrome/browser/prerender/prerender_manager_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/search_engines/template_url_service_factory.h"
+#include "chrome/browser/sessions/tab_restore_service_factory.h"
+#include "chrome/browser/web_data_service_factory.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/power/origin_power_map_factory.h"
+#include "content/public/browser/browser_context.h"
+
+#if BUILDFLAG(ANDROID_JAVA_UI)
+#include "chrome/browser/android/offline_pages/offline_page_model_factory.h"
+#include "chrome/browser/precache/precache_manager_factory.h"
+#endif
+
+#if defined(ENABLE_EXTENSIONS)
+#include "chrome/browser/extensions/activity_log/activity_log.h"
+#include "extensions/browser/extension_prefs_factory.h"
+#endif
+
+#if defined(ENABLE_SESSION_SERVICE)
+#include "chrome/browser/sessions/session_service_factory.h"
+#endif
+
+// static
+BrowsingDataRemoverFactory* BrowsingDataRemoverFactory::GetInstance() {
+ return base::Singleton<BrowsingDataRemoverFactory>::get();
+}
+
+// static
+BrowsingDataRemover* BrowsingDataRemoverFactory::GetForBrowserContext(
+ content::BrowserContext* context) {
+ return static_cast<BrowsingDataRemover*>(
+ GetInstance()->GetServiceForBrowserContext(context, true));
+}
+
+BrowsingDataRemoverFactory::BrowsingDataRemoverFactory()
+ : BrowserContextKeyedServiceFactory(
+ "BrowsingDataRemover",
+ BrowserContextDependencyManager::GetInstance()) {
+ DependsOn(autofill::PersonalDataManagerFactory::GetInstance());
+ DependsOn(DataReductionProxyChromeSettingsFactory::GetInstance());
+ DependsOn(domain_reliability::DomainReliabilityServiceFactory::GetInstance());
+ DependsOn(HistoryServiceFactory::GetInstance());
+ DependsOn(HostContentSettingsMapFactory::GetInstance());
+ DependsOn(PasswordStoreFactory::GetInstance());
+ DependsOn(power::OriginPowerMapFactory::GetInstance());
+ DependsOn(prerender::PrerenderManagerFactory::GetInstance());
+ DependsOn(TabRestoreServiceFactory::GetInstance());
+ DependsOn(TemplateURLServiceFactory::GetInstance());
+ DependsOn(WebDataServiceFactory::GetInstance());
+ DependsOn(WebHistoryServiceFactory::GetInstance());
+
+#if BUILDFLAG(ANDROID_JAVA_UI)
+ DependsOn(offline_pages::OfflinePageModelFactory::GetInstance());
+ DependsOn(precache::PrecacheManagerFactory::GetInstance());
+#endif
+
+#if defined(ENABLE_EXTENSIONS)
+ DependsOn(extensions::ActivityLog::GetFactoryInstance());
+ DependsOn(extensions::ExtensionPrefsFactory::GetInstance());
+#endif
+
+#if defined(ENABLE_SESSION_SERVICE)
+ DependsOn(SessionServiceFactory::GetInstance());
+#endif
+}
+
+BrowsingDataRemoverFactory::~BrowsingDataRemoverFactory() {}
+
+content::BrowserContext* BrowsingDataRemoverFactory::GetBrowserContextToUse(
+ content::BrowserContext* context) const {
+ // For guest profiles the browsing data is in the OTR profile.
+ Profile* profile = static_cast<Profile*>(context);
+ DCHECK(!profile->IsGuestSession() || profile->IsOffTheRecord());
+
+ return profile;
+}
+
+KeyedService* BrowsingDataRemoverFactory::BuildServiceInstanceFor(
+ content::BrowserContext* context) const {
+ return new BrowsingDataRemover(context);
+}
diff --git a/chrome/browser/browsing_data/browsing_data_remover_factory.h b/chrome/browser/browsing_data/browsing_data_remover_factory.h
new file mode 100644
index 0000000..4d24d07
--- /dev/null
+++ b/chrome/browser/browsing_data/browsing_data_remover_factory.h
@@ -0,0 +1,41 @@
+// Copyright 2016 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.
+
+#ifndef CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_FACTORY_H_
+#define CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_FACTORY_H_
+
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+
+namespace base {
+template <typename T>
+struct DefaultSingletonTraits;
+}
+
+class BrowsingDataRemover;
+
+class BrowsingDataRemoverFactory : public BrowserContextKeyedServiceFactory {
+ public:
+ // Returns the singleton instance of BrowsingDataRemoverFactory.
+ static BrowsingDataRemoverFactory* GetInstance();
+
+ // Returns the BrowsingDataRemover associated with |context|.
+ static BrowsingDataRemover* GetForBrowserContext(
+ content::BrowserContext* context);
+
+ private:
+ friend struct base::DefaultSingletonTraits<BrowsingDataRemoverFactory>;
+
+ BrowsingDataRemoverFactory();
+ ~BrowsingDataRemoverFactory() override;
+
+ // BrowserContextKeyedServiceFactory overrides:
+ content::BrowserContext* GetBrowserContextToUse(
+ content::BrowserContext* context) const override;
+ KeyedService* BuildServiceInstanceFor(
+ content::BrowserContext* context) const override;
+
+ DISALLOW_COPY_AND_ASSIGN(BrowsingDataRemoverFactory);
+};
+
+#endif // CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_FACTORY_H_
diff --git a/chrome/browser/browsing_data/browsing_data_remover_test_util.cc b/chrome/browser/browsing_data/browsing_data_remover_test_util.cc
index fa6f114..6a4b3c6 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_test_util.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover_test_util.cc
@@ -6,8 +6,8 @@
BrowsingDataRemoverCompletionObserver::BrowsingDataRemoverCompletionObserver(
BrowsingDataRemover* remover)
- : message_loop_runner_(new content::MessageLoopRunner) {
- remover->AddObserver(this);
+ : message_loop_runner_(new content::MessageLoopRunner), observer_(this) {
+ observer_.Add(remover);
}
BrowsingDataRemoverCompletionObserver::
@@ -18,6 +18,7 @@ void BrowsingDataRemoverCompletionObserver::BlockUntilCompletion() {
}
void BrowsingDataRemoverCompletionObserver::OnBrowsingDataRemoverDone() {
+ observer_.RemoveAll();
message_loop_runner_->Quit();
}
diff --git a/chrome/browser/browsing_data/browsing_data_remover_test_util.h b/chrome/browser/browsing_data/browsing_data_remover_test_util.h
index 30e2c59..6be9c48 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_test_util.h
+++ b/chrome/browser/browsing_data/browsing_data_remover_test_util.h
@@ -7,9 +7,12 @@
#include "base/macros.h"
#include "base/memory/ref_counted.h"
+#include "base/scoped_observer.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
#include "content/public/test/test_utils.h"
+// This class can be used to wait for a BrowsingDataRemover to complete
+// operation. It is not suitable for repeated use.
class BrowsingDataRemoverCompletionObserver
: public BrowsingDataRemover::Observer {
public:
@@ -24,6 +27,7 @@ class BrowsingDataRemoverCompletionObserver
private:
scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
+ ScopedObserver<BrowsingDataRemover, BrowsingDataRemover::Observer> observer_;
DISALLOW_COPY_AND_ASSIGN(BrowsingDataRemoverCompletionObserver);
};
diff --git a/chrome/browser/browsing_data/browsing_data_remover_unittest.cc b/chrome/browser/browsing_data/browsing_data_remover_unittest.cc
index 7284552..9a824c4 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_unittest.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover_unittest.cc
@@ -27,6 +27,7 @@
#include "chrome/browser/autofill/personal_data_manager_factory.h"
#include "chrome/browser/bookmarks/bookmark_model_factory.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/browsing_data/browsing_data_remover_test_util.h"
#include "chrome/browser/domain_reliability/service_factory.h"
#include "chrome/browser/download/chrome_download_manager_delegate.h"
@@ -911,21 +912,21 @@ class BrowsingDataRemoverTest : public testing::Test {
void BlockUntilBrowsingDataRemoved(BrowsingDataRemover::TimePeriod period,
int remove_mask,
bool include_protected_origins) {
- BrowsingDataRemover* remover = BrowsingDataRemover::CreateForPeriod(
- profile_.get(), period);
+ BrowsingDataRemover* remover =
+ BrowsingDataRemoverFactory::GetForBrowserContext(profile_.get());
TestStoragePartition storage_partition;
remover->OverrideStoragePartitionForTesting(&storage_partition);
called_with_details_.reset(new BrowsingDataRemover::NotificationDetails());
- // BrowsingDataRemover deletes itself when it completes.
int origin_type_mask = BrowsingDataHelper::UNPROTECTED_WEB;
if (include_protected_origins)
origin_type_mask |= BrowsingDataHelper::PROTECTED_WEB;
BrowsingDataRemoverCompletionObserver completion_observer(remover);
- remover->Remove(remove_mask, origin_type_mask);
+ remover->Remove(BrowsingDataRemover::Period(period), remove_mask,
+ origin_type_mask);
completion_observer.BlockUntilCompletion();
// Save so we can verify later.
@@ -936,17 +937,16 @@ class BrowsingDataRemoverTest : public testing::Test {
void BlockUntilOriginDataRemoved(BrowsingDataRemover::TimePeriod period,
int remove_mask,
const GURL& remove_origin) {
- BrowsingDataRemover* remover = BrowsingDataRemover::CreateForPeriod(
- profile_.get(), period);
+ BrowsingDataRemover* remover =
+ BrowsingDataRemoverFactory::GetForBrowserContext(profile_.get());
TestStoragePartition storage_partition;
remover->OverrideStoragePartitionForTesting(&storage_partition);
called_with_details_.reset(new BrowsingDataRemover::NotificationDetails());
- // BrowsingDataRemover deletes itself when it completes.
BrowsingDataRemoverCompletionObserver completion_observer(remover);
- remover->RemoveImpl(remove_mask, remove_origin,
- BrowsingDataHelper::UNPROTECTED_WEB);
+ remover->RemoveImpl(BrowsingDataRemover::Period(period), remove_mask,
+ remove_origin, BrowsingDataHelper::UNPROTECTED_WEB);
completion_observer.BlockUntilCompletion();
// Save so we can verify later.
@@ -958,6 +958,8 @@ class BrowsingDataRemoverTest : public testing::Test {
return profile_.get();
}
+ void DestroyProfile() { profile_.reset(); }
+
base::Time GetBeginTime() {
return called_with_details_->removal_begin;
}
@@ -1982,10 +1984,10 @@ TEST_F(BrowsingDataRemoverTest, CompletionInhibition) {
called_with_details_.reset(new BrowsingDataRemover::NotificationDetails());
- // BrowsingDataRemover deletes itself when it completes.
- BrowsingDataRemover* remover = BrowsingDataRemover::CreateForPeriod(
- GetProfile(), BrowsingDataRemover::EVERYTHING);
- remover->Remove(BrowsingDataRemover::REMOVE_HISTORY,
+ BrowsingDataRemover* remover =
+ BrowsingDataRemoverFactory::GetForBrowserContext(GetProfile());
+ remover->Remove(BrowsingDataRemover::Unbounded(),
+ BrowsingDataRemover::REMOVE_HISTORY,
BrowsingDataHelper::UNPROTECTED_WEB);
// Process messages until the inhibitor is notified, and then some, to make
@@ -2008,6 +2010,34 @@ TEST_F(BrowsingDataRemoverTest, CompletionInhibition) {
EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginTypeMask());
}
+TEST_F(BrowsingDataRemoverTest, EarlyShutdown) {
+ called_with_details_.reset(new BrowsingDataRemover::NotificationDetails());
+
+ BrowsingDataRemover* remover =
+ BrowsingDataRemoverFactory::GetForBrowserContext(GetProfile());
+ BrowsingDataRemoverCompletionObserver completion_observer(remover);
+ BrowsingDataRemoverCompletionInhibitor completion_inhibitor;
+ remover->Remove(BrowsingDataRemover::Unbounded(),
+ BrowsingDataRemover::REMOVE_HISTORY,
+ BrowsingDataHelper::UNPROTECTED_WEB);
+
+ completion_inhibitor.BlockUntilNearCompletion();
+
+ // Verify that the completion notification has not yet been broadcasted.
+ EXPECT_EQ(-1, GetRemovalMask());
+ EXPECT_EQ(-1, GetOriginTypeMask());
+
+ // Destroying the profile should trigger the notification.
+ DestroyProfile();
+
+ EXPECT_EQ(BrowsingDataRemover::REMOVE_HISTORY, GetRemovalMask());
+ EXPECT_EQ(BrowsingDataHelper::UNPROTECTED_WEB, GetOriginTypeMask());
+
+ // Finishing after shutdown shouldn't break anything.
+ completion_inhibitor.ContinueToCompletion();
+ completion_observer.BlockUntilCompletion();
+}
+
TEST_F(BrowsingDataRemoverTest, ZeroSuggestCacheClear) {
PrefService* prefs = GetProfile()->GetPrefs();
prefs->SetString(omnibox::kZeroSuggestCachedResults,
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index f1e30b2..cd50af3 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -33,6 +33,7 @@
#include "chrome/browser/browser_shutdown.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/character_encoding.h"
#include "chrome/browser/chrome_content_browser_client_parts.h"
#include "chrome/browser/chrome_net_benchmarking_message_filter.h"
@@ -2393,20 +2394,20 @@ void ChromeContentBrowserClient::ClearCache(RenderFrameHost* rfh) {
Profile* profile = Profile::FromBrowserContext(
rfh->GetSiteInstance()->GetProcess()->GetBrowserContext());
BrowsingDataRemover* remover =
- BrowsingDataRemover::CreateForUnboundedRange(profile);
- remover->Remove(BrowsingDataRemover::REMOVE_CACHE,
+ BrowsingDataRemoverFactory::GetForBrowserContext(profile);
+ remover->Remove(BrowsingDataRemover::Unbounded(),
+ BrowsingDataRemover::REMOVE_CACHE,
BrowsingDataHelper::UNPROTECTED_WEB);
- // BrowsingDataRemover takes care of deleting itself when done.
}
void ChromeContentBrowserClient::ClearCookies(RenderFrameHost* rfh) {
Profile* profile = Profile::FromBrowserContext(
rfh->GetSiteInstance()->GetProcess()->GetBrowserContext());
BrowsingDataRemover* remover =
- BrowsingDataRemover::CreateForUnboundedRange(profile);
+ BrowsingDataRemoverFactory::GetForBrowserContext(profile);
int remove_mask = BrowsingDataRemover::REMOVE_SITE_DATA;
- remover->Remove(remove_mask, BrowsingDataHelper::UNPROTECTED_WEB);
- // BrowsingDataRemover takes care of deleting itself when done.
+ remover->Remove(BrowsingDataRemover::Unbounded(), remove_mask,
+ BrowsingDataHelper::UNPROTECTED_WEB);
}
base::FilePath ChromeContentBrowserClient::GetDefaultDownloadDirectory() {
diff --git a/chrome/browser/chromeos/profiles/profile_helper.cc b/chrome/browser/chromeos/profiles/profile_helper.cc
index ddcd388..ee28d78 100644
--- a/chrome/browser/chromeos/profiles/profile_helper.cc
+++ b/chrome/browser/chromeos/profiles/profile_helper.cc
@@ -9,6 +9,8 @@
#include "base/command_line.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
+#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/chromeos/login/helper.h"
#include "chrome/browser/chromeos/login/signin/oauth2_login_manager_factory.h"
#include "chrome/browser/profiles/profile.h"
@@ -73,11 +75,8 @@ ProfileHelper::~ProfileHelper() {
if (user_manager::UserManager::IsInitialized())
user_manager::UserManager::Get()->RemoveSessionStateObserver(this);
- if (browsing_data_remover_) {
+ if (browsing_data_remover_)
browsing_data_remover_->RemoveObserver(this);
- // BrowsingDataRemover deletes itself.
- browsing_data_remover_ = nullptr;
- }
}
// static
@@ -230,9 +229,10 @@ void ProfileHelper::ClearSigninProfile(const base::Closure& on_clear_callback) {
if (profile_manager->GetProfileByPath(GetSigninProfileDir())) {
LOG_ASSERT(!browsing_data_remover_);
browsing_data_remover_ =
- BrowsingDataRemover::CreateForUnboundedRange(GetSigninProfile());
+ BrowsingDataRemoverFactory::GetForBrowserContext(GetSigninProfile());
browsing_data_remover_->AddObserver(this);
- browsing_data_remover_->Remove(BrowsingDataRemover::REMOVE_SITE_DATA,
+ browsing_data_remover_->Remove(BrowsingDataRemover::Unbounded(),
+ BrowsingDataRemover::REMOVE_SITE_DATA,
BrowsingDataHelper::ALL);
} else {
on_clear_profile_stage_finished_.Run();
@@ -374,7 +374,6 @@ void ProfileHelper::OnSigninProfileCleared() {
void ProfileHelper::OnBrowsingDataRemoverDone() {
LOG_ASSERT(browsing_data_remover_);
browsing_data_remover_->RemoveObserver(this);
- // BrowsingDataRemover deletes itself.
browsing_data_remover_ = nullptr;
on_clear_profile_stage_finished_.Run();
diff --git a/chrome/browser/errorpage_browsertest.cc b/chrome/browser/errorpage_browsertest.cc
index f814e7d..bc8cb36 100644
--- a/chrome/browser/errorpage_browsertest.cc
+++ b/chrome/browser/errorpage_browsertest.cc
@@ -20,6 +20,7 @@
#include "build/build_config.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/net/net_error_diagnostics_dialog.h"
#include "chrome/browser/net/url_request_mock_util.h"
#include "chrome/browser/profiles/profile.h"
@@ -998,8 +999,9 @@ IN_PROC_BROWSER_TEST_F(ErrorPageTest, StaleCacheStatus) {
// Clear the cache and reload the same URL; confirm the error page is told
// that there is no cached copy.
BrowsingDataRemover* remover =
- BrowsingDataRemover::CreateForUnboundedRange(browser()->profile());
- remover->Remove(BrowsingDataRemover::REMOVE_CACHE,
+ BrowsingDataRemoverFactory::GetForBrowserContext(browser()->profile());
+ remover->Remove(BrowsingDataRemover::Unbounded(),
+ BrowsingDataRemover::REMOVE_CACHE,
BrowsingDataHelper::UNPROTECTED_WEB);
ui_test_utils::NavigateToURL(browser(), test_url);
EXPECT_TRUE(ProbeStaleCopyValue(false));
@@ -1267,8 +1269,9 @@ IN_PROC_BROWSER_TEST_F(ErrorPageNavigationCorrectionsFailTest,
// Clear the cache and reload the same URL; confirm the error page is told
// that there is no cached copy.
BrowsingDataRemover* remover =
- BrowsingDataRemover::CreateForUnboundedRange(browser()->profile());
- remover->Remove(BrowsingDataRemover::REMOVE_CACHE,
+ BrowsingDataRemoverFactory::GetForBrowserContext(browser()->profile());
+ remover->Remove(BrowsingDataRemover::Unbounded(),
+ BrowsingDataRemover::REMOVE_CACHE,
BrowsingDataHelper::UNPROTECTED_WEB);
ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
browser(), test_url, 2);
diff --git a/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc b/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc
index f292d77..8a6a446 100644
--- a/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc
+++ b/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc
@@ -14,6 +14,7 @@
#include "base/values.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/plugins/plugin_data_remover_helper.h"
#include "chrome/browser/plugins/plugin_prefs.h"
#include "chrome/browser/profiles/profile.h"
@@ -231,8 +232,13 @@ void BrowsingDataSettingsFunction::SetDetails(
permitted_dict->SetBoolean(data_type, is_permitted);
}
+BrowsingDataRemoverFunction::BrowsingDataRemoverFunction() : observer_(this) {}
+
void BrowsingDataRemoverFunction::OnBrowsingDataRemoverDone() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ observer_.RemoveAll();
+
this->SendResponse(true);
Release(); // Balanced in RunAsync.
@@ -291,6 +297,8 @@ bool BrowsingDataRemoverFunction::RunAsync() {
return true;
}
+BrowsingDataRemoverFunction::~BrowsingDataRemoverFunction() {}
+
void BrowsingDataRemoverFunction::CheckRemovingPluginDataSupported(
scoped_refptr<PluginPrefs> plugin_prefs) {
if (!PluginDataRemoverHelper::IsSupported(plugin_prefs.get()))
@@ -302,7 +310,9 @@ void BrowsingDataRemoverFunction::CheckRemovingPluginDataSupported(
}
void BrowsingDataRemoverFunction::StartRemoving() {
- if (BrowsingDataRemover::is_removing()) {
+ BrowsingDataRemover* remover =
+ BrowsingDataRemoverFactory::GetForBrowserContext(GetProfile());
+ if (remover->is_removing()) {
error_ = extension_browsing_data_api_constants::kOneAtATimeError;
SendResponse(false);
return;
@@ -315,10 +325,10 @@ void BrowsingDataRemoverFunction::StartRemoving() {
// that we're notified after removal) and call remove() with the arguments
// we've generated above. We can use a raw pointer here, as the browsing data
// remover is responsible for deleting itself once data removal is complete.
- BrowsingDataRemover* remover = BrowsingDataRemover::CreateForRange(
- GetProfile(), remove_since_, base::Time::Max());
- remover->AddObserver(this);
- remover->Remove(removal_mask_, origin_type_mask_);
+ observer_.Add(remover);
+ remover->Remove(
+ BrowsingDataRemover::TimeRange(remove_since_, base::Time::Max()),
+ removal_mask_, origin_type_mask_);
}
int BrowsingDataRemoverFunction::ParseOriginTypeMask(
diff --git a/chrome/browser/extensions/api/browsing_data/browsing_data_api.h b/chrome/browser/extensions/api/browsing_data/browsing_data_api.h
index a70f45d..4ef30c6 100644
--- a/chrome/browser/extensions/api/browsing_data/browsing_data_api.h
+++ b/chrome/browser/extensions/api/browsing_data/browsing_data_api.h
@@ -11,6 +11,7 @@
#include <string>
+#include "base/scoped_observer.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
#include "chrome/browser/extensions/chrome_extension_function.h"
@@ -84,6 +85,8 @@ class BrowsingDataSettingsFunction : public ChromeSyncExtensionFunction {
class BrowsingDataRemoverFunction : public ChromeAsyncExtensionFunction,
public BrowsingDataRemover::Observer {
public:
+ BrowsingDataRemoverFunction();
+
// BrowsingDataRemover::Observer interface method.
void OnBrowsingDataRemoverDone() override;
@@ -91,7 +94,7 @@ class BrowsingDataRemoverFunction : public ChromeAsyncExtensionFunction,
bool RunAsync() override;
protected:
- ~BrowsingDataRemoverFunction() override {}
+ ~BrowsingDataRemoverFunction() override;
// Children should override this method to provide the proper removal mask
// based on the API call they represent.
@@ -113,6 +116,7 @@ class BrowsingDataRemoverFunction : public ChromeAsyncExtensionFunction,
base::Time remove_since_;
int removal_mask_;
int origin_type_mask_;
+ ScopedObserver<BrowsingDataRemover, BrowsingDataRemover::Observer> observer_;
};
class BrowsingDataRemoveAppcacheFunction : public BrowsingDataRemoverFunction {
diff --git a/chrome/browser/extensions/api/browsing_data/browsing_data_test.cc b/chrome/browser/extensions/api/browsing_data/browsing_data_test.cc
index 3c9e58a..2e96a19 100644
--- a/chrome/browser/extensions/api/browsing_data/browsing_data_test.cc
+++ b/chrome/browser/extensions/api/browsing_data/browsing_data_test.cc
@@ -14,6 +14,7 @@
#include "base/values.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/extensions/api/browsing_data/browsing_data_api.h"
#include "chrome/browser/extensions/extension_function_test_utils.h"
#include "chrome/browser/profiles/profile.h"
@@ -259,20 +260,21 @@ class ExtensionBrowsingDataTest : public InProcessBrowserTest {
scoped_ptr<BrowsingDataRemover::NotificationDetails> called_with_details_;
BrowsingDataRemover::CallbackSubscription callback_subscription_;
-
};
} // namespace
IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest, OneAtATime) {
- BrowsingDataRemover::set_removing(true);
+ BrowsingDataRemover* browsing_data_remover =
+ BrowsingDataRemoverFactory::GetForBrowserContext(browser()->profile());
+ browsing_data_remover->SetRemoving(true);
scoped_refptr<BrowsingDataRemoveFunction> function =
new BrowsingDataRemoveFunction();
EXPECT_TRUE(base::MatchPattern(
RunFunctionAndReturnError(function.get(), kRemoveEverythingArguments,
browser()),
extension_browsing_data_api_constants::kOneAtATimeError));
- BrowsingDataRemover::set_removing(false);
+ browsing_data_remover->SetRemoving(false);
EXPECT_EQ(base::Time(), GetBeginTime());
EXPECT_EQ(-1, GetRemovalMask());
diff --git a/chrome/browser/net/sdch_browsertest.cc b/chrome/browser/net/sdch_browsertest.cc
index bd27af3..2c4d344 100644
--- a/chrome/browser/net/sdch_browsertest.cc
+++ b/chrome/browser/net/sdch_browsertest.cc
@@ -24,6 +24,7 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/browsing_data/browsing_data_remover_test_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
@@ -404,10 +405,11 @@ class SdchBrowserTest : public InProcessBrowserTest,
}
void BrowsingDataRemoveAndWait(int remove_mask) {
- BrowsingDataRemover* remover = BrowsingDataRemover::CreateForPeriod(
- browser()->profile(), BrowsingDataRemover::LAST_HOUR);
+ BrowsingDataRemover* remover =
+ BrowsingDataRemoverFactory::GetForBrowserContext(browser()->profile());
BrowsingDataRemoverCompletionObserver completion_observer(remover);
- remover->Remove(remove_mask, BrowsingDataHelper::UNPROTECTED_WEB);
+ remover->Remove(BrowsingDataRemover::Period(BrowsingDataRemover::LAST_HOUR),
+ remove_mask, BrowsingDataHelper::UNPROTECTED_WEB);
completion_observer.BlockUntilCompletion();
}
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
index 7b85ced..4a540a3 100644
--- a/chrome/browser/prerender/prerender_browsertest.cc
+++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -29,6 +29,7 @@
#include "build/build_config.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/browsing_data/browsing_data_remover_test_util.h"
#include "chrome/browser/chrome_content_browser_client.h"
#include "chrome/browser/chrome_notification_types.h"
@@ -222,9 +223,10 @@ std::string CreateServerRedirect(const std::string& dest_url) {
// Clears the specified data using BrowsingDataRemover.
void ClearBrowsingData(Browser* browser, int remove_mask) {
BrowsingDataRemover* remover =
- BrowsingDataRemover::CreateForUnboundedRange(browser->profile());
+ BrowsingDataRemoverFactory::GetForBrowserContext(browser->profile());
BrowsingDataRemoverCompletionObserver observer(remover);
- remover->Remove(remove_mask, BrowsingDataHelper::UNPROTECTED_WEB);
+ remover->Remove(BrowsingDataRemover::Unbounded(), remove_mask,
+ BrowsingDataHelper::UNPROTECTED_WEB);
observer.BlockUntilCompletion();
// BrowsingDataRemover deletes itself.
}
diff --git a/chrome/browser/profile_resetter/profile_resetter.cc b/chrome/browser/profile_resetter/profile_resetter.cc
index 9db027b..56ae49b 100644
--- a/chrome/browser/profile_resetter/profile_resetter.cc
+++ b/chrome/browser/profile_resetter/profile_resetter.cc
@@ -14,6 +14,8 @@
#include "base/synchronization/cancellation_flag.h"
#include "build/build_config.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
+#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/google/google_url_tracker_factory.h"
@@ -73,7 +75,7 @@ ProfileResetter::ProfileResetter(Profile* profile)
: profile_(profile),
template_url_service_(TemplateURLServiceFactory::GetForProfile(profile_)),
pending_reset_flags_(0),
- cookies_remover_(NULL),
+ cookies_remover_(nullptr),
weak_ptr_factory_(this) {
DCHECK(CalledOnValidThread());
DCHECK(profile_);
@@ -245,16 +247,18 @@ void ProfileResetter::ResetCookiesAndSiteData() {
DCHECK(CalledOnValidThread());
DCHECK(!cookies_remover_);
- cookies_remover_ = BrowsingDataRemover::CreateForUnboundedRange(profile_);
+ cookies_remover_ = BrowsingDataRemoverFactory::GetForBrowserContext(profile_);
cookies_remover_->AddObserver(this);
int remove_mask = BrowsingDataRemover::REMOVE_SITE_DATA |
BrowsingDataRemover::REMOVE_CACHE;
PrefService* prefs = profile_->GetPrefs();
DCHECK(prefs);
+
// Don't try to clear LSO data if it's not supported.
if (!prefs->GetBoolean(prefs::kClearPluginLSODataEnabled))
remove_mask &= ~BrowsingDataRemover::REMOVE_PLUGIN_DATA;
- cookies_remover_->Remove(remove_mask, BrowsingDataHelper::UNPROTECTED_WEB);
+ cookies_remover_->Remove(BrowsingDataRemover::Unbounded(), remove_mask,
+ BrowsingDataHelper::UNPROTECTED_WEB);
}
void ProfileResetter::ResetExtensions() {
@@ -330,7 +334,8 @@ void ProfileResetter::OnTemplateURLServiceLoaded() {
}
void ProfileResetter::OnBrowsingDataRemoverDone() {
- cookies_remover_ = NULL;
+ cookies_remover_->RemoveObserver(this);
+ cookies_remover_ = nullptr;
MarkAsDone(COOKIES_AND_SITE_DATA);
}
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
index 38177c7..7a7fadb 100644
--- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -12,6 +12,7 @@
#include "chrome/browser/autofill/personal_data_manager_factory.h"
#include "chrome/browser/background/background_contents_service_factory.h"
#include "chrome/browser/bookmarks/bookmark_model_factory.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/chrome_browser_main.h"
#include "chrome/browser/content_settings/cookie_settings_factory.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
@@ -192,6 +193,7 @@ EnsureBrowserContextKeyedServiceFactoriesBuilt() {
#endif
BookmarkModelFactory::GetInstance();
BookmarkUndoServiceFactory::GetInstance();
+ BrowsingDataRemoverFactory::GetInstance();
#if defined(ENABLE_CAPTIVE_PORTAL_DETECTION)
CaptivePortalServiceFactory::GetInstance();
#endif
diff --git a/chrome/browser/profiles/profiles_state.cc b/chrome/browser/profiles/profiles_state.cc
index 26c9dc5..efaa40c 100644
--- a/chrome/browser/profiles/profiles_state.cc
+++ b/chrome/browser/profiles/profiles_state.cc
@@ -14,6 +14,7 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/profiles/gaia_info_update_service.h"
#include "chrome/browser/profiles/gaia_info_update_service_factory.h"
#include "chrome/browser/profiles/profile.h"
@@ -231,13 +232,13 @@ void RemoveBrowsingDataForProfile(const base::FilePath& profile_path) {
if (!profile)
return;
- // For guest the browsing data is in the OTR profile.
+ // For guest profiles the browsing data is in the OTR profile.
if (profile->IsGuestSession())
profile = profile->GetOffTheRecordProfile();
- BrowsingDataRemover::CreateForUnboundedRange(profile)->Remove(
+ BrowsingDataRemoverFactory::GetForBrowserContext(profile)->Remove(
+ BrowsingDataRemover::Unbounded(),
BrowsingDataRemover::REMOVE_WIPE_PROFILE, BrowsingDataHelper::ALL);
- // BrowsingDataRemover deletes itself.
}
void SetLastUsedProfile(const std::string& profile_dir) {
diff --git a/chrome/browser/push_messaging/push_messaging_browsertest.cc b/chrome/browser/push_messaging/push_messaging_browsertest.cc
index caa8a8d..020c9a0 100644
--- a/chrome/browser/push_messaging/push_messaging_browsertest.cc
+++ b/chrome/browser/push_messaging/push_messaging_browsertest.cc
@@ -19,6 +19,7 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/browsing_data/browsing_data_remover_test_util.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/notifications/notification_test_util.h"
@@ -1124,12 +1125,12 @@ IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest,
// Simulate a user clearing site data (including Service Workers, crucially).
BrowsingDataRemover* remover =
- BrowsingDataRemover::CreateForUnboundedRange(GetBrowser()->profile());
+ BrowsingDataRemoverFactory::GetForBrowserContext(GetBrowser()->profile());
BrowsingDataRemoverCompletionObserver observer(remover);
- remover->Remove(BrowsingDataRemover::REMOVE_SITE_DATA,
+ remover->Remove(BrowsingDataRemover::Unbounded(),
+ BrowsingDataRemover::REMOVE_SITE_DATA,
BrowsingDataHelper::UNPROTECTED_WEB);
observer.BlockUntilCompletion();
- // BrowsingDataRemover deletes itself.
base::RunLoop run_loop;
push_service()->SetContentSettingChangedCallbackForTesting(
diff --git a/chrome/browser/ssl/chrome_ssl_host_state_delegate_test.cc b/chrome/browser/ssl/chrome_ssl_host_state_delegate_test.cc
index 33ecf87..c3f99e8 100644
--- a/chrome/browser/ssl/chrome_ssl_host_state_delegate_test.cc
+++ b/chrome/browser/ssl/chrome_ssl_host_state_delegate_test.cc
@@ -12,6 +12,7 @@
#include "base/test/simple_test_clock.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/browsing_data/browsing_data_remover_test_util.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/profiles/profile.h"
@@ -542,10 +543,11 @@ class RemoveBrowsingHistorySSLHostStateDelegateTest
: public ChromeSSLHostStateDelegateTest {
public:
void RemoveAndWait(Profile* profile) {
- BrowsingDataRemover* remover = BrowsingDataRemover::CreateForPeriod(
- profile, BrowsingDataRemover::LAST_HOUR);
+ BrowsingDataRemover* remover =
+ BrowsingDataRemoverFactory::GetForBrowserContext(profile);
BrowsingDataRemoverCompletionObserver completion_observer(remover);
- remover->Remove(BrowsingDataRemover::REMOVE_HISTORY,
+ remover->Remove(BrowsingDataRemover::Period(BrowsingDataRemover::LAST_HOUR),
+ BrowsingDataRemover::REMOVE_HISTORY,
BrowsingDataHelper::UNPROTECTED_WEB);
completion_observer.BlockUntilCompletion();
}
diff --git a/chrome/browser/sync/chrome_sync_client.cc b/chrome/browser/sync/chrome_sync_client.cc
index c345826..f046be3 100644
--- a/chrome/browser/sync/chrome_sync_client.cc
+++ b/chrome/browser/sync/chrome_sync_client.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/autofill/personal_data_manager_factory.h"
#include "chrome/browser/bookmarks/bookmark_model_factory.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/dom_distiller/dom_distiller_service_factory.h"
#include "chrome/browser/favicon/favicon_service_factory.h"
#include "chrome/browser/history/history_service_factory.h"
@@ -470,12 +471,10 @@ ChromeSyncClient::GetSyncApiComponentFactory() {
}
void ChromeSyncClient::ClearBrowsingData(base::Time start, base::Time end) {
- // BrowsingDataRemover deletes itself when it's done.
BrowsingDataRemover* remover =
- BrowsingDataRemover::CreateForRange(profile_, start, end);
- if (browsing_data_remover_observer_)
- remover->AddObserver(browsing_data_remover_observer_);
- remover->Remove(BrowsingDataRemover::REMOVE_ALL, BrowsingDataHelper::ALL);
+ BrowsingDataRemoverFactory::GetForBrowserContext(profile_);
+ remover->Remove(BrowsingDataRemover::TimeRange(start, end),
+ BrowsingDataRemover::REMOVE_ALL, BrowsingDataHelper::ALL);
scoped_refptr<password_manager::PasswordStore> password =
PasswordStoreFactory::GetForProfile(profile_,
@@ -485,6 +484,14 @@ void ChromeSyncClient::ClearBrowsingData(base::Time start, base::Time end) {
void ChromeSyncClient::SetBrowsingDataRemoverObserverForTesting(
BrowsingDataRemover::Observer* observer) {
+ BrowsingDataRemover* remover =
+ BrowsingDataRemoverFactory::GetForBrowserContext(profile_);
+ if (browsing_data_remover_observer_)
+ remover->RemoveObserver(browsing_data_remover_observer_);
+
+ if (observer)
+ remover->AddObserver(observer);
+
browsing_data_remover_observer_ = observer;
}
diff --git a/chrome/browser/sync/test/integration/single_client_backup_rollback_test.cc b/chrome/browser/sync/test/integration/single_client_backup_rollback_test.cc
index 61c71c8..5c8c856 100644
--- a/chrome/browser/sync/test/integration/single_client_backup_rollback_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_backup_rollback_test.cc
@@ -134,6 +134,11 @@ class SyncRollbackChecker : public sync_driver::SyncServiceObserver,
// BrowsingDataRemoverObserver::Observer implementation.
void OnBrowsingDataRemoverDone() override {
+ // Remove ourselves as an observer.
+ browser_sync::ChromeSyncClient* sync_client =
+ static_cast<browser_sync::ChromeSyncClient*>(pss_->GetSyncClient());
+ sync_client->SetBrowsingDataRemoverObserverForTesting(nullptr);
+
clear_done_ = true;
if (rollback_started_) {
run_loop_.Quit();
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc
index 3c03397..c6b7bb9 100644
--- a/chrome/browser/ui/browser_commands.cc
+++ b/chrome/browser/ui/browser_commands.cc
@@ -14,6 +14,7 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/devtools/devtools_window.h"
#include "chrome/browser/dom_distiller/tab_utils.h"
@@ -1178,8 +1179,9 @@ void ToggleFullscreenMode(Browser* browser) {
void ClearCache(Browser* browser) {
BrowsingDataRemover* remover =
- BrowsingDataRemover::CreateForUnboundedRange(browser->profile());
- remover->Remove(BrowsingDataRemover::REMOVE_CACHE,
+ BrowsingDataRemoverFactory::GetForBrowserContext(browser->profile());
+ remover->Remove(BrowsingDataRemover::Unbounded(),
+ BrowsingDataRemover::REMOVE_CACHE,
BrowsingDataHelper::UNPROTECTED_WEB);
// BrowsingDataRemover takes care of deleting itself when done.
}
diff --git a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
index de13575..9e161f7 100644
--- a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
+++ b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
@@ -34,6 +34,7 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/download/download_prefs.h"
#include "chrome/browser/io_thread.h"
@@ -526,9 +527,11 @@ void NetInternalsMessageHandler::OnRendererReady(const base::ListValue* list) {
void NetInternalsMessageHandler::OnClearBrowserCache(
const base::ListValue* list) {
- BrowsingDataRemover* remover = BrowsingDataRemover::CreateForUnboundedRange(
- Profile::FromWebUI(web_ui()));
- remover->Remove(BrowsingDataRemover::REMOVE_CACHE,
+ BrowsingDataRemover* remover =
+ BrowsingDataRemoverFactory::GetForBrowserContext(
+ Profile::FromWebUI(web_ui()));
+ remover->Remove(BrowsingDataRemover::Unbounded(),
+ BrowsingDataRemover::REMOVE_CACHE,
BrowsingDataHelper::UNPROTECTED_WEB);
// BrowsingDataRemover deletes itself.
}
diff --git a/chrome/browser/ui/webui/options/clear_browser_data_handler.cc b/chrome/browser/ui/webui/options/clear_browser_data_handler.cc
index 847d0b5..4f2aaf3 100644
--- a/chrome/browser/ui/webui/options/clear_browser_data_handler.cc
+++ b/chrome/browser/ui/webui/options/clear_browser_data_handler.cc
@@ -23,6 +23,7 @@
#include "chrome/browser/browsing_data/browsing_data_counter_utils.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/browser/browsing_data/cache_counter.h"
#include "chrome/browser/browsing_data/history_counter.h"
#include "chrome/browser/browsing_data/passwords_counter.h"
@@ -278,12 +279,13 @@ void ClearBrowserDataHandler::HandleClearBrowserData(
checked_other_types);
}
- // BrowsingDataRemover deletes itself when done.
- int period_selected = prefs->GetInteger(prefs::kDeleteTimePeriod);
- remover_ = BrowsingDataRemover::CreateForPeriod(profile,
- static_cast<BrowsingDataRemover::TimePeriod>(period_selected));
+ remover_ = BrowsingDataRemoverFactory::GetForBrowserContext(profile);
remover_->AddObserver(this);
- remover_->Remove(remove_mask, origin_mask);
+ int period_selected = prefs->GetInteger(prefs::kDeleteTimePeriod);
+ remover_->Remove(
+ BrowsingDataRemover::Period(
+ static_cast<BrowsingDataRemover::TimePeriod>(period_selected)),
+ remove_mask, origin_mask);
// Store the clear browsing data time. Next time the clear browsing data
// dialog is open, this time is used to decide whether to display an info
@@ -293,9 +295,8 @@ void ClearBrowserDataHandler::HandleClearBrowserData(
}
void ClearBrowserDataHandler::OnBrowsingDataRemoverDone() {
- // No need to remove ourselves as an observer as BrowsingDataRemover deletes
- // itself after we return.
- remover_ = NULL;
+ remover_->RemoveObserver(this);
+ remover_ = nullptr;
web_ui()->CallJavascriptFunction("ClearBrowserDataOverlay.doneClearing");
}
diff --git a/chrome/browser/ui/webui/options/clear_browser_data_handler.h b/chrome/browser/ui/webui/options/clear_browser_data_handler.h
index 8621543..30c15e4 100644
--- a/chrome/browser/ui/webui/options/clear_browser_data_handler.h
+++ b/chrome/browser/ui/webui/options/clear_browser_data_handler.h
@@ -58,8 +58,7 @@ class ClearBrowserDataHandler : public OptionsPageUIHandler,
// bottom of the dialog.
void OnStateChanged() override;
- // If non-null it means removal is in progress. BrowsingDataRemover takes care
- // of deleting itself when done.
+ // If non-null it means removal is in progress.
BrowsingDataRemover* remover_;
// Keeps track of whether clearing LSO data is supported.
diff --git a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
index 559be10..a19417f 100644
--- a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
@@ -11,13 +11,14 @@
#include "base/metrics/sparse_histogram.h"
#include "base/prefs/pref_service.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
+#include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
#include "chrome/common/pref_names.h"
#include "content/public/browser/web_ui.h"
namespace settings {
ClearBrowsingDataHandler::ClearBrowsingDataHandler(content::WebUI* webui)
- : remover_(NULL) {
+ : remover_(nullptr) {
PrefService* prefs = Profile::FromWebUI(webui)->GetPrefs();
clear_plugin_lso_data_enabled_.Init(prefs::kClearPluginLSODataEnabled, prefs);
pepper_flash_settings_enabled_.Init(prefs::kPepperFlashSettingsEnabled,
@@ -122,18 +123,18 @@ void ClearBrowsingDataHandler::HandleClearBrowserData(
checked_other_types);
}
- // BrowsingDataRemover deletes itself when done.
int period_selected = prefs->GetInteger(prefs::kDeleteTimePeriod);
- remover_ = BrowsingDataRemover::CreateForPeriod(
- profile, static_cast<BrowsingDataRemover::TimePeriod>(period_selected));
+ remover_ = BrowsingDataRemoverFactory::GetForBrowserContext(profile);
remover_->AddObserver(this);
- remover_->Remove(remove_mask, origin_mask);
+ remover_->Remove(
+ BrowsingDataRemover::Period(
+ static_cast<BrowsingDataRemover::TimePeriod>(period_selected)),
+ remove_mask, origin_mask);
}
void ClearBrowsingDataHandler::OnBrowsingDataRemoverDone() {
- // No need to remove ourselves as an observer as BrowsingDataRemover deletes
- // itself after we return.
- remover_ = NULL;
+ remover_->RemoveObserver(this);
+ remover_ = nullptr;
web_ui()->CallJavascriptFunction("SettingsClearBrowserData.doneClearing");
}
diff --git a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h
index 4b42e61..6f8830e 100644
--- a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h
+++ b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h
@@ -43,8 +43,7 @@ class ClearBrowsingDataHandler : public SettingsPageUIHandler,
// Updates UI when the pref to allow clearing history changes.
virtual void OnBrowsingHistoryPrefChanged();
- // If non-null it means removal is in progress. BrowsingDataRemover takes care
- // of deleting itself when done.
+ // If non-null it means removal is in progress.
BrowsingDataRemover* remover_;
// Keeps track of whether clearing LSO data is supported.
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 2ba3581..deaff86 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -95,6 +95,8 @@
'browser/browsing_data/browsing_data_quota_helper_impl.h',
'browser/browsing_data/browsing_data_remover.cc',
'browser/browsing_data/browsing_data_remover.h',
+ 'browser/browsing_data/browsing_data_remover_factory.cc',
+ 'browser/browsing_data/browsing_data_remover_factory.h',
'browser/browsing_data/browsing_data_service_worker_helper.cc',
'browser/browsing_data/browsing_data_service_worker_helper.h',
'browser/browsing_data/cache_counter.cc',