OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/services/gcm/push_messaging_service_impl.h" | 5 #include "chrome/browser/services/gcm/push_messaging_service_impl.h" |
6 | 6 |
7 #include <bitset> | 7 #include <bitset> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 if (count <= 0) | 102 if (count <= 0) |
103 return; | 103 return; |
104 | 104 |
105 // Create the GCMProfileService, and hence instantiate this class. | 105 // Create the GCMProfileService, and hence instantiate this class. |
106 GCMProfileService* gcm_service = | 106 GCMProfileService* gcm_service = |
107 GCMProfileServiceFactory::GetForProfile(profile); | 107 GCMProfileServiceFactory::GetForProfile(profile); |
108 PushMessagingServiceImpl* push_service = | 108 PushMessagingServiceImpl* push_service = |
109 static_cast<PushMessagingServiceImpl*>( | 109 static_cast<PushMessagingServiceImpl*>( |
110 gcm_service->push_messaging_service()); | 110 gcm_service->push_messaging_service()); |
111 | 111 |
112 push_service->IncreasePushRegistrationCount(count); | 112 push_service->IncreasePushRegistrationCount(count, false /* is_pending */); |
113 } | 113 } |
114 | 114 |
115 PushMessagingServiceImpl::PushMessagingServiceImpl( | 115 PushMessagingServiceImpl::PushMessagingServiceImpl( |
116 GCMProfileService* gcm_profile_service, | 116 GCMProfileService* gcm_profile_service, |
117 Profile* profile) | 117 Profile* profile) |
118 : gcm_profile_service_(gcm_profile_service), | 118 : gcm_profile_service_(gcm_profile_service), |
119 profile_(profile), | 119 profile_(profile), |
120 push_registration_count_(0), | 120 push_registration_count_(0), |
| 121 pending_push_registration_count_(0), |
121 weak_factory_(this) { | 122 weak_factory_(this) { |
122 } | 123 } |
123 | 124 |
124 PushMessagingServiceImpl::~PushMessagingServiceImpl() { | 125 PushMessagingServiceImpl::~PushMessagingServiceImpl() { |
125 // TODO(johnme): If it's possible for this to be destroyed before GCMDriver, | 126 // TODO(johnme): If it's possible for this to be destroyed before GCMDriver, |
126 // then we should call RemoveAppHandler. | 127 // then we should call RemoveAppHandler. |
127 } | 128 } |
128 | 129 |
129 void PushMessagingServiceImpl::IncreasePushRegistrationCount(int add) { | 130 void PushMessagingServiceImpl::IncreasePushRegistrationCount(int add, |
| 131 bool is_pending) { |
130 DCHECK(add > 0); | 132 DCHECK(add > 0); |
131 if (push_registration_count_ == 0) { | 133 if (push_registration_count_ + pending_push_registration_count_ == 0) { |
132 gcm_profile_service_->driver()->AddAppHandler( | 134 gcm_profile_service_->driver()->AddAppHandler( |
133 kPushMessagingApplicationIdPrefix, this); | 135 kPushMessagingApplicationIdPrefix, this); |
134 } | 136 } |
135 push_registration_count_ += add; | 137 if (is_pending) { |
136 profile_->GetPrefs()->SetInteger(prefs::kPushMessagingRegistrationCount, | 138 pending_push_registration_count_ += add; |
137 push_registration_count_); | 139 } else { |
| 140 push_registration_count_ += add; |
| 141 profile_->GetPrefs()->SetInteger(prefs::kPushMessagingRegistrationCount, |
| 142 push_registration_count_); |
| 143 } |
138 } | 144 } |
139 | 145 |
140 void PushMessagingServiceImpl::DecreasePushRegistrationCount(int subtract) { | 146 void PushMessagingServiceImpl::DecreasePushRegistrationCount(int subtract, |
| 147 bool was_pending) { |
141 DCHECK(subtract > 0); | 148 DCHECK(subtract > 0); |
142 push_registration_count_ -= subtract; | 149 if (was_pending) { |
143 DCHECK(push_registration_count_ >= 0); | 150 pending_push_registration_count_ -= subtract; |
144 profile_->GetPrefs()->SetInteger(prefs::kPushMessagingRegistrationCount, | 151 DCHECK(pending_push_registration_count_ >= 0); |
145 push_registration_count_); | 152 } else { |
146 if (push_registration_count_ == 0) { | 153 push_registration_count_ -= subtract; |
| 154 DCHECK(push_registration_count_ >= 0); |
| 155 profile_->GetPrefs()->SetInteger(prefs::kPushMessagingRegistrationCount, |
| 156 push_registration_count_); |
| 157 } |
| 158 if (push_registration_count_ + pending_push_registration_count_ == 0) { |
147 gcm_profile_service_->driver()->RemoveAppHandler( | 159 gcm_profile_service_->driver()->RemoveAppHandler( |
148 kPushMessagingApplicationIdPrefix); | 160 kPushMessagingApplicationIdPrefix); |
149 } | 161 } |
150 } | 162 } |
151 | 163 |
152 bool PushMessagingServiceImpl::CanHandle(const std::string& app_id) const { | 164 bool PushMessagingServiceImpl::CanHandle(const std::string& app_id) const { |
153 return PushMessagingApplicationId::Parse(app_id).IsValid(); | 165 return PushMessagingApplicationId::Parse(app_id).IsValid(); |
154 } | 166 } |
155 | 167 |
156 void PushMessagingServiceImpl::ShutdownHandler() { | 168 void PushMessagingServiceImpl::ShutdownHandler() { |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 const content::PushMessagingService::RegisterCallback& callback) { | 428 const content::PushMessagingService::RegisterCallback& callback) { |
417 if (!gcm_profile_service_->driver()) { | 429 if (!gcm_profile_service_->driver()) { |
418 NOTREACHED() << "There is no GCMDriver. Has GCMProfileService shut down?"; | 430 NOTREACHED() << "There is no GCMDriver. Has GCMProfileService shut down?"; |
419 return; | 431 return; |
420 } | 432 } |
421 | 433 |
422 PushMessagingApplicationId application_id = PushMessagingApplicationId( | 434 PushMessagingApplicationId application_id = PushMessagingApplicationId( |
423 requesting_origin, service_worker_registration_id); | 435 requesting_origin, service_worker_registration_id); |
424 DCHECK(application_id.IsValid()); | 436 DCHECK(application_id.IsValid()); |
425 | 437 |
426 if (push_registration_count_ >= kMaxRegistrations) { | 438 if (push_registration_count_ + pending_push_registration_count_ |
| 439 >= kMaxRegistrations) { |
427 RegisterEnd(callback, | 440 RegisterEnd(callback, |
428 std::string(), | 441 std::string(), |
429 content::PUSH_REGISTRATION_STATUS_LIMIT_REACHED); | 442 content::PUSH_REGISTRATION_STATUS_LIMIT_REACHED); |
430 return; | 443 return; |
431 } | 444 } |
432 | 445 |
433 content::RenderFrameHost* render_frame_host = | 446 content::RenderFrameHost* render_frame_host = |
434 content::RenderFrameHost::FromID(renderer_id, render_frame_id); | 447 content::RenderFrameHost::FromID(renderer_id, render_frame_id); |
435 if (!render_frame_host) | 448 if (!render_frame_host) |
436 return; | 449 return; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
493 GURL embedding_origin = requesting_origin; | 506 GURL embedding_origin = requesting_origin; |
494 blink::WebPushPermissionStatus permission_status = | 507 blink::WebPushPermissionStatus permission_status = |
495 PushMessagingServiceImpl::GetPermissionStatus(requesting_origin, | 508 PushMessagingServiceImpl::GetPermissionStatus(requesting_origin, |
496 embedding_origin); | 509 embedding_origin); |
497 if (permission_status != blink::WebPushPermissionStatusGranted) { | 510 if (permission_status != blink::WebPushPermissionStatusGranted) { |
498 RegisterEnd(register_callback, std::string(), | 511 RegisterEnd(register_callback, std::string(), |
499 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED); | 512 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED); |
500 return; | 513 return; |
501 } | 514 } |
502 | 515 |
| 516 IncreasePushRegistrationCount(1, true /* is_pending */); |
503 std::vector<std::string> sender_ids(1, sender_id); | 517 std::vector<std::string> sender_ids(1, sender_id); |
504 gcm_profile_service_->driver()->Register( | 518 gcm_profile_service_->driver()->Register( |
505 application_id.ToString(), sender_ids, | 519 application_id.ToString(), sender_ids, |
506 base::Bind(&PushMessagingServiceImpl::DidRegister, | 520 base::Bind(&PushMessagingServiceImpl::DidRegister, |
507 weak_factory_.GetWeakPtr(), register_callback)); | 521 weak_factory_.GetWeakPtr(), register_callback)); |
508 } | 522 } |
509 | 523 |
510 blink::WebPushPermissionStatus PushMessagingServiceImpl::GetPermissionStatus( | 524 blink::WebPushPermissionStatus PushMessagingServiceImpl::GetPermissionStatus( |
511 const GURL& requesting_origin, | 525 const GURL& requesting_origin, |
512 const GURL& embedding_origin) { | 526 const GURL& embedding_origin) { |
513 PushMessagingPermissionContext* permission_context = | 527 PushMessagingPermissionContext* permission_context = |
514 PushMessagingPermissionContextFactory::GetForProfile(profile_); | 528 PushMessagingPermissionContextFactory::GetForProfile(profile_); |
515 return ToPushPermission(permission_context->GetPermissionStatus( | 529 return ToPushPermission(permission_context->GetPermissionStatus( |
516 requesting_origin, embedding_origin)); | 530 requesting_origin, embedding_origin)); |
517 } | 531 } |
518 | 532 |
519 void PushMessagingServiceImpl::RegisterEnd( | 533 void PushMessagingServiceImpl::RegisterEnd( |
520 const content::PushMessagingService::RegisterCallback& callback, | 534 const content::PushMessagingService::RegisterCallback& callback, |
521 const std::string& registration_id, | 535 const std::string& registration_id, |
522 content::PushRegistrationStatus status) { | 536 content::PushRegistrationStatus status) { |
523 callback.Run(registration_id, status); | 537 callback.Run(registration_id, status); |
524 if (status == content::PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE) | |
525 IncreasePushRegistrationCount(1); | |
526 } | 538 } |
527 | 539 |
528 void PushMessagingServiceImpl::DidRegister( | 540 void PushMessagingServiceImpl::DidRegister( |
529 const content::PushMessagingService::RegisterCallback& callback, | 541 const content::PushMessagingService::RegisterCallback& callback, |
530 const std::string& registration_id, | 542 const std::string& registration_id, |
531 GCMClient::Result result) { | 543 GCMClient::Result result) { |
532 content::PushRegistrationStatus status = | 544 content::PushRegistrationStatus status = |
533 result == GCMClient::SUCCESS | 545 content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR; |
534 ? content::PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE | 546 if (result == GCMClient::SUCCESS) { |
535 : content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR; | 547 status = content::PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE; |
| 548 IncreasePushRegistrationCount(1, false /* is_pending */); |
| 549 } |
536 RegisterEnd(callback, registration_id, status); | 550 RegisterEnd(callback, registration_id, status); |
| 551 DecreasePushRegistrationCount(1, true /* was_pending */); |
537 } | 552 } |
538 | 553 |
539 void PushMessagingServiceImpl::DidRequestPermission( | 554 void PushMessagingServiceImpl::DidRequestPermission( |
540 const PushMessagingApplicationId& application_id, | 555 const PushMessagingApplicationId& application_id, |
541 const std::string& sender_id, | 556 const std::string& sender_id, |
542 const content::PushMessagingService::RegisterCallback& register_callback, | 557 const content::PushMessagingService::RegisterCallback& register_callback, |
543 bool allow) { | 558 bool allow) { |
544 if (!allow) { | 559 if (!allow) { |
545 RegisterEnd(register_callback, | 560 RegisterEnd(register_callback, |
546 std::string(), | 561 std::string(), |
547 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED); | 562 content::PUSH_REGISTRATION_STATUS_PERMISSION_DENIED); |
548 return; | 563 return; |
549 } | 564 } |
550 | 565 |
551 // The GCMDriver could be NULL if GCMProfileService has been shut down. | 566 // The GCMDriver could be NULL if GCMProfileService has been shut down. |
552 if (!gcm_profile_service_->driver()) | 567 if (!gcm_profile_service_->driver()) |
553 return; | 568 return; |
554 | 569 |
| 570 IncreasePushRegistrationCount(1, true /* is_pending */); |
555 std::vector<std::string> sender_ids(1, sender_id); | 571 std::vector<std::string> sender_ids(1, sender_id); |
556 | |
557 gcm_profile_service_->driver()->Register( | 572 gcm_profile_service_->driver()->Register( |
558 application_id.ToString(), | 573 application_id.ToString(), |
559 sender_ids, | 574 sender_ids, |
560 base::Bind(&PushMessagingServiceImpl::DidRegister, | 575 base::Bind(&PushMessagingServiceImpl::DidRegister, |
561 weak_factory_.GetWeakPtr(), | 576 weak_factory_.GetWeakPtr(), |
562 register_callback)); | 577 register_callback)); |
563 } | 578 } |
564 | 579 |
565 void PushMessagingServiceImpl::Unregister( | 580 void PushMessagingServiceImpl::Unregister( |
566 const GURL& requesting_origin, | 581 const GURL& requesting_origin, |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 callback.Run(content::PUSH_UNREGISTRATION_STATUS_UNKNOWN_ERROR); | 622 callback.Run(content::PUSH_UNREGISTRATION_STATUS_UNKNOWN_ERROR); |
608 break; | 623 break; |
609 default: | 624 default: |
610 NOTREACHED() << "Unexpected GCMClient::Result value."; | 625 NOTREACHED() << "Unexpected GCMClient::Result value."; |
611 callback.Run(content::PUSH_UNREGISTRATION_STATUS_UNKNOWN_ERROR); | 626 callback.Run(content::PUSH_UNREGISTRATION_STATUS_UNKNOWN_ERROR); |
612 break; | 627 break; |
613 } | 628 } |
614 } | 629 } |
615 | 630 |
616 if (result == GCMClient::SUCCESS) | 631 if (result == GCMClient::SUCCESS) |
617 DecreasePushRegistrationCount(1); | 632 DecreasePushRegistrationCount(1, false /* was_pending */); |
618 } | 633 } |
619 | 634 |
620 bool PushMessagingServiceImpl::HasPermission(const GURL& origin) { | 635 bool PushMessagingServiceImpl::HasPermission(const GURL& origin) { |
621 gcm::PushMessagingPermissionContext* permission_context = | 636 gcm::PushMessagingPermissionContext* permission_context = |
622 gcm::PushMessagingPermissionContextFactory::GetForProfile(profile_); | 637 gcm::PushMessagingPermissionContextFactory::GetForProfile(profile_); |
623 DCHECK(permission_context); | 638 DCHECK(permission_context); |
624 | 639 |
625 return permission_context->GetPermissionStatus(origin, origin) == | 640 return permission_context->GetPermissionStatus(origin, origin) == |
626 CONTENT_SETTING_ALLOW; | 641 CONTENT_SETTING_ALLOW; |
627 } | 642 } |
628 | 643 |
629 } // namespace gcm | 644 } // namespace gcm |
OLD | NEW |