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

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

Issue 1701313002: Partial implementation of subscription restrictions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed broken file Created 4 years, 10 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 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));
}

Powered by Google App Engine
This is Rietveld 408576698