| 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 75f92fdcf475587e576a36b485fcae85a3953eae..c11dae7ff3c16cb72e0677e0f194dd1a6675310d 100644
|
| --- a/chrome/browser/services/gcm/push_messaging_service_impl.cc
|
| +++ b/chrome/browser/services/gcm/push_messaging_service_impl.cc
|
| @@ -180,6 +180,8 @@ void PushMessagingServiceImpl::ShutdownHandler() {
|
| // TODO(johnme): Do any necessary cleanup.
|
| }
|
|
|
| +// OnMessage methods -----------------------------------------------------------
|
| +
|
| void PushMessagingServiceImpl::OnMessage(
|
| const std::string& app_id,
|
| const GCMClient::IncomingMessage& message) {
|
| @@ -235,42 +237,6 @@ void PushMessagingServiceImpl::OnMessage(
|
| application_id.service_worker_registration_id(), message));
|
| }
|
|
|
| -void PushMessagingServiceImpl::OnContentSettingChanged(
|
| - const ContentSettingsPattern& primary_pattern,
|
| - const ContentSettingsPattern& secondary_pattern,
|
| - ContentSettingsType content_type,
|
| - std::string resource_identifier) {
|
| - if (content_type != CONTENT_SETTINGS_TYPE_PUSH_MESSAGING &&
|
| - content_type != CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {
|
| - return;
|
| - }
|
| -
|
| - for (const auto& id : PushMessagingApplicationId::GetAll(profile_)) {
|
| - // If |primary_pattern| is not valid, we should always check for a
|
| - // permission change because it can happen for example when the entire
|
| - // Push or Notifications permissions are cleared.
|
| - // Otherwise, the permission should be checked if the pattern matches the
|
| - // origin.
|
| - if (primary_pattern.IsValid() && !primary_pattern.Matches(id.origin()))
|
| - continue;
|
| -
|
| - if (HasPermission(id.origin()))
|
| - continue;
|
| -
|
| - // Unregister the PushMessagingApplicationId with the push service.
|
| - Unregister(id.app_id_guid(), true /* retry */, UnregisterCallback());
|
| -
|
| - // Clear the associated service worker push registration id.
|
| - PushMessagingService::ClearPushRegistrationID(
|
| - profile_, id.origin(), id.service_worker_registration_id());
|
| - }
|
| -}
|
| -
|
| -void PushMessagingServiceImpl::SetProfileForTesting(Profile* profile) {
|
| - profile_ = profile;
|
| - profile_->GetHostContentSettingsMap()->AddObserver(this);
|
| -}
|
| -
|
| void PushMessagingServiceImpl::DeliverMessageCallback(
|
| const std::string& app_id_guid,
|
| const GURL& requesting_origin,
|
| @@ -295,7 +261,8 @@ void PushMessagingServiceImpl::DeliverMessageCallback(
|
| case content::PUSH_DELIVERY_STATUS_UNKNOWN_APP_ID:
|
| case content::PUSH_DELIVERY_STATUS_PERMISSION_DENIED:
|
| case content::PUSH_DELIVERY_STATUS_NO_SERVICE_WORKER:
|
| - Unregister(app_id_guid, true /*retry_on_failure*/, UnregisterCallback());
|
| + Unregister(app_id_guid, message.sender_id, true /* retry_on_failure */,
|
| + UnregisterCallback());
|
| break;
|
| }
|
| }
|
| @@ -462,6 +429,8 @@ void PushMessagingServiceImpl::DidGetNotificationsShown(
|
| }
|
| }
|
|
|
| +// Other GCMAppHandler methods -------------------------------------------------
|
| +
|
| void PushMessagingServiceImpl::OnMessagesDeleted(const std::string& app_id) {
|
| // TODO(mvanouwerkerk): Fire push error event on the Service Worker
|
| // corresponding to app_id.
|
| @@ -479,10 +448,14 @@ void PushMessagingServiceImpl::OnSendAcknowledged(
|
| NOTREACHED() << "The Push API shouldn't have sent messages upstream";
|
| }
|
|
|
| +// GetPushEndpoint method ------------------------------------------------------
|
| +
|
| GURL PushMessagingServiceImpl::GetPushEndpoint() {
|
| return GURL(std::string(kPushMessagingEndpoint));
|
| }
|
|
|
| +// Register and GetPermissionStatus methods ------------------------------------
|
| +
|
| void PushMessagingServiceImpl::RegisterFromDocument(
|
| const GURL& requesting_origin,
|
| int64 service_worker_registration_id,
|
| @@ -647,9 +620,12 @@ void PushMessagingServiceImpl::DidRequestPermission(
|
| application_id, register_callback));
|
| }
|
|
|
| +// Unregister methods ----------------------------------------------------------
|
| +
|
| void PushMessagingServiceImpl::Unregister(
|
| const GURL& requesting_origin,
|
| int64 service_worker_registration_id,
|
| + const std::string& sender_id,
|
| bool retry_on_failure,
|
| const content::PushMessagingService::UnregisterCallback& callback) {
|
| DCHECK(gcm_profile_service_->driver());
|
| @@ -664,11 +640,13 @@ void PushMessagingServiceImpl::Unregister(
|
| return;
|
| }
|
|
|
| - Unregister(application_id.app_id_guid(), retry_on_failure, callback);
|
| + Unregister(application_id.app_id_guid(), sender_id, retry_on_failure,
|
| + callback);
|
| }
|
|
|
| void PushMessagingServiceImpl::Unregister(
|
| const std::string& app_id_guid,
|
| + const std::string& sender_id,
|
| bool retry_on_failure,
|
| const content::PushMessagingService::UnregisterCallback& callback) {
|
| DCHECK(gcm_profile_service_->driver());
|
| @@ -684,11 +662,17 @@ void PushMessagingServiceImpl::Unregister(
|
| application_id.DeleteFromDisk(profile_);
|
| }
|
|
|
| - gcm_profile_service_->driver()->Unregister(
|
| - app_id_guid,
|
| + const auto& unregister_callback =
|
| base::Bind(&PushMessagingServiceImpl::DidUnregister,
|
| weak_factory_.GetWeakPtr(),
|
| - app_id_guid, retry_on_failure, callback));
|
| + app_id_guid, retry_on_failure, callback);
|
| +#if defined(OS_ANDROID)
|
| + // On Android the backend is different, and requires the original sender_id.
|
| + gcm_profile_service_->driver()->UnregisterWithSenderId(app_id_guid, sender_id,
|
| + unregister_callback);
|
| +#else
|
| + gcm_profile_service_->driver()->Unregister(app_id_guid, unregister_callback);
|
| +#endif
|
| }
|
|
|
| void PushMessagingServiceImpl::DidUnregister(
|
| @@ -740,6 +724,52 @@ void PushMessagingServiceImpl::DidUnregister(
|
| }
|
| }
|
|
|
| +// OnContentSettingChanged methods ---------------------------------------------
|
| +
|
| +void PushMessagingServiceImpl::OnContentSettingChanged(
|
| + const ContentSettingsPattern& primary_pattern,
|
| + const ContentSettingsPattern& secondary_pattern,
|
| + ContentSettingsType content_type,
|
| + std::string resource_identifier) {
|
| + if (content_type != CONTENT_SETTINGS_TYPE_PUSH_MESSAGING &&
|
| + content_type != CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {
|
| + return;
|
| + }
|
| +
|
| + for (const auto& id : PushMessagingApplicationId::GetAll(profile_)) {
|
| + // If |primary_pattern| is not valid, we should always check for a
|
| + // permission change because it can happen for example when the entire
|
| + // Push or Notifications permissions are cleared.
|
| + // Otherwise, the permission should be checked if the pattern matches the
|
| + // origin.
|
| + if (primary_pattern.IsValid() && !primary_pattern.Matches(id.origin()))
|
| + continue;
|
| +
|
| + if (HasPermission(id.origin()))
|
| + continue;
|
| +
|
| + PushMessagingService::GetSenderId(
|
| + profile_, id.origin(), id.service_worker_registration_id(),
|
| + base::Bind(
|
| + &PushMessagingServiceImpl::UnregisterBecausePermissionRevoked,
|
| + weak_factory_.GetWeakPtr(), id));
|
| + }
|
| +}
|
| +
|
| +void PushMessagingServiceImpl::UnregisterBecausePermissionRevoked(
|
| + const PushMessagingApplicationId& id,
|
| + const std::string& sender_id, bool success, bool not_found) {
|
| + // Unregister the PushMessagingApplicationId with the push service.
|
| + Unregister(id.app_id_guid(), sender_id, true /* retry_on_failure */,
|
| + UnregisterCallback());
|
| +
|
| + // Clear the associated service worker push registration id.
|
| + PushMessagingService::ClearPushRegistrationID(
|
| + profile_, id.origin(), id.service_worker_registration_id());
|
| +}
|
| +
|
| +// Helper methods --------------------------------------------------------------
|
| +
|
| bool PushMessagingServiceImpl::HasPermission(const GURL& origin) {
|
| gcm::PushMessagingPermissionContext* permission_context =
|
| gcm::PushMessagingPermissionContextFactory::GetForProfile(profile_);
|
| @@ -749,4 +779,9 @@ bool PushMessagingServiceImpl::HasPermission(const GURL& origin) {
|
| CONTENT_SETTING_ALLOW;
|
| }
|
|
|
| +void PushMessagingServiceImpl::SetProfileForTesting(Profile* profile) {
|
| + profile_ = profile;
|
| + profile_->GetHostContentSettingsMap()->AddObserver(this);
|
| +}
|
| +
|
| } // namespace gcm
|
|
|