Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1509)

Unified Diff: content/browser/push_messaging/push_messaging_message_filter.cc

Issue 1944863002: Push API: Fix stored sender ID being out of sync with registration ID (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@ii7swdb
Patch Set: Add TODO Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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));
« no previous file with comments | « content/browser/push_messaging/push_messaging_message_filter.h ('k') | content/child/push_messaging/push_provider.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698