Index: chrome/browser/android/signin/signin_manager_android.cc |
diff --git a/chrome/browser/android/signin/signin_manager_android.cc b/chrome/browser/android/signin/signin_manager_android.cc |
index 5fd3e001cc51c289baf8c77a7497469d1bb1f1e7..29e9ad8b0b68fbb93db5e06d721ee2bc496fb234 100644 |
--- a/chrome/browser/android/signin/signin_manager_android.cc |
+++ b/chrome/browser/android/signin/signin_manager_android.cc |
@@ -19,7 +19,6 @@ |
#include "chrome/browser/bookmarks/bookmark_model_factory.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/browsing_data/browsing_data_helper.h" |
- |
#include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h" |
#include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h" |
#include "chrome/browser/policy/cloud/user_policy_signin_service_factory.h" |
@@ -31,6 +30,7 @@ |
#include "chrome/browser/signin/signin_manager_factory.h" |
#include "chrome/common/pref_names.h" |
#include "components/bookmarks/browser/bookmark_model.h" |
+#include "components/google/core/browser/google_util.h" |
#include "components/policy/core/browser/browser_policy_connector.h" |
#include "components/policy/core/common/cloud/cloud_policy_core.h" |
#include "components/policy/core/common/cloud/cloud_policy_store.h" |
@@ -42,6 +42,7 @@ |
#include "components/signin/core/browser/signin_metrics.h" |
#include "components/signin/core/common/profile_management_switches.h" |
#include "components/signin/core/common/signin_pref_names.h" |
+#include "content/public/browser/browsing_data_filter_builder.h" |
#include "content/public/browser/browsing_data_remover.h" |
#include "google_apis/gaia/gaia_auth_util.h" |
#include "google_apis/gaia/gaia_constants.h" |
@@ -53,19 +54,42 @@ using bookmarks::BookmarkModel; |
namespace { |
-// A BrowsingDataRemover::Observer that clears all Profile data and then |
-// invokes a callback and deletes itself. |
+// A BrowsingDataRemover::Observer that clears Profile data and then invokes |
+// a callback and deletes itself. It can be configured to delete all data |
+// (for enterprise users) or only Google's service workers (for all users). |
class ProfileDataRemover : public content::BrowsingDataRemover::Observer { |
public: |
- ProfileDataRemover(Profile* profile, const base::Closure& callback) |
+ ProfileDataRemover(Profile* profile, |
+ bool all_data, |
+ const base::Closure& callback) |
: callback_(callback), |
origin_runner_(base::ThreadTaskRunnerHandle::Get()), |
remover_(content::BrowserContext::GetBrowsingDataRemover(profile)) { |
remover_->AddObserver(this); |
- remover_->RemoveAndReply( |
- base::Time(), base::Time::Max(), |
- ChromeBrowsingDataRemoverDelegate::ALL_DATA_TYPES, |
- ChromeBrowsingDataRemoverDelegate::ALL_ORIGIN_TYPES, this); |
+ |
+ if (all_data) { |
+ remover_->RemoveAndReply( |
+ base::Time(), base::Time::Max(), |
+ ChromeBrowsingDataRemoverDelegate::ALL_DATA_TYPES, |
+ ChromeBrowsingDataRemoverDelegate::ALL_ORIGIN_TYPES, this); |
+ } else { |
+ std::unique_ptr<content::BrowsingDataFilterBuilder> google_tld_filter = |
+ content::BrowsingDataFilterBuilder::Create( |
+ content::BrowsingDataFilterBuilder::WHITELIST); |
+ |
+ // TODO(msramek): BrowsingDataFilterBuilder was not designed for |
+ // large filters. Optimize it. |
+ for (const std::string& domain : |
+ google_util::GetGoogleRegistrableDomains()) { |
+ google_tld_filter->AddRegisterableDomain(domain); |
+ } |
+ |
+ remover_->RemoveWithFilterAndReply( |
+ base::Time(), base::Time::Max(), |
+ content::BrowsingDataRemover::DATA_TYPE_CACHE_STORAGE, |
+ ChromeBrowsingDataRemoverDelegate::ALL_ORIGIN_TYPES, |
+ std::move(google_tld_filter), this); |
+ } |
} |
~ProfileDataRemover() override {} |
@@ -199,10 +223,21 @@ void SigninManagerAndroid::WipeProfileData( |
base::android::ScopedJavaGlobalRef<jobject> java_callback; |
java_callback.Reset(env, callback); |
- // The ProfileDataRemover deletes itself once done. |
- new ProfileDataRemover( |
- profile_, base::Bind(&SigninManagerAndroid::OnBrowsingDataRemoverDone, |
- weak_factory_.GetWeakPtr(), java_callback)); |
+ WipeData(profile_, true /* all data */, |
+ base::Bind(&SigninManagerAndroid::OnBrowsingDataRemoverDone, |
+ weak_factory_.GetWeakPtr(), java_callback)); |
+} |
+ |
+void SigninManagerAndroid::WipeGoogleServiceWorkerCaches( |
+ JNIEnv* env, |
+ const JavaParamRef<jobject>& obj, |
+ const JavaParamRef<jobject>& callback) { |
+ base::android::ScopedJavaGlobalRef<jobject> java_callback; |
+ java_callback.Reset(env, callback); |
+ |
+ WipeData(profile_, false /* only Google service worker caches */, |
+ base::Bind(&SigninManagerAndroid::OnBrowsingDataRemoverDone, |
+ weak_factory_.GetWeakPtr(), java_callback)); |
} |
void SigninManagerAndroid::OnPolicyRegisterDone( |
@@ -315,6 +350,14 @@ void SigninManagerAndroid::OnSigninAllowedPrefChanged() { |
SigninManagerFactory::GetForProfile(profile_)->IsSigninAllowed()); |
} |
+// static |
+void SigninManagerAndroid::WipeData(Profile* profile, |
+ bool all_data, |
+ const base::Closure& callback) { |
+ // The ProfileDataRemover deletes itself once done. |
+ new ProfileDataRemover(profile, all_data, callback); |
+} |
+ |
static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
SigninManagerAndroid* signin_manager_android = |
new SigninManagerAndroid(env, obj); |