Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(145)

Unified Diff: chrome/browser/android/preferences/pref_service_bridge.cc

Issue 2221143003: Formalize the restrictions of BrowsingDataRemover::RemoveWithFilter() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Explicit task count. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/browsing_data/browsing_data_remover.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/android/preferences/pref_service_bridge.cc
diff --git a/chrome/browser/android/preferences/pref_service_bridge.cc b/chrome/browser/android/preferences/pref_service_bridge.cc
index c83f95de18782ed07a15a98be04fc04e8b61e026..426aaeaebd1353deba735d8d1455e4e16264988d 100644
--- a/chrome/browser/android/preferences/pref_service_bridge.cc
+++ b/chrome/browser/android/preferences/pref_service_bridge.cc
@@ -513,19 +513,28 @@ static ScopedJavaLocalRef<jstring> GetLatestVersionWhenClickedUpdateMenuItem(
namespace {
-// Redirects a BrowsingDataRemover completion callback back into Java.
+// Merges |task_count| BrowsingDataRemover completion callbacks and redirects
+// them back into Java.
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,
- BrowsingDataRemover* browsing_data_remover)
- : weak_chrome_native_preferences_(env, obj), observer_(this) {
+ BrowsingDataRemover* browsing_data_remover,
+ int task_count)
+ : task_count_(task_count),
+ weak_chrome_native_preferences_(env, obj),
+ observer_(this) {
+ DCHECK_GT(task_count, 0);
observer_.Add(browsing_data_remover);
}
void OnBrowsingDataRemoverDone() override {
+ DCHECK(task_count_);
+ if (--task_count_)
+ return;
+
// We delete ourselves when done.
std::unique_ptr<ClearBrowsingDataObserver> auto_delete(this);
@@ -538,6 +547,7 @@ class ClearBrowsingDataObserver : public BrowsingDataRemover::Observer {
}
private:
+ int task_count_;
JavaObjectWeakGlobalRef weak_chrome_native_preferences_;
ScopedObserver<BrowsingDataRemover, BrowsingDataRemover::Observer> observer_;
};
@@ -650,16 +660,38 @@ static void ClearBrowsingData(
excluding_domains);
}
+ // Delete the filterable types with a filter, and the rest completely.
+ // TODO(msramek): This is only necessary until the filter is implemented in
+ // all data storage backends.
+ int filterable_mask = remove_mask & BrowsingDataRemover::FILTERABLE_DATATYPES;
+ int nonfilterable_mask =
+ remove_mask & ~BrowsingDataRemover::FILTERABLE_DATATYPES;
+
// ClearBrowsingDataObserver deletes itself when |browsing_data_remover| is
- // done.
- ClearBrowsingDataObserver* observer =
- new ClearBrowsingDataObserver(env, obj, browsing_data_remover);
-
- browsing_data_remover->RemoveWithFilterAndReply(
- BrowsingDataRemover::Period(
- static_cast<browsing_data::TimePeriod>(time_period)),
- remove_mask, BrowsingDataHelper::UNPROTECTED_WEB,
- std::move(filter_builder), observer);
+ // done with both removal tasks.
+ ClearBrowsingDataObserver* observer = new ClearBrowsingDataObserver(
+ env, obj, browsing_data_remover, 2 /* tasks_count */);
Bernhard Bauer 2016/08/11 15:16:16 I was actually thinking to increase the count for
msramek 2016/08/11 15:36:31 I see. Yes, I was exactly trying to avoid that edg
+
+ if (filterable_mask) {
+ browsing_data_remover->RemoveWithFilterAndReply(
+ BrowsingDataRemover::Period(
+ static_cast<browsing_data::TimePeriod>(time_period)),
+ filterable_mask, BrowsingDataHelper::UNPROTECTED_WEB,
+ std::move(filter_builder), observer);
+ } else {
+ // Make sure |observer| doesn't wait for the filtered task.
+ observer->OnBrowsingDataRemoverDone();
+ }
+
+ if (nonfilterable_mask) {
+ browsing_data_remover->RemoveAndReply(
+ BrowsingDataRemover::Period(
+ static_cast<browsing_data::TimePeriod>(time_period)),
+ nonfilterable_mask, BrowsingDataHelper::UNPROTECTED_WEB, observer);
+ } else {
+ // Make sure |observer| doesn't wait for the non-filtered task.
+ observer->OnBrowsingDataRemoverDone();
+ }
}
static jboolean CanDeleteBrowsingHistory(JNIEnv* env,
« no previous file with comments | « no previous file | chrome/browser/browsing_data/browsing_data_remover.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698