Index: chrome/browser/push_messaging/push_messaging_service_impl.cc |
diff --git a/chrome/browser/push_messaging/push_messaging_service_impl.cc b/chrome/browser/push_messaging/push_messaging_service_impl.cc |
index b01f0aaf01091c9a27322bd4771c75819d559207..980a626760d8278500f99ef49a99d3cee42cf691 100644 |
--- a/chrome/browser/push_messaging/push_messaging_service_impl.cc |
+++ b/chrome/browser/push_messaging/push_messaging_service_impl.cc |
@@ -277,12 +277,34 @@ void PushMessagingServiceImpl::OnMessage(const std::string& app_id, |
content::PUSH_DELIVERY_STATUS_UNKNOWN_APP_ID); |
return; |
} |
- // Drop message and unregister if |origin| has lost push permission. |
- if (!IsPermissionSet(app_identifier.origin())) { |
johnme
2017/05/31 13:56:06
Optional: since you're removing the second last us
Peter Beverloo
2017/06/02 13:43:37
Done.
|
+ |
+ // Drop message and unregister if |origin| has lost push permission. However, |
+ // we should only drop the subscription if the permission was in fact denied |
+ // rather than suspended, for example through the kill switch. |
+ PermissionResult permission_result = |
+ PermissionManager::Get(profile_)->GetPermissionStatus( |
+ CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, app_identifier.origin(), |
+ app_identifier.origin()); |
+ |
+ if (permission_result.content_setting != CONTENT_SETTING_ALLOW) { |
+ content::PushDeliveryStatus status = |
+ content::PUSH_DELIVERY_STATUS_PERMISSION_DENIED; |
+ |
+ switch (permission_result.source) { |
+ case PermissionStatusSource::KILL_SWITCH: |
+ status = content::PUSH_DELIVERY_STATUS_PERMISSION_SUSPENDED; |
+ break; |
+ case PermissionStatusSource::UNSPECIFIED: |
+ case PermissionStatusSource::SAFE_BROWSING_BLACKLIST: |
+ case PermissionStatusSource::MULTIPLE_DISMISSALS: |
+ case PermissionStatusSource::MULTIPLE_IGNORES: |
+ status = content::PUSH_DELIVERY_STATUS_PERMISSION_DENIED; |
+ break; |
+ } |
+ |
DeliverMessageCallback(app_id, app_identifier.origin(), |
app_identifier.service_worker_registration_id(), |
- message, message_handled_closure, |
- content::PUSH_DELIVERY_STATUS_PERMISSION_DENIED); |
+ message, message_handled_closure, status); |
return; |
} |
@@ -369,6 +391,9 @@ void PushMessagingServiceImpl::DeliverMessageCallback( |
unsubscribe_reason = |
content::PUSH_UNREGISTRATION_REASON_DELIVERY_PERMISSION_DENIED; |
break; |
+ case content::PUSH_DELIVERY_STATUS_PERMISSION_SUSPENDED: |
+ // Do nothing, the kill switch might be withdrawn at some point. |
+ break; |
case content::PUSH_DELIVERY_STATUS_NO_SERVICE_WORKER: |
unsubscribe_reason = |
content::PUSH_UNREGISTRATION_REASON_DELIVERY_NO_SERVICE_WORKER; |