| Index: content/browser/push_messaging/push_messaging_manager.cc
|
| diff --git a/content/browser/push_messaging/push_messaging_manager.cc b/content/browser/push_messaging/push_messaging_manager.cc
|
| index 9f4c2623f206ecab40607ab1895923185000829e..c3ee50ec8beda20e19320f2ac713876d06cc8ed6 100644
|
| --- a/content/browser/push_messaging/push_messaging_manager.cc
|
| +++ b/content/browser/push_messaging/push_messaging_manager.cc
|
| @@ -115,6 +115,7 @@ struct PushMessagingManager::RegisterData {
|
| GURL requesting_origin;
|
| int64_t service_worker_registration_id;
|
| PushSubscriptionOptions options;
|
| + SubscribeCallback callback;
|
| // The following member should only be read if FromDocument() is true.
|
| int render_frame_id;
|
| };
|
| @@ -128,8 +129,7 @@ class PushMessagingManager::Core {
|
| // Public Register methods on UI thread --------------------------------------
|
|
|
| // Called via PostTask from IO thread.
|
| - void RegisterOnUI(const SubscribeCallback& callback,
|
| - const RegisterData& data);
|
| + void RegisterOnUI(const RegisterData& data);
|
|
|
| // Public Unregister methods on UI thread ------------------------------------
|
|
|
| @@ -170,12 +170,10 @@ class PushMessagingManager::Core {
|
|
|
| // Private Register methods on UI thread -------------------------------------
|
|
|
| - void DidRequestPermissionInIncognito(const SubscribeCallback& callback,
|
| - const RegisterData& data,
|
| + void DidRequestPermissionInIncognito(const RegisterData& data,
|
| blink::mojom::PermissionStatus status);
|
|
|
| - void DidRegister(const SubscribeCallback& callback,
|
| - const RegisterData& data,
|
| + void DidRegister(const RegisterData& data,
|
| const std::string& push_registration_id,
|
| const std::vector<uint8_t>& p256dh,
|
| const std::vector<uint8_t>& auth,
|
| @@ -266,6 +264,7 @@ void PushMessagingManager::Subscribe(int32_t render_frame_id,
|
| data.render_frame_id = render_frame_id;
|
|
|
| data.service_worker_registration_id = service_worker_registration_id;
|
| + data.callback = callback;
|
| data.options = options;
|
|
|
| ServiceWorkerRegistration* service_worker_registration =
|
| @@ -273,8 +272,7 @@ void PushMessagingManager::Subscribe(int32_t render_frame_id,
|
| data.service_worker_registration_id);
|
| if (!service_worker_registration ||
|
| !service_worker_registration->active_version()) {
|
| - SendSubscriptionError(callback, data,
|
| - PUSH_REGISTRATION_STATUS_NO_SERVICE_WORKER);
|
| + SendSubscriptionError(data, PUSH_REGISTRATION_STATUS_NO_SERVICE_WORKER);
|
| return;
|
| }
|
| data.requesting_origin = service_worker_registration->pattern().GetOrigin();
|
| @@ -285,11 +283,10 @@ void PushMessagingManager::Subscribe(int32_t render_frame_id,
|
| data.service_worker_registration_id,
|
| {kPushRegistrationIdServiceWorkerKey, kPushSenderIdServiceWorkerKey},
|
| base::Bind(&PushMessagingManager::DidCheckForExistingRegistration,
|
| - weak_factory_io_to_io_.GetWeakPtr(), callback, data));
|
| + weak_factory_io_to_io_.GetWeakPtr(), data));
|
| }
|
|
|
| void PushMessagingManager::DidCheckForExistingRegistration(
|
| - const SubscribeCallback& callback,
|
| const RegisterData& data,
|
| const std::vector<std::string>& push_registration_id_and_sender_id,
|
| ServiceWorkerStatusCode service_worker_status) {
|
| @@ -301,24 +298,22 @@ void PushMessagingManager::DidCheckForExistingRegistration(
|
| std::string fixed_sender_id =
|
| FixSenderInfo(data.options.sender_info, stored_sender_id);
|
| if (fixed_sender_id.empty()) {
|
| - SendSubscriptionError(callback, data,
|
| - PUSH_REGISTRATION_STATUS_NO_SENDER_ID);
|
| + SendSubscriptionError(data, PUSH_REGISTRATION_STATUS_NO_SENDER_ID);
|
| return;
|
| }
|
| if (fixed_sender_id != stored_sender_id) {
|
| - SendSubscriptionError(callback, data,
|
| - PUSH_REGISTRATION_STATUS_SENDER_ID_MISMATCH);
|
| + SendSubscriptionError(data, PUSH_REGISTRATION_STATUS_SENDER_ID_MISMATCH);
|
| return;
|
| }
|
| - auto callback_ui = base::Bind(&PushMessagingManager::DidGetEncryptionKeys,
|
| - weak_factory_io_to_io_.GetWeakPtr(), callback,
|
| - data, push_registration_id);
|
| + auto callback = base::Bind(&PushMessagingManager::DidGetEncryptionKeys,
|
| + weak_factory_io_to_io_.GetWeakPtr(), data,
|
| + push_registration_id);
|
| BrowserThread::PostTask(
|
| BrowserThread::UI, FROM_HERE,
|
| base::Bind(&Core::GetEncryptionInfoOnUI,
|
| base::Unretained(ui_core_.get()), data.requesting_origin,
|
| data.service_worker_registration_id, fixed_sender_id,
|
| - callback_ui));
|
| + callback));
|
| return;
|
| }
|
| // TODO(johnme): The spec allows the register algorithm to reject with an
|
| @@ -327,22 +322,20 @@ void PushMessagingManager::DidCheckForExistingRegistration(
|
| // attempting to do a fresh registration?
|
| // https://w3c.github.io/push-api/#widl-PushRegistrationManager-register-Promise-PushRegistration
|
| if (!data.options.sender_info.empty()) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&Core::RegisterOnUI, base::Unretained(ui_core_.get()),
|
| - callback, data));
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&Core::RegisterOnUI,
|
| + base::Unretained(ui_core_.get()), data));
|
| } else {
|
| // There is no existing registration and the sender_info passed in was
|
| // empty, but perhaps there is a stored sender id we can use.
|
| service_worker_context_->GetRegistrationUserData(
|
| data.service_worker_registration_id, {kPushSenderIdServiceWorkerKey},
|
| base::Bind(&PushMessagingManager::DidGetSenderIdFromStorage,
|
| - weak_factory_io_to_io_.GetWeakPtr(), callback, data));
|
| + weak_factory_io_to_io_.GetWeakPtr(), data));
|
| }
|
| }
|
|
|
| void PushMessagingManager::DidGetEncryptionKeys(
|
| - const SubscribeCallback& callback,
|
| const RegisterData& data,
|
| const std::string& push_registration_id,
|
| bool success,
|
| @@ -350,25 +343,22 @@ void PushMessagingManager::DidGetEncryptionKeys(
|
| const std::vector<uint8_t>& auth) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| if (!success) {
|
| - SendSubscriptionError(callback, data,
|
| + SendSubscriptionError(data,
|
| PUSH_REGISTRATION_STATUS_PUBLIC_KEY_UNAVAILABLE);
|
| return;
|
| }
|
|
|
| - SendSubscriptionSuccess(callback, data,
|
| - PUSH_REGISTRATION_STATUS_SUCCESS_FROM_CACHE,
|
| + SendSubscriptionSuccess(data, PUSH_REGISTRATION_STATUS_SUCCESS_FROM_CACHE,
|
| push_registration_id, p256dh, auth);
|
| }
|
|
|
| void PushMessagingManager::DidGetSenderIdFromStorage(
|
| - const SubscribeCallback& callback,
|
| const RegisterData& data,
|
| const std::vector<std::string>& stored_sender_id,
|
| ServiceWorkerStatusCode service_worker_status) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| if (service_worker_status != SERVICE_WORKER_OK) {
|
| - SendSubscriptionError(callback, data,
|
| - PUSH_REGISTRATION_STATUS_NO_SENDER_ID);
|
| + SendSubscriptionError(data, PUSH_REGISTRATION_STATUS_NO_SENDER_ID);
|
| return;
|
| }
|
| DCHECK_EQ(1u, stored_sender_id.size());
|
| @@ -377,8 +367,7 @@ void PushMessagingManager::DidGetSenderIdFromStorage(
|
| std::string fixed_sender_id =
|
| FixSenderInfo(data.options.sender_info, stored_sender_id[0]);
|
| if (fixed_sender_id.empty()) {
|
| - SendSubscriptionError(callback, data,
|
| - PUSH_REGISTRATION_STATUS_NO_SENDER_ID);
|
| + SendSubscriptionError(data, PUSH_REGISTRATION_STATUS_NO_SENDER_ID);
|
| return;
|
| }
|
| RegisterData mutated_data = data;
|
| @@ -386,11 +375,10 @@ void PushMessagingManager::DidGetSenderIdFromStorage(
|
| BrowserThread::PostTask(
|
| BrowserThread::UI, FROM_HERE,
|
| base::Bind(&Core::RegisterOnUI, base::Unretained(ui_core_.get()),
|
| - callback, mutated_data));
|
| + mutated_data));
|
| }
|
|
|
| void PushMessagingManager::Core::RegisterOnUI(
|
| - const SubscribeCallback& callback,
|
| const PushMessagingManager::RegisterData& data) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| PushMessagingService* push_service = service();
|
| @@ -402,8 +390,7 @@ void PushMessagingManager::Core::RegisterOnUI(
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| base::Bind(&PushMessagingManager::SendSubscriptionError, io_parent_,
|
| - callback, data,
|
| - PUSH_REGISTRATION_STATUS_SERVICE_NOT_AVAILABLE));
|
| + data, PUSH_REGISTRATION_STATUS_SERVICE_NOT_AVAILABLE));
|
| } else {
|
| // Prevent websites from detecting incognito mode, by emulating what would
|
| // have happened if we had a PushMessagingService available.
|
| @@ -412,7 +399,7 @@ void PushMessagingManager::Core::RegisterOnUI(
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| base::Bind(&PushMessagingManager::SendSubscriptionError, io_parent_,
|
| - callback, data,
|
| + data,
|
| PUSH_REGISTRATION_STATUS_INCOGNITO_PERMISSION_DENIED));
|
| } else {
|
| RenderFrameHost* render_frame_host =
|
| @@ -432,7 +419,7 @@ void PushMessagingManager::Core::RegisterOnUI(
|
| BrowserThread::IO, FROM_HERE,
|
| base::Bind(
|
| &PushMessagingManager::SendSubscriptionError, io_parent_,
|
| - callback, data,
|
| + data,
|
| PUSH_REGISTRATION_STATUS_INCOGNITO_PERMISSION_DENIED));
|
|
|
| return;
|
| @@ -446,7 +433,7 @@ void PushMessagingManager::Core::RegisterOnUI(
|
| data.requesting_origin, false /* user_gesture */,
|
| base::Bind(
|
| &PushMessagingManager::Core::DidRequestPermissionInIncognito,
|
| - weak_factory_ui_to_ui_.GetWeakPtr(), callback, data));
|
| + weak_factory_ui_to_ui_.GetWeakPtr(), data));
|
| }
|
| }
|
| }
|
| @@ -458,18 +445,17 @@ void PushMessagingManager::Core::RegisterOnUI(
|
| data.requesting_origin, data.service_worker_registration_id,
|
| render_process_id_, data.render_frame_id, data.options,
|
| base::Bind(&Core::DidRegister, weak_factory_ui_to_ui_.GetWeakPtr(),
|
| - callback, data));
|
| + data));
|
| } else {
|
| push_service->SubscribeFromWorker(
|
| data.requesting_origin, data.service_worker_registration_id,
|
| data.options,
|
| base::Bind(&Core::DidRegister, weak_factory_ui_to_ui_.GetWeakPtr(),
|
| - callback, data));
|
| + data));
|
| }
|
| }
|
|
|
| void PushMessagingManager::Core::DidRequestPermissionInIncognito(
|
| - const SubscribeCallback& callback,
|
| const RegisterData& data,
|
| blink::mojom::PermissionStatus status) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| @@ -477,13 +463,11 @@ void PushMessagingManager::Core::DidRequestPermissionInIncognito(
|
| DCHECK_EQ(blink::mojom::PermissionStatus::DENIED, status);
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&PushMessagingManager::SendSubscriptionError, io_parent_,
|
| - callback, data,
|
| + base::Bind(&PushMessagingManager::SendSubscriptionError, io_parent_, data,
|
| PUSH_REGISTRATION_STATUS_INCOGNITO_PERMISSION_DENIED));
|
| }
|
|
|
| void PushMessagingManager::Core::DidRegister(
|
| - const SubscribeCallback& callback,
|
| const RegisterData& data,
|
| const std::string& push_registration_id,
|
| const std::vector<uint8_t>& p256dh,
|
| @@ -494,17 +478,16 @@ void PushMessagingManager::Core::DidRegister(
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| base::Bind(&PushMessagingManager::PersistRegistrationOnIO, io_parent_,
|
| - callback, data, push_registration_id, p256dh, auth));
|
| + data, push_registration_id, p256dh, auth));
|
| } else {
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| base::Bind(&PushMessagingManager::SendSubscriptionError, io_parent_,
|
| - callback, data, status));
|
| + data, status));
|
| }
|
| }
|
|
|
| void PushMessagingManager::PersistRegistrationOnIO(
|
| - const SubscribeCallback& callback,
|
| const RegisterData& data,
|
| const std::string& push_registration_id,
|
| const std::vector<uint8_t>& p256dh,
|
| @@ -515,12 +498,11 @@ void PushMessagingManager::PersistRegistrationOnIO(
|
| {{kPushRegistrationIdServiceWorkerKey, push_registration_id},
|
| {kPushSenderIdServiceWorkerKey, data.options.sender_info}},
|
| base::Bind(&PushMessagingManager::DidPersistRegistrationOnIO,
|
| - weak_factory_io_to_io_.GetWeakPtr(), callback, data,
|
| + weak_factory_io_to_io_.GetWeakPtr(), data,
|
| push_registration_id, p256dh, auth));
|
| }
|
|
|
| void PushMessagingManager::DidPersistRegistrationOnIO(
|
| - const SubscribeCallback& callback,
|
| const RegisterData& data,
|
| const std::string& push_registration_id,
|
| const std::vector<uint8_t>& p256dh,
|
| @@ -528,30 +510,27 @@ void PushMessagingManager::DidPersistRegistrationOnIO(
|
| ServiceWorkerStatusCode service_worker_status) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| if (service_worker_status == SERVICE_WORKER_OK) {
|
| - SendSubscriptionSuccess(callback, data,
|
| + SendSubscriptionSuccess(data,
|
| PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE,
|
| push_registration_id, p256dh, auth);
|
| } else {
|
| // TODO(johnme): Unregister, so PushMessagingServiceImpl can decrease count.
|
| - SendSubscriptionError(callback, data,
|
| - PUSH_REGISTRATION_STATUS_STORAGE_ERROR);
|
| + SendSubscriptionError(data, PUSH_REGISTRATION_STATUS_STORAGE_ERROR);
|
| }
|
| }
|
|
|
| void PushMessagingManager::SendSubscriptionError(
|
| - const SubscribeCallback& callback,
|
| const RegisterData& data,
|
| PushRegistrationStatus status) {
|
| // Only called from IO thread, but would be safe to call from UI thread.
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - callback.Run(status, base::nullopt /* endpoint */,
|
| - base::nullopt /* options */, base::nullopt /* p256dh */,
|
| - base::nullopt /* auth */);
|
| + data.callback.Run(status, base::nullopt /* endpoint */,
|
| + base::nullopt /* options */, base::nullopt /* p256dh */,
|
| + base::nullopt /* auth */);
|
| RecordRegistrationStatus(status);
|
| }
|
|
|
| void PushMessagingManager::SendSubscriptionSuccess(
|
| - const SubscribeCallback& callback,
|
| const RegisterData& data,
|
| PushRegistrationStatus status,
|
| const std::string& push_subscription_id,
|
| @@ -563,15 +542,14 @@ void PushMessagingManager::SendSubscriptionSuccess(
|
| // This shouldn't be possible in incognito mode, since we've already checked
|
| // that we have an existing registration. Hence it's ok to throw an error.
|
| DCHECK(!ui_core_->is_incognito());
|
| - SendSubscriptionError(callback, data,
|
| - PUSH_REGISTRATION_STATUS_SERVICE_NOT_AVAILABLE);
|
| + SendSubscriptionError(data, PUSH_REGISTRATION_STATUS_SERVICE_NOT_AVAILABLE);
|
| return;
|
| }
|
|
|
| const GURL endpoint = CreateEndpoint(
|
| IsApplicationServerKey(data.options.sender_info), push_subscription_id);
|
|
|
| - callback.Run(status, endpoint, data.options, p256dh, auth);
|
| + data.callback.Run(status, endpoint, data.options, p256dh, auth);
|
|
|
| RecordRegistrationStatus(status);
|
| }
|
|
|