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, |