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 844b7242e7a8be252064b4677b0600e4de07de11..be6a601566d0178e53c8457937af66b69bb05f93 100644 |
| --- a/content/browser/push_messaging/push_messaging_message_filter.cc |
| +++ b/content/browser/push_messaging/push_messaging_message_filter.cc |
| @@ -9,6 +9,7 @@ |
| #include "base/bind.h" |
| #include "base/bind_helpers.h" |
| +#include "base/command_line.h" |
| #include "base/logging.h" |
| #include "base/macros.h" |
| #include "base/metrics/histogram.h" |
| @@ -27,12 +28,14 @@ |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/common/child_process_host.h" |
| #include "content/public/common/console_message_level.h" |
| +#include "content/public/common/content_switches.h" |
| #include "content/public/common/push_messaging_status.h" |
| #include "third_party/WebKit/public/platform/modules/push_messaging/WebPushPermissionStatus.h" |
| namespace content { |
| const char kPushSenderIdServiceWorkerKey[] = "push_sender_id"; |
| +const char kPushSenderKeyServiceWorkerKey[] = "push_sender_public_key"; |
| const char kPushRegistrationIdServiceWorkerKey[] = "push_registration_id"; |
| namespace { |
| @@ -250,8 +253,7 @@ bool PushMessagingMessageFilter::OnMessageReceived( |
| void PushMessagingMessageFilter::OnSubscribeFromDocument( |
| int render_frame_id, |
| int request_id, |
| - const std::string& sender_id, |
| - bool user_visible, |
| + const PushSubscriptionOptions& options, |
| int64_t service_worker_registration_id) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| // TODO(mvanouwerkerk): Validate arguments? |
| @@ -259,7 +261,7 @@ void PushMessagingMessageFilter::OnSubscribeFromDocument( |
| data.request_id = request_id; |
| data.service_worker_registration_id = service_worker_registration_id; |
| data.render_frame_id = render_frame_id; |
| - data.user_visible = user_visible; |
| + data.user_visible = options.user_visible_only; |
| ServiceWorkerRegistration* service_worker_registration = |
| service_worker_context_->GetLiveRegistration( |
| @@ -271,22 +273,29 @@ void PushMessagingMessageFilter::OnSubscribeFromDocument( |
| } |
| data.requesting_origin = service_worker_registration->pattern().GetOrigin(); |
| + if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kEnableExperimentalWebPlatformFeatures)) |
| + DCHECK(!options.using_public_key); |
| + |
| + const std::string key = options.using_public_key |
| + ? kPushSenderKeyServiceWorkerKey |
| + : kPushSenderIdServiceWorkerKey; |
|
Peter Beverloo
2016/02/18 11:39:43
Why would we store the values differently?
Theore
harkness
2016/02/22 15:40:43
Done.
|
| service_worker_context_->StoreRegistrationUserData( |
| - service_worker_registration_id, data.requesting_origin, |
| - kPushSenderIdServiceWorkerKey, sender_id, |
| - base::Bind(&PushMessagingMessageFilter::DidPersistSenderId, |
| - weak_factory_io_to_io_.GetWeakPtr(), data, sender_id)); |
| + service_worker_registration_id, data.requesting_origin, key, |
| + options.sender_info, |
| + base::Bind(&PushMessagingMessageFilter::DidPersistSenderInfo, |
| + weak_factory_io_to_io_.GetWeakPtr(), data, options)); |
| } |
| void PushMessagingMessageFilter::OnSubscribeFromWorker( |
| int request_id, |
| int64_t service_worker_registration_id, |
| - bool user_visible) { |
| + const PushSubscriptionOptions& options) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| RegisterData data; |
| data.request_id = request_id; |
| data.service_worker_registration_id = service_worker_registration_id; |
| - data.user_visible = user_visible; |
| + data.user_visible = options.user_visible_only; |
| ServiceWorkerRegistration* service_worker_registration = |
| service_worker_context_->GetLiveRegistration( |
| @@ -297,34 +306,35 @@ void PushMessagingMessageFilter::OnSubscribeFromWorker( |
| } |
| data.requesting_origin = service_worker_registration->pattern().GetOrigin(); |
| - // This sender_id will be ignored; instead it will be fetched from storage. |
| - CheckForExistingRegistration(data, std::string() /* sender_id */); |
| + // This sender_info in options will be ignored; instead it will be fetched |
|
Peter Beverloo
2016/02/18 11:39:43
This is not correct anymore, if |options.sender_in
harkness
2016/02/22 15:40:43
I updated the comment to be correct. My assumption
|
| + // from storage. |
| + CheckForExistingRegistration(data, PushSubscriptionOptions()); |
| } |
| -void PushMessagingMessageFilter::DidPersistSenderId( |
| +void PushMessagingMessageFilter::DidPersistSenderInfo( |
| const RegisterData& data, |
| - const std::string& sender_id, |
| + const PushSubscriptionOptions& options, |
| ServiceWorkerStatusCode service_worker_status) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| if (service_worker_status != SERVICE_WORKER_OK) |
| SendSubscriptionError(data, PUSH_REGISTRATION_STATUS_STORAGE_ERROR); |
| else |
| - CheckForExistingRegistration(data, sender_id); |
| + CheckForExistingRegistration(data, options); |
| } |
| void PushMessagingMessageFilter::CheckForExistingRegistration( |
| const RegisterData& data, |
| - const std::string& sender_id) { |
| + const PushSubscriptionOptions& options) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| service_worker_context_->GetRegistrationUserData( |
| data.service_worker_registration_id, kPushRegistrationIdServiceWorkerKey, |
| base::Bind(&PushMessagingMessageFilter::DidCheckForExistingRegistration, |
| - weak_factory_io_to_io_.GetWeakPtr(), data, sender_id)); |
| + weak_factory_io_to_io_.GetWeakPtr(), data, options)); |
| } |
| void PushMessagingMessageFilter::DidCheckForExistingRegistration( |
| const RegisterData& data, |
| - const std::string& sender_id, |
| + const PushSubscriptionOptions& options, |
| const std::string& push_registration_id, |
| ServiceWorkerStatusCode service_worker_status) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| @@ -349,12 +359,20 @@ void PushMessagingMessageFilter::DidCheckForExistingRegistration( |
| BrowserThread::PostTask( |
| BrowserThread::UI, FROM_HERE, |
| base::Bind(&Core::RegisterOnUI, base::Unretained(ui_core_.get()), data, |
| - sender_id)); |
| + options.sender_info)); |
| } else { |
| - service_worker_context_->GetRegistrationUserData( |
| - data.service_worker_registration_id, kPushSenderIdServiceWorkerKey, |
| - base::Bind(&PushMessagingMessageFilter::DidGetSenderIdFromStorage, |
| - weak_factory_io_to_io_.GetWeakPtr(), data)); |
| + if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kEnableExperimentalWebPlatformFeatures)) |
| + service_worker_context_->GetRegistrationUserData( |
| + data.service_worker_registration_id, kPushSenderIdServiceWorkerKey, |
| + base::Bind(&PushMessagingMessageFilter::DidGetSenderIdFromStorage, |
| + weak_factory_io_to_io_.GetWeakPtr(), data)); |
| + else |
| + // Only check for the sender public key if the feature is enabled. |
| + service_worker_context_->GetRegistrationUserData( |
| + data.service_worker_registration_id, kPushSenderKeyServiceWorkerKey, |
| + base::Bind(&PushMessagingMessageFilter::DidGetSenderKeyFromStorage, |
| + weak_factory_io_to_io_.GetWeakPtr(), data)); |
| } |
| } |
| @@ -375,6 +393,25 @@ void PushMessagingMessageFilter::DidGetEncryptionKeys( |
| push_registration_id, p256dh, auth); |
| } |
| +void PushMessagingMessageFilter::DidGetSenderKeyFromStorage( |
| + const RegisterData& data, |
| + const std::string& sender_key, |
| + ServiceWorkerStatusCode service_worker_status) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + if (service_worker_status != SERVICE_WORKER_OK) |
| + // A failure might just mean that the service worker is registered with a |
| + // sender id instead of the public key. Try to get that data. |
| + service_worker_context_->GetRegistrationUserData( |
| + data.service_worker_registration_id, kPushSenderIdServiceWorkerKey, |
| + base::Bind(&PushMessagingMessageFilter::DidGetSenderIdFromStorage, |
| + weak_factory_io_to_io_.GetWeakPtr(), data)); |
| + else |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(&Core::RegisterOnUI, base::Unretained(ui_core_.get()), data, |
| + sender_key)); |
| +} |
| + |
| void PushMessagingMessageFilter::DidGetSenderIdFromStorage( |
| const RegisterData& data, |
| const std::string& sender_id, |
| @@ -392,7 +429,7 @@ void PushMessagingMessageFilter::DidGetSenderIdFromStorage( |
| void PushMessagingMessageFilter::Core::RegisterOnUI( |
| const PushMessagingMessageFilter::RegisterData& data, |
| - const std::string& sender_id) { |
| + const std::string& sender_info) { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| PushMessagingService* push_service = service(); |
| if (!push_service) { |
| @@ -438,16 +475,18 @@ void PushMessagingMessageFilter::Core::RegisterOnUI( |
| return; |
| } |
| + PushSubscriptionOptions options; |
| + options.user_visible_only = data.user_visible; |
| + options.sender_info = sender_info; |
| if (data.FromDocument()) { |
| push_service->SubscribeFromDocument( |
| - data.requesting_origin, data.service_worker_registration_id, sender_id, |
| - render_process_id_, data.render_frame_id, data.user_visible, |
| + data.requesting_origin, data.service_worker_registration_id, |
| + render_process_id_, data.render_frame_id, options, |
| base::Bind(&Core::DidRegister, weak_factory_ui_to_ui_.GetWeakPtr(), |
| data)); |
| } else { |
| push_service->SubscribeFromWorker( |
| - data.requesting_origin, data.service_worker_registration_id, sender_id, |
| - data.user_visible, |
| + data.requesting_origin, data.service_worker_registration_id, options, |
| base::Bind(&Core::DidRegister, weak_factory_ui_to_ui_.GetWeakPtr(), |
| data)); |
| } |