Chromium Code Reviews| Index: content/browser/push_messaging/push_messaging_message_filter.cc |
| diff --git a/content/browser/push_messaging/push_messaging_message_filter.cc b/content/browser/push_messaging/push_messaging_message_filter.cc |
| index 31ddbb504e839f9b911b5aa2fe063e6634937216..cb40cb08c9e341f0dc21e835e4063ac1e3e07104 100644 |
| --- a/content/browser/push_messaging/push_messaging_message_filter.cc |
| +++ b/content/browser/push_messaging/push_messaging_message_filter.cc |
| @@ -36,8 +36,9 @@ |
| namespace content { |
| // Service Worker database keys. If a registration ID is stored, the stored |
| -// sender ID must be the one used to subscribe. Unfortunately, this isn't always |
| -// true of subscriptions previously stored in the database. |
| +// sender ID must be the one used to register. Unfortunately, this isn't always |
| +// true of pre-InstanceID registrations previously stored in the database, but |
| +// fortunately it's less important for their sender ID to be accurate. |
| const char kPushSenderIdServiceWorkerKey[] = "push_sender_id"; |
| const char kPushRegistrationIdServiceWorkerKey[] = "push_registration_id"; |
| @@ -136,6 +137,7 @@ class PushMessagingMessageFilter::Core { |
| void GetEncryptionInfoOnUI( |
| const GURL& origin, |
| int64_t service_worker_registration_id, |
| + const std::string& sender_id, |
| const PushMessagingService::EncryptionInfoCallback& io_thread_callback); |
| // Called (directly) from both the UI and IO threads. |
| @@ -304,7 +306,8 @@ void PushMessagingMessageFilter::DidCheckForExistingRegistration( |
| BrowserThread::UI, FROM_HERE, |
| base::Bind(&Core::GetEncryptionInfoOnUI, |
| base::Unretained(ui_core_.get()), data.requesting_origin, |
| - data.service_worker_registration_id, callback)); |
| + data.service_worker_registration_id, |
| + data.options.sender_info, callback)); |
| return; |
| } |
| // TODO(johnme): The spec allows the register algorithm to reject with an |
| @@ -365,6 +368,8 @@ void PushMessagingMessageFilter::Core::RegisterOnUI( |
| PushMessagingService* push_service = service(); |
| if (!push_service) { |
| if (!is_incognito()) { |
| + // This might happen if InstanceIDProfileService::IsInstanceIDEnabled |
| + // returns false because the Instance ID kill switch was enabled. |
| // TODO(johnme): Might be better not to expose the API in this case. |
| BrowserThread::PostTask( |
| BrowserThread::IO, FROM_HERE, |
| @@ -724,45 +729,25 @@ void PushMessagingMessageFilter::OnGetSubscription( |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| // TODO(johnme): Validate arguments? |
| service_worker_context_->GetRegistrationUserData( |
| - service_worker_registration_id, {kPushSenderIdServiceWorkerKey}, |
| - base::Bind(&PushMessagingMessageFilter::DidGetSenderInfo, |
| - weak_factory_io_to_io_.GetWeakPtr(), request_id, |
| - service_worker_registration_id)); |
| -} |
| - |
| -void PushMessagingMessageFilter::DidGetSenderInfo( |
| - int request_id, |
| - int64_t service_worker_registration_id, |
| - const std::vector<std::string>& sender_info, |
| - ServiceWorkerStatusCode status) { |
| - DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - if (status != SERVICE_WORKER_OK || sender_info.size() != 1) { |
| - DidGetSubscription(request_id, service_worker_registration_id, |
| - false /* uses_standard_protocol */, |
| - std::vector<std::string>() /* push_subscription_id */, |
| - status); |
| - return; |
| - } |
| - |
| - const bool uses_standard_protocol = IsApplicationServerKey(sender_info[0]); |
| - service_worker_context_->GetRegistrationUserData( |
| - service_worker_registration_id, {kPushRegistrationIdServiceWorkerKey}, |
| + service_worker_registration_id, |
| + {kPushRegistrationIdServiceWorkerKey, kPushSenderIdServiceWorkerKey}, |
| base::Bind(&PushMessagingMessageFilter::DidGetSubscription, |
| weak_factory_io_to_io_.GetWeakPtr(), request_id, |
| - service_worker_registration_id, uses_standard_protocol)); |
| + service_worker_registration_id)); |
| } |
| void PushMessagingMessageFilter::DidGetSubscription( |
| int request_id, |
| int64_t service_worker_registration_id, |
| - bool uses_standard_protocol, |
| - const std::vector<std::string>& push_subscription_id, |
| + const std::vector<std::string>& push_subscription_id_and_sender_info, |
|
Peter Beverloo
2016/06/02 15:53:18
nit: subscription_info?
johnme
2016/06/07 14:16:43
I like that you can tell exactly what e.g. push_su
|
| ServiceWorkerStatusCode service_worker_status) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| PushGetRegistrationStatus get_status = |
| PUSH_GETREGISTRATION_STATUS_STORAGE_ERROR; |
| switch (service_worker_status) { |
| case SERVICE_WORKER_OK: { |
| + DCHECK_EQ(2u, push_subscription_id_and_sender_info.size()); |
| + |
| if (!service_available_) { |
| // Return not found in incognito mode, so websites can't detect it. |
| get_status = |
| @@ -775,11 +760,12 @@ void PushMessagingMessageFilter::DidGetSubscription( |
| ServiceWorkerRegistration* registration = |
| service_worker_context_->GetLiveRegistration( |
| service_worker_registration_id); |
| - |
| const GURL origin = registration->pattern().GetOrigin(); |
| - DCHECK_EQ(1u, push_subscription_id.size()); |
| - const GURL endpoint = |
| - CreateEndpoint(uses_standard_protocol, push_subscription_id[0]); |
| + |
| + const bool uses_standard_protocol = |
| + IsApplicationServerKey(push_subscription_id_and_sender_info[1]); |
| + const GURL endpoint = CreateEndpoint( |
| + uses_standard_protocol, push_subscription_id_and_sender_info[0]); |
| auto callback = |
| base::Bind(&PushMessagingMessageFilter::DidGetSubscriptionKeys, |
| @@ -789,7 +775,8 @@ void PushMessagingMessageFilter::DidGetSubscription( |
| BrowserThread::UI, FROM_HERE, |
| base::Bind(&Core::GetEncryptionInfoOnUI, |
| base::Unretained(ui_core_.get()), origin, |
| - service_worker_registration_id, callback)); |
| + service_worker_registration_id, |
| + push_subscription_id_and_sender_info[1], callback)); |
| return; |
| } |
| @@ -909,12 +896,13 @@ void PushMessagingMessageFilter::Core::GetPermissionStatusOnUI( |
| void PushMessagingMessageFilter::Core::GetEncryptionInfoOnUI( |
| const GURL& origin, |
| int64_t service_worker_registration_id, |
| + const std::string& sender_id, |
| const PushMessagingService::EncryptionInfoCallback& io_thread_callback) { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| PushMessagingService* push_service = service(); |
| if (push_service) { |
| push_service->GetEncryptionInfo( |
| - origin, service_worker_registration_id, |
| + origin, service_worker_registration_id, sender_id, |
| base::Bind(&ForwardEncryptionInfoToIOThreadProxy, io_thread_callback)); |
| return; |
| } |