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 be04b9966bdaaf516a6227f7548cc22086850cf7..a3b69ea8399a63188f938e3c0e999a1f2f0b1de6 100644 |
--- a/content/browser/push_messaging/push_messaging_message_filter.cc |
+++ b/content/browser/push_messaging/push_messaging_message_filter.cc |
@@ -35,6 +35,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. |
const char kPushSenderIdServiceWorkerKey[] = "push_sender_id"; |
const char kPushRegistrationIdServiceWorkerKey[] = "push_registration_id"; |
@@ -96,7 +99,7 @@ struct PushMessagingMessageFilter::RegisterData { |
int request_id; |
GURL requesting_origin; |
int64_t service_worker_registration_id; |
- bool user_visible; |
+ PushSubscriptionOptions options; |
// The following member should only be read if FromDocument() is true. |
int render_frame_id; |
}; |
@@ -110,7 +113,7 @@ class PushMessagingMessageFilter::Core { |
// Public Register methods on UI thread -------------------------------------- |
// Called via PostTask from IO thread. |
- void RegisterOnUI(const RegisterData& data, const std::string& sender_id); |
+ void RegisterOnUI(const RegisterData& data); |
// Public Unregister methods on UI thread ------------------------------------ |
@@ -184,7 +187,6 @@ class PushMessagingMessageFilter::Core { |
PushMessagingMessageFilter::RegisterData::RegisterData() |
: request_id(0), |
service_worker_registration_id(0), |
- user_visible(false), |
render_frame_id(ChildProcessHost::kInvalidUniqueID) {} |
bool PushMessagingMessageFilter::RegisterData::FromDocument() const { |
@@ -233,10 +235,7 @@ bool PushMessagingMessageFilter::OnMessageReceived( |
const IPC::Message& message) { |
bool handled = true; |
IPC_BEGIN_MESSAGE_MAP(PushMessagingMessageFilter, message) |
- IPC_MESSAGE_HANDLER(PushMessagingHostMsg_SubscribeFromDocument, |
- OnSubscribeFromDocument) |
- IPC_MESSAGE_HANDLER(PushMessagingHostMsg_SubscribeFromWorker, |
- OnSubscribeFromWorker) |
+ IPC_MESSAGE_HANDLER(PushMessagingHostMsg_Subscribe, OnSubscribe) |
IPC_MESSAGE_HANDLER(PushMessagingHostMsg_Unsubscribe, OnUnsubscribe) |
IPC_MESSAGE_HANDLER(PushMessagingHostMsg_GetSubscription, OnGetSubscription) |
IPC_MESSAGE_HANDLER(PushMessagingHostMsg_GetPermissionStatus, |
@@ -250,97 +249,47 @@ bool PushMessagingMessageFilter::OnMessageReceived( |
// PushMessagingMessageFilter and Core. |
// ----------------------------------------------------------------------------- |
-void PushMessagingMessageFilter::OnSubscribeFromDocument( |
+void PushMessagingMessageFilter::OnSubscribe( |
int render_frame_id, |
int request_id, |
- const PushSubscriptionOptions& options, |
- int64_t service_worker_registration_id) { |
+ int64_t service_worker_registration_id, |
+ const PushSubscriptionOptions& options) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
// TODO(mvanouwerkerk): Validate arguments? |
RegisterData data; |
- data.request_id = request_id; |
- data.service_worker_registration_id = service_worker_registration_id; |
- data.render_frame_id = render_frame_id; |
- data.user_visible = options.user_visible_only; |
- |
- ServiceWorkerRegistration* service_worker_registration = |
- service_worker_context_->GetLiveRegistration( |
- service_worker_registration_id); |
- if (!service_worker_registration || |
- !service_worker_registration->active_version()) { |
- SendSubscriptionError(data, PUSH_REGISTRATION_STATUS_NO_SERVICE_WORKER); |
- return; |
- } |
- data.requesting_origin = service_worker_registration->pattern().GetOrigin(); |
- service_worker_context_->StoreRegistrationUserData( |
- service_worker_registration_id, data.requesting_origin, |
- {{kPushSenderIdServiceWorkerKey, options.sender_info}}, |
- base::Bind(&PushMessagingMessageFilter::DidPersistSenderInfo, |
- weak_factory_io_to_io_.GetWeakPtr(), data, options)); |
-} |
+ // Will be ChildProcessHost::kInvalidUniqueID in requests from Service Worker. |
+ data.render_frame_id = render_frame_id; |
-void PushMessagingMessageFilter::OnSubscribeFromWorker( |
- int request_id, |
- int64_t service_worker_registration_id, |
- 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 = options.user_visible_only; |
+ data.options = options; |
ServiceWorkerRegistration* service_worker_registration = |
service_worker_context_->GetLiveRegistration( |
- service_worker_registration_id); |
- if (!service_worker_registration) { |
+ data.service_worker_registration_id); |
+ if (!service_worker_registration || |
+ !service_worker_registration->active_version()) { |
SendSubscriptionError(data, PUSH_REGISTRATION_STATUS_NO_SERVICE_WORKER); |
return; |
} |
data.requesting_origin = service_worker_registration->pattern().GetOrigin(); |
- if (!options.sender_info.empty()) { |
- service_worker_context_->StoreRegistrationUserData( |
- service_worker_registration_id, data.requesting_origin, |
- {{kPushSenderIdServiceWorkerKey, options.sender_info}}, |
- base::Bind(&PushMessagingMessageFilter::DidPersistSenderInfo, |
- weak_factory_io_to_io_.GetWeakPtr(), data, options)); |
- } else { |
- // If there is a sender_info in the subscription options, it will be used, |
- // otherwise the registration sender_info will be used. |
- CheckForExistingRegistration(data, options); |
- } |
-} |
- |
-void PushMessagingMessageFilter::DidPersistSenderInfo( |
- const RegisterData& data, |
- 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, options); |
-} |
- |
-void PushMessagingMessageFilter::CheckForExistingRegistration( |
- const RegisterData& data, |
- 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, options)); |
+ weak_factory_io_to_io_.GetWeakPtr(), data)); |
} |
void PushMessagingMessageFilter::DidCheckForExistingRegistration( |
const RegisterData& data, |
- const PushSubscriptionOptions& options, |
const std::vector<std::string>& push_registration_id, |
ServiceWorkerStatusCode service_worker_status) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
if (service_worker_status == SERVICE_WORKER_OK) { |
+ // TODO(johnme): Check that stored sender ID equals data.options.sender_info |
+ // and throw an exception if they don't match. |
DCHECK_EQ(1u, push_registration_id.size()); |
auto callback = base::Bind( |
&PushMessagingMessageFilter::DidGetEncryptionKeys, |
@@ -358,11 +307,10 @@ void PushMessagingMessageFilter::DidCheckForExistingRegistration( |
// service_worker_status != SERVICE_WORKER_ERROR_NOT_FOUND instead of |
// attempting to do a fresh registration? |
// https://w3c.github.io/push-api/#widl-PushRegistrationManager-register-Promise-PushRegistration |
- if (!options.sender_info.empty()) { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&Core::RegisterOnUI, base::Unretained(ui_core_.get()), data, |
- options.sender_info)); |
+ if (!data.options.sender_info.empty()) { |
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
+ base::Bind(&Core::RegisterOnUI, |
+ base::Unretained(ui_core_.get()), data)); |
} else { |
service_worker_context_->GetRegistrationUserData( |
data.service_worker_registration_id, {kPushSenderIdServiceWorkerKey}, |
@@ -398,15 +346,16 @@ void PushMessagingMessageFilter::DidGetSenderIdFromStorage( |
return; |
} |
DCHECK_EQ(1u, sender_id.size()); |
+ RegisterData mutated_data = data; |
+ mutated_data.options.sender_info = sender_id[0]; |
BrowserThread::PostTask( |
BrowserThread::UI, FROM_HERE, |
- base::Bind(&Core::RegisterOnUI, base::Unretained(ui_core_.get()), data, |
- sender_id[0])); |
+ base::Bind(&Core::RegisterOnUI, base::Unretained(ui_core_.get()), |
+ mutated_data)); |
} |
void PushMessagingMessageFilter::Core::RegisterOnUI( |
- const PushMessagingMessageFilter::RegisterData& data, |
- const std::string& sender_info) { |
+ const PushMessagingMessageFilter::RegisterData& data) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
PushMessagingService* push_service = service(); |
if (!push_service) { |
@@ -420,7 +369,7 @@ void PushMessagingMessageFilter::Core::RegisterOnUI( |
} else { |
// Prevent websites from detecting incognito mode, by emulating what would |
// have happened if we had a PushMessagingService available. |
- if (!data.FromDocument() || !data.user_visible) { |
+ if (!data.FromDocument() || !data.options.user_visible_only) { |
// Throw a permission denied error under the same circumstances. |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, |
@@ -452,20 +401,17 @@ 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, |
- render_process_id_, data.render_frame_id, options, |
+ render_process_id_, data.render_frame_id, data.options, |
base::Bind(&Core::DidRegister, weak_factory_ui_to_ui_.GetWeakPtr(), |
data)); |
} else { |
push_service->SubscribeFromWorker( |
- data.requesting_origin, data.service_worker_registration_id, options, |
- base::Bind(&Core::DidRegister, weak_factory_ui_to_ui_.GetWeakPtr(), |
- data)); |
+ data.requesting_origin, data.service_worker_registration_id, |
+ data.options, base::Bind(&Core::DidRegister, |
+ weak_factory_ui_to_ui_.GetWeakPtr(), data)); |
} |
} |
@@ -509,7 +455,8 @@ void PushMessagingMessageFilter::PersistRegistrationOnIO( |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
service_worker_context_->StoreRegistrationUserData( |
data.service_worker_registration_id, data.requesting_origin, |
- {{kPushRegistrationIdServiceWorkerKey, push_registration_id}}, |
+ {{kPushRegistrationIdServiceWorkerKey, push_registration_id}, |
+ {kPushSenderIdServiceWorkerKey, data.options.sender_info}}, |
base::Bind(&PushMessagingMessageFilter::DidPersistRegistrationOnIO, |
weak_factory_io_to_io_.GetWeakPtr(), data, |
push_registration_id, p256dh, auth)); |