Chromium Code Reviews| 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..c8a4b98cc672629197c369e4c9fec07abf7986a4 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::kGCMApps, |
| + 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, |
|
fgorski
2014/02/13 00:20:12
please edit the CL description to cover why you ar
jianli
2014/02/13 00:32:48
Done.
|
| - 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::kGCMApps); |
| + |
| gcm_client_ready_ = false; |
| delayed_task_controller_.reset(); |
| register_callbacks_.clear(); |
| @@ -897,6 +906,27 @@ GCMEventRouter* GCMProfileService::GetEventRouter(const std::string& app_id) |
| #endif |
| } |
| +void GCMProfileService::ReadRegisteredAppIDs() { |
| + const base::ListValue* app_id_list = |
| + profile_->GetPrefs()->GetList(prefs::kGCMApps); |
| + 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::kGCMApps, apps); |
| +} |
| + |
| void GCMProfileService::DeleteRegistrationInfo(const std::string& app_id) { |
| extensions::StateStore* storage = |
| extensions::ExtensionSystem::Get(profile_)->state_store(); |