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

Unified Diff: chrome/browser/services/gcm/gcm_profile_service.cc

Issue 162233002: [GCM] Remove all persisted data and close connections when signing out of a profile (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Patch to land Created 6 years, 10 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
Index: chrome/browser/services/gcm/gcm_profile_service.cc
diff --git a/chrome/browser/services/gcm/gcm_profile_service.cc b/chrome/browser/services/gcm/gcm_profile_service.cc
index b5c0ba828ae32b8d47e01b7b0b4b412fc809dd26..2f0569f47fcc092d16e39a175d7166ec519a71e3 100644
--- a/chrome/browser/services/gcm/gcm_profile_service.cc
+++ b/chrome/browser/services/gcm/gcm_profile_service.cc
@@ -479,6 +479,9 @@ void GCMProfileService::RegisterProfilePrefs(
prefs::kGCMChannelEnabled,
on_by_default,
user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
+ registry->RegisterListPref(
+ prefs::kGCMRegisteredAppIDs,
+ user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
}
GCMProfileService::GCMProfileService(Profile* profile)
@@ -514,9 +517,6 @@ void GCMProfileService::Initialize(
content::Source<Profile>(profile_));
// TODO(jianli): move extension specific logic out of GCMProfileService.
registrar_.Add(this,
- chrome::NOTIFICATION_EXTENSION_LOADED,
- content::Source<Profile>(profile_));
- registrar_.Add(this,
chrome:: NOTIFICATION_EXTENSION_UNINSTALLED,
content::Source<Profile>(profile_));
@@ -601,6 +601,10 @@ void GCMProfileService::DoRegister(const std::string& app_id,
registration_info.sender_ids = normalized_sender_ids;
registration_info_map_[app_id] = registration_info;
+ // Save the IDs of all registered apps such that we know what to remove from
+ // the the app's state store when the profile is signed out.
+ WriteRegisteredAppIDs();
+
content::BrowserThread::PostTask(
content::BrowserThread::IO,
FROM_HERE,
@@ -682,15 +686,6 @@ void GCMProfileService::Observe(int type,
case chrome::NOTIFICATION_PROFILE_DESTROYED:
ResetGCMClient();
break;
- case chrome::NOTIFICATION_EXTENSION_LOADED: {
- extensions::Extension* extension =
- content::Details<extensions::Extension>(details).ptr();
- // No need to load the persisted registration info if the extension does
- // not have the GCM permission.
- if (extension->HasAPIPermission(extensions::APIPermission::kGcm))
- EnsureAppReady(extension->id());
- break;
- }
case chrome:: NOTIFICATION_EXTENSION_UNINSTALLED: {
extensions::Extension* extension =
content::Details<extensions::Extension>(details).ptr();
@@ -709,6 +704,9 @@ void GCMProfileService::CheckIn(const std::string& username) {
DCHECK(!delayed_task_controller_);
delayed_task_controller_.reset(new DelayedTaskController);
+ // Load all register apps.
+ ReadRegisteredAppIDs();
+
// Let the IO thread create and initialize GCMClient.
scoped_refptr<net::URLRequestContextGetter> url_request_context_getter =
profile_->GetRequestContext();
@@ -728,6 +726,17 @@ void GCMProfileService::CheckOut() {
DCHECK(!username_.empty());
username_.clear();
+ // Remove persisted data from app's state store.
+ for (RegistrationInfoMap::const_iterator iter =
+ registration_info_map_.begin();
+ iter != registration_info_map_.end(); ++iter) {
+ DeleteRegistrationInfo(iter->first);
+ }
+
+ // Remove persisted data from prefs store.
+ profile_->GetPrefs()->ClearPref(prefs::kGCMChannelEnabled);
+ profile_->GetPrefs()->ClearPref(prefs::kGCMRegisteredAppIDs);
+
gcm_client_ready_ = false;
delayed_task_controller_.reset();
register_callbacks_.clear();
@@ -769,6 +778,9 @@ void GCMProfileService::Unregister(const std::string& app_id) {
return;
registration_info_map_.erase(registration_info_iter);
+ // Update the persisted IDs of registered apps.
+ WriteRegisteredAppIDs();
+
// Remove the persisted registration info.
DeleteRegistrationInfo(app_id);
@@ -897,6 +909,27 @@ GCMEventRouter* GCMProfileService::GetEventRouter(const std::string& app_id)
#endif
}
+void GCMProfileService::ReadRegisteredAppIDs() {
+ const base::ListValue* app_id_list =
+ profile_->GetPrefs()->GetList(prefs::kGCMRegisteredAppIDs);
+ for (size_t i = 0; i < app_id_list->GetSize(); ++i) {
+ std::string app_id;
+ if (!app_id_list->GetString(i, &app_id))
+ continue;
+ ReadRegistrationInfo(app_id);
+ }
+}
+
+void GCMProfileService::WriteRegisteredAppIDs() {
+ base::ListValue apps;
+ for (RegistrationInfoMap::const_iterator iter =
+ registration_info_map_.begin();
+ iter != registration_info_map_.end(); ++iter) {
+ apps.Append(new base::StringValue(iter->first));
+ }
+ profile_->GetPrefs()->Set(prefs::kGCMRegisteredAppIDs, apps);
+}
+
void GCMProfileService::DeleteRegistrationInfo(const std::string& app_id) {
extensions::StateStore* storage =
extensions::ExtensionSystem::Get(profile_)->state_store();
« no previous file with comments | « chrome/browser/services/gcm/gcm_profile_service.h ('k') | chrome/browser/services/gcm/gcm_profile_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698