| Index: chrome/browser/services/gcm/push_messaging_service_impl.cc
|
| diff --git a/chrome/browser/services/gcm/push_messaging_service_impl.cc b/chrome/browser/services/gcm/push_messaging_service_impl.cc
|
| index 4860db7cb801f619cf61391739c8ccb5a9795d68..e8d111b8b44e77a8d4e09857a9b96f6732ecea55 100644
|
| --- a/chrome/browser/services/gcm/push_messaging_service_impl.cc
|
| +++ b/chrome/browser/services/gcm/push_messaging_service_impl.cc
|
| @@ -109,7 +109,7 @@ void PushMessagingServiceImpl::InitializeForProfile(Profile* profile) {
|
| static_cast<PushMessagingServiceImpl*>(
|
| gcm_service->push_messaging_service());
|
|
|
| - push_service->IncreasePushRegistrationCount(count);
|
| + push_service->IncreasePushRegistrationCount(count, false /* is_pending */);
|
| }
|
|
|
| PushMessagingServiceImpl::PushMessagingServiceImpl(
|
| @@ -118,6 +118,7 @@ PushMessagingServiceImpl::PushMessagingServiceImpl(
|
| : gcm_profile_service_(gcm_profile_service),
|
| profile_(profile),
|
| push_registration_count_(0),
|
| + pending_push_registration_count_(0),
|
| weak_factory_(this) {
|
| }
|
|
|
| @@ -126,24 +127,35 @@ PushMessagingServiceImpl::~PushMessagingServiceImpl() {
|
| // then we should call RemoveAppHandler.
|
| }
|
|
|
| -void PushMessagingServiceImpl::IncreasePushRegistrationCount(int add) {
|
| +void PushMessagingServiceImpl::IncreasePushRegistrationCount(int add,
|
| + bool is_pending) {
|
| DCHECK(add > 0);
|
| - if (push_registration_count_ == 0) {
|
| + if (push_registration_count_ + pending_push_registration_count_ == 0) {
|
| gcm_profile_service_->driver()->AddAppHandler(
|
| kPushMessagingApplicationIdPrefix, this);
|
| }
|
| - push_registration_count_ += add;
|
| - profile_->GetPrefs()->SetInteger(prefs::kPushMessagingRegistrationCount,
|
| - push_registration_count_);
|
| + if (is_pending) {
|
| + pending_push_registration_count_ += add;
|
| + } else {
|
| + push_registration_count_ += add;
|
| + profile_->GetPrefs()->SetInteger(prefs::kPushMessagingRegistrationCount,
|
| + push_registration_count_);
|
| + }
|
| }
|
|
|
| -void PushMessagingServiceImpl::DecreasePushRegistrationCount(int subtract) {
|
| +void PushMessagingServiceImpl::DecreasePushRegistrationCount(int subtract,
|
| + bool was_pending) {
|
| DCHECK(subtract > 0);
|
| - push_registration_count_ -= subtract;
|
| - DCHECK(push_registration_count_ >= 0);
|
| - profile_->GetPrefs()->SetInteger(prefs::kPushMessagingRegistrationCount,
|
| - push_registration_count_);
|
| - if (push_registration_count_ == 0) {
|
| + if (was_pending) {
|
| + pending_push_registration_count_ -= subtract;
|
| + DCHECK(pending_push_registration_count_ >= 0);
|
| + } else {
|
| + push_registration_count_ -= subtract;
|
| + DCHECK(push_registration_count_ >= 0);
|
| + profile_->GetPrefs()->SetInteger(prefs::kPushMessagingRegistrationCount,
|
| + push_registration_count_);
|
| + }
|
| + if (push_registration_count_ + pending_push_registration_count_ == 0) {
|
| gcm_profile_service_->driver()->RemoveAppHandler(
|
| kPushMessagingApplicationIdPrefix);
|
| }
|
| @@ -423,7 +435,8 @@ void PushMessagingServiceImpl::RegisterFromDocument(
|
| requesting_origin, service_worker_registration_id);
|
| DCHECK(application_id.IsValid());
|
|
|
| - if (push_registration_count_ >= kMaxRegistrations) {
|
| + if (push_registration_count_ + pending_push_registration_count_
|
| + >= kMaxRegistrations) {
|
| RegisterEnd(callback,
|
| std::string(),
|
| content::PUSH_REGISTRATION_STATUS_LIMIT_REACHED);
|
| @@ -500,6 +513,7 @@ void PushMessagingServiceImpl::RegisterFromWorker(
|
| return;
|
| }
|
|
|
| + IncreasePushRegistrationCount(1, true /* is_pending */);
|
| std::vector<std::string> sender_ids(1, sender_id);
|
| gcm_profile_service_->driver()->Register(
|
| application_id.ToString(), sender_ids,
|
| @@ -521,8 +535,6 @@ void PushMessagingServiceImpl::RegisterEnd(
|
| const std::string& registration_id,
|
| content::PushRegistrationStatus status) {
|
| callback.Run(registration_id, status);
|
| - if (status == content::PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE)
|
| - IncreasePushRegistrationCount(1);
|
| }
|
|
|
| void PushMessagingServiceImpl::DidRegister(
|
| @@ -530,10 +542,13 @@ void PushMessagingServiceImpl::DidRegister(
|
| const std::string& registration_id,
|
| GCMClient::Result result) {
|
| content::PushRegistrationStatus status =
|
| - result == GCMClient::SUCCESS
|
| - ? content::PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE
|
| - : content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR;
|
| + content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR;
|
| + if (result == GCMClient::SUCCESS) {
|
| + status = content::PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE;
|
| + IncreasePushRegistrationCount(1, false /* is_pending */);
|
| + }
|
| RegisterEnd(callback, registration_id, status);
|
| + DecreasePushRegistrationCount(1, true /* was_pending */);
|
| }
|
|
|
| void PushMessagingServiceImpl::DidRequestPermission(
|
| @@ -552,8 +567,8 @@ void PushMessagingServiceImpl::DidRequestPermission(
|
| if (!gcm_profile_service_->driver())
|
| return;
|
|
|
| + IncreasePushRegistrationCount(1, true /* is_pending */);
|
| std::vector<std::string> sender_ids(1, sender_id);
|
| -
|
| gcm_profile_service_->driver()->Register(
|
| application_id.ToString(),
|
| sender_ids,
|
| @@ -614,7 +629,7 @@ void PushMessagingServiceImpl::DidUnregister(
|
| }
|
|
|
| if (result == GCMClient::SUCCESS)
|
| - DecreasePushRegistrationCount(1);
|
| + DecreasePushRegistrationCount(1, false /* was_pending */);
|
| }
|
|
|
| bool PushMessagingServiceImpl::HasPermission(const GURL& origin) {
|
|
|