| 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..832477981e6acc5ba3a791513e83150e5d0eaf9d 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 ContentPushSubscriptionOptions& 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;
|
| 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) {
|
| + ContentPushSubscriptionOptions 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
|
| + // from storage.
|
| + CheckForExistingRegistration(data, ContentPushSubscriptionOptions());
|
| }
|
|
|
| -void PushMessagingMessageFilter::DidPersistSenderId(
|
| +void PushMessagingMessageFilter::DidPersistSenderInfo(
|
| const RegisterData& data,
|
| - const std::string& sender_id,
|
| + const ContentPushSubscriptionOptions& 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 ContentPushSubscriptionOptions& 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 ContentPushSubscriptionOptions& 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::kEnableSubscriptionRestrictions))
|
| + 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;
|
| }
|
|
|
| + ContentPushSubscriptionOptions 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));
|
| }
|
|
|