| 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 d019cb6f9e2444f1c5e85b4fe96411581a70e952..1a79fc2bc804c46cbe28c8daf4fbf555dd96699f 100644
|
| --- a/content/browser/push_messaging/push_messaging_manager.cc
|
| +++ b/content/browser/push_messaging/push_messaging_manager.cc
|
| @@ -103,7 +103,7 @@ std::string FixSenderInfo(const std::string& sender_info,
|
|
|
| struct PushMessagingManager::RegisterData {
|
| RegisterData();
|
| - RegisterData(const RegisterData& other) = default;
|
| + RegisterData(RegisterData&& other) = default;
|
| bool FromDocument() const;
|
| GURL requesting_origin;
|
| int64_t service_worker_registration_id;
|
| @@ -122,7 +122,7 @@ class PushMessagingManager::Core {
|
| // Public Register methods on UI thread --------------------------------------
|
|
|
| // Callback called on UI thread.
|
| - void SubscribeDidGetInfoOnUI(const RegisterData& data,
|
| + void SubscribeDidGetInfoOnUI(RegisterData data,
|
| const std::string& push_subscription_id,
|
| const std::string& sender_id,
|
| bool is_valid,
|
| @@ -130,12 +130,12 @@ class PushMessagingManager::Core {
|
| const std::vector<uint8_t>& auth);
|
|
|
| // Called via PostTask from IO thread.
|
| - void RegisterOnUI(const RegisterData& data);
|
| + void RegisterOnUI(RegisterData data);
|
|
|
| // Public Unregister methods on UI thread ------------------------------------
|
|
|
| // Called via PostTask from IO thread.
|
| - void UnregisterFromService(const UnsubscribeCallback& callback,
|
| + void UnregisterFromService(UnsubscribeCallback callback,
|
| int64_t service_worker_registration_id,
|
| const GURL& requesting_origin,
|
| const std::string& sender_id);
|
| @@ -143,7 +143,7 @@ class PushMessagingManager::Core {
|
| // Public GetSubscription methods on UI thread -------------------------------
|
|
|
| // Callback called on UI thread.
|
| - void GetSubscriptionDidGetInfoOnUI(const GetSubscriptionCallback& callback,
|
| + void GetSubscriptionDidGetInfoOnUI(GetSubscriptionCallback callback,
|
| const GURL& origin,
|
| int64_t service_worker_registration_id,
|
| const GURL& endpoint,
|
| @@ -154,14 +154,14 @@ class PushMessagingManager::Core {
|
|
|
| // Callback called on UI thread.
|
| void GetSubscriptionDidUnsubscribe(
|
| - const GetSubscriptionCallback& callback,
|
| + GetSubscriptionCallback callback,
|
| PushGetRegistrationStatus get_status,
|
| PushUnregistrationStatus unsubscribe_status);
|
|
|
| // Public GetPermission methods on UI thread ---------------------------------
|
|
|
| // Called via PostTask from IO thread.
|
| - void GetPermissionStatusOnUI(const GetPermissionStatusCallback& callback,
|
| + void GetPermissionStatusOnUI(GetPermissionStatusCallback callback,
|
| const GURL& requesting_origin,
|
| bool user_visible);
|
|
|
| @@ -173,7 +173,7 @@ class PushMessagingManager::Core {
|
| int64_t service_worker_registration_id,
|
| const std::string& sender_id,
|
| const std::string& push_subscription_id,
|
| - const PushMessagingService::SubscriptionInfoCallback& callback);
|
| + PushMessagingService::SubscriptionInfoCallback callback);
|
|
|
| // Called (directly) from both the UI and IO threads.
|
| bool is_incognito() const { return is_incognito_; }
|
| @@ -193,10 +193,10 @@ class PushMessagingManager::Core {
|
|
|
| // Private Register methods on UI thread -------------------------------------
|
|
|
| - void DidRequestPermissionInIncognito(const RegisterData& data,
|
| + void DidRequestPermissionInIncognito(RegisterData data,
|
| blink::mojom::PermissionStatus status);
|
|
|
| - void DidRegister(const RegisterData& data,
|
| + void DidRegister(RegisterData data,
|
| const std::string& push_registration_id,
|
| const std::vector<uint8_t>& p256dh,
|
| const std::vector<uint8_t>& auth,
|
| @@ -204,7 +204,7 @@ class PushMessagingManager::Core {
|
|
|
| // Private Unregister methods on UI thread -----------------------------------
|
|
|
| - void DidUnregisterFromService(const UnsubscribeCallback& callback,
|
| + void DidUnregisterFromService(UnsubscribeCallback callback,
|
| int64_t service_worker_registration_id,
|
| PushUnregistrationStatus unregistration_status);
|
|
|
| @@ -279,7 +279,7 @@ void PushMessagingManager::BindRequest(mojom::PushMessagingRequest request) {
|
| void PushMessagingManager::Subscribe(int32_t render_frame_id,
|
| int64_t service_worker_registration_id,
|
| const PushSubscriptionOptions& options,
|
| - const SubscribeCallback& callback) {
|
| + SubscribeCallback callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| // TODO(mvanouwerkerk): Validate arguments?
|
| RegisterData data;
|
| @@ -288,7 +288,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.callback = std::move(callback);
|
| data.options = options;
|
|
|
| ServiceWorkerRegistration* service_worker_registration =
|
| @@ -296,22 +296,24 @@ void PushMessagingManager::Subscribe(int32_t render_frame_id,
|
| data.service_worker_registration_id);
|
| if (!service_worker_registration ||
|
| !service_worker_registration->active_version()) {
|
| - SendSubscriptionError(data, PUSH_REGISTRATION_STATUS_NO_SERVICE_WORKER);
|
| + SendSubscriptionError(std::move(data),
|
| + PUSH_REGISTRATION_STATUS_NO_SERVICE_WORKER);
|
| return;
|
| }
|
| data.requesting_origin = service_worker_registration->pattern().GetOrigin();
|
|
|
| DCHECK(!(data.options.sender_info.empty() && data.FromDocument()));
|
|
|
| + int64_t registration_id = data.service_worker_registration_id;
|
| service_worker_context_->GetRegistrationUserData(
|
| - data.service_worker_registration_id,
|
| + registration_id,
|
| {kPushRegistrationIdServiceWorkerKey, kPushSenderIdServiceWorkerKey},
|
| base::Bind(&PushMessagingManager::DidCheckForExistingRegistration,
|
| - weak_factory_io_to_io_.GetWeakPtr(), data));
|
| + weak_factory_io_to_io_.GetWeakPtr(), base::Passed(&data)));
|
| }
|
|
|
| void PushMessagingManager::DidCheckForExistingRegistration(
|
| - const RegisterData& data,
|
| + RegisterData data,
|
| const std::vector<std::string>& push_registration_id_and_sender_id,
|
| ServiceWorkerStatusCode service_worker_status) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| @@ -322,21 +324,26 @@ void PushMessagingManager::DidCheckForExistingRegistration(
|
| std::string fixed_sender_id =
|
| FixSenderInfo(data.options.sender_info, stored_sender_id);
|
| if (fixed_sender_id.empty()) {
|
| - SendSubscriptionError(data, PUSH_REGISTRATION_STATUS_NO_SENDER_ID);
|
| + SendSubscriptionError(std::move(data),
|
| + PUSH_REGISTRATION_STATUS_NO_SENDER_ID);
|
| return;
|
| }
|
| if (fixed_sender_id != stored_sender_id) {
|
| - SendSubscriptionError(data, PUSH_REGISTRATION_STATUS_SENDER_ID_MISMATCH);
|
| + SendSubscriptionError(std::move(data),
|
| + PUSH_REGISTRATION_STATUS_SENDER_ID_MISMATCH);
|
| return;
|
| }
|
| +
|
| + GURL requesting_origin = data.requesting_origin;
|
| + int64_t registration_id = data.service_worker_registration_id;
|
| BrowserThread::PostTask(
|
| BrowserThread::UI, FROM_HERE,
|
| base::Bind(&Core::GetSubscriptionInfoOnUI,
|
| - base::Unretained(ui_core_.get()), data.requesting_origin,
|
| - data.service_worker_registration_id, fixed_sender_id,
|
| - push_subscription_id,
|
| + base::Unretained(ui_core_.get()), requesting_origin,
|
| + registration_id, fixed_sender_id, push_subscription_id,
|
| base::Bind(&Core::SubscribeDidGetInfoOnUI, ui_core_weak_ptr_,
|
| - data, push_subscription_id, fixed_sender_id)));
|
| + base::Passed(&data), push_subscription_id,
|
| + fixed_sender_id)));
|
| return;
|
| }
|
| // TODO(johnme): The spec allows the register algorithm to reject with an
|
| @@ -345,21 +352,23 @@ 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()), data));
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&Core::RegisterOnUI, base::Unretained(ui_core_.get()),
|
| + base::Passed(&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.
|
| + int64_t registration_id = data.service_worker_registration_id;
|
| service_worker_context_->GetRegistrationUserData(
|
| - data.service_worker_registration_id, {kPushSenderIdServiceWorkerKey},
|
| + registration_id, {kPushSenderIdServiceWorkerKey},
|
| base::Bind(&PushMessagingManager::DidGetSenderIdFromStorage,
|
| - weak_factory_io_to_io_.GetWeakPtr(), data));
|
| + weak_factory_io_to_io_.GetWeakPtr(), base::Passed(&data)));
|
| }
|
| }
|
|
|
| void PushMessagingManager::Core::SubscribeDidGetInfoOnUI(
|
| - const RegisterData& data,
|
| + RegisterData data,
|
| const std::string& push_subscription_id,
|
| const std::string& sender_id,
|
| bool is_valid,
|
| @@ -370,7 +379,8 @@ void PushMessagingManager::Core::SubscribeDidGetInfoOnUI(
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| base::Bind(&PushMessagingManager::SendSubscriptionSuccess, io_parent_,
|
| - data, PUSH_REGISTRATION_STATUS_SUCCESS_FROM_CACHE,
|
| + base::Passed(&data),
|
| + PUSH_REGISTRATION_STATUS_SUCCESS_FROM_CACHE,
|
| push_subscription_id, p256dh, auth));
|
| } else {
|
| PushMessagingService* push_service = service();
|
| @@ -381,7 +391,8 @@ void PushMessagingManager::Core::SubscribeDidGetInfoOnUI(
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| base::Bind(&PushMessagingManager::SendSubscriptionError, io_parent_,
|
| - data, PUSH_REGISTRATION_STATUS_RENDERER_SHUTDOWN));
|
| + base::Passed(&data),
|
| + PUSH_REGISTRATION_STATUS_RENDERER_SHUTDOWN));
|
| return;
|
| }
|
|
|
| @@ -394,14 +405,16 @@ void PushMessagingManager::Core::SubscribeDidGetInfoOnUI(
|
| // be logged to UMA as a separate subscription attempt.
|
| RecordRegistrationStatus(PUSH_REGISTRATION_STATUS_STORAGE_CORRUPT);
|
|
|
| + int64_t registration_id = data.service_worker_registration_id;
|
| + GURL requesting_origin = data.requesting_origin;
|
| auto try_again_on_io = base::Bind(
|
| &PushMessagingManager::DidCheckForExistingRegistration, io_parent_,
|
| - data,
|
| + base::Passed(&data),
|
| std::vector<std::string>() /* push_registration_id_and_sender_id */,
|
| SERVICE_WORKER_ERROR_NOT_FOUND);
|
| push_service->Unsubscribe(
|
| - PUSH_UNREGISTRATION_REASON_SUBSCRIBE_STORAGE_CORRUPT,
|
| - data.requesting_origin, data.service_worker_registration_id, sender_id,
|
| + PUSH_UNREGISTRATION_REASON_SUBSCRIBE_STORAGE_CORRUPT, requesting_origin,
|
| + registration_id, sender_id,
|
| base::Bind(&UnregisterCallbackToClosure,
|
| base::Bind(IgnoreResult(&BrowserThread::PostTask),
|
| BrowserThread::IO, FROM_HERE, try_again_on_io)));
|
| @@ -409,12 +422,13 @@ void PushMessagingManager::Core::SubscribeDidGetInfoOnUI(
|
| }
|
|
|
| void PushMessagingManager::DidGetSenderIdFromStorage(
|
| - const RegisterData& data,
|
| + 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(data, PUSH_REGISTRATION_STATUS_NO_SENDER_ID);
|
| + SendSubscriptionError(std::move(data),
|
| + PUSH_REGISTRATION_STATUS_NO_SENDER_ID);
|
| return;
|
| }
|
| DCHECK_EQ(1u, stored_sender_id.size());
|
| @@ -423,19 +437,19 @@ void PushMessagingManager::DidGetSenderIdFromStorage(
|
| std::string fixed_sender_id =
|
| FixSenderInfo(data.options.sender_info, stored_sender_id[0]);
|
| if (fixed_sender_id.empty()) {
|
| - SendSubscriptionError(data, PUSH_REGISTRATION_STATUS_NO_SENDER_ID);
|
| + SendSubscriptionError(std::move(data),
|
| + PUSH_REGISTRATION_STATUS_NO_SENDER_ID);
|
| return;
|
| }
|
| - RegisterData mutated_data = data;
|
| - mutated_data.options.sender_info = fixed_sender_id;
|
| + data.options.sender_info = fixed_sender_id;
|
| BrowserThread::PostTask(
|
| BrowserThread::UI, FROM_HERE,
|
| base::Bind(&Core::RegisterOnUI, base::Unretained(ui_core_.get()),
|
| - mutated_data));
|
| + base::Passed(&data)));
|
| }
|
|
|
| void PushMessagingManager::Core::RegisterOnUI(
|
| - const PushMessagingManager::RegisterData& data) {
|
| + PushMessagingManager::RegisterData data) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| PushMessagingService* push_service = service();
|
| if (!push_service) {
|
| @@ -446,7 +460,8 @@ void PushMessagingManager::Core::RegisterOnUI(
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| base::Bind(&PushMessagingManager::SendSubscriptionError, io_parent_,
|
| - data, PUSH_REGISTRATION_STATUS_SERVICE_NOT_AVAILABLE));
|
| + base::Passed(&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.
|
| @@ -455,7 +470,7 @@ void PushMessagingManager::Core::RegisterOnUI(
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| base::Bind(&PushMessagingManager::SendSubscriptionError, io_parent_,
|
| - data,
|
| + base::Passed(&data),
|
| PUSH_REGISTRATION_STATUS_INCOGNITO_PERMISSION_DENIED));
|
| } else {
|
| RenderFrameHost* render_frame_host =
|
| @@ -475,7 +490,7 @@ void PushMessagingManager::Core::RegisterOnUI(
|
| BrowserThread::IO, FROM_HERE,
|
| base::Bind(
|
| &PushMessagingManager::SendSubscriptionError, io_parent_,
|
| - data,
|
| + base::Passed(&data),
|
| PUSH_REGISTRATION_STATUS_INCOGNITO_PERMISSION_DENIED));
|
|
|
| return;
|
| @@ -484,47 +499,52 @@ void PushMessagingManager::Core::RegisterOnUI(
|
| // Request push messaging permission (which will fail, since
|
| // notifications aren't supported in incognito), so the website can't
|
| // detect whether incognito is active.
|
| + GURL requesting_origin = data.requesting_origin;
|
| browser_context->GetPermissionManager()->RequestPermission(
|
| PermissionType::PUSH_MESSAGING, render_frame_host,
|
| - data.requesting_origin, false /* user_gesture */,
|
| + requesting_origin, false /* user_gesture */,
|
| base::Bind(
|
| &PushMessagingManager::Core::DidRequestPermissionInIncognito,
|
| - weak_factory_ui_to_ui_.GetWeakPtr(), data));
|
| + weak_factory_ui_to_ui_.GetWeakPtr(), base::Passed(&data)));
|
| }
|
| }
|
| }
|
| return;
|
| }
|
|
|
| + int64_t registration_id = data.service_worker_registration_id;
|
| + GURL requesting_origin = data.requesting_origin;
|
| + PushSubscriptionOptions options = data.options;
|
| + int render_frame_id = data.render_frame_id;
|
| if (data.FromDocument()) {
|
| push_service->SubscribeFromDocument(
|
| - data.requesting_origin, data.service_worker_registration_id,
|
| - render_process_id_, data.render_frame_id, data.options,
|
| + requesting_origin, registration_id, render_process_id_, render_frame_id,
|
| + options,
|
| base::Bind(&Core::DidRegister, weak_factory_ui_to_ui_.GetWeakPtr(),
|
| - data));
|
| + base::Passed(&data)));
|
| } else {
|
| push_service->SubscribeFromWorker(
|
| - data.requesting_origin, data.service_worker_registration_id,
|
| - data.options,
|
| + requesting_origin, registration_id, options,
|
| base::Bind(&Core::DidRegister, weak_factory_ui_to_ui_.GetWeakPtr(),
|
| - data));
|
| + base::Passed(&data)));
|
| }
|
| }
|
|
|
| void PushMessagingManager::Core::DidRequestPermissionInIncognito(
|
| - const RegisterData& data,
|
| + RegisterData data,
|
| blink::mojom::PermissionStatus status) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| // Notification permission should always be denied in incognito.
|
| DCHECK_EQ(blink::mojom::PermissionStatus::DENIED, status);
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&PushMessagingManager::SendSubscriptionError, io_parent_, data,
|
| + base::Bind(&PushMessagingManager::SendSubscriptionError, io_parent_,
|
| + base::Passed(&data),
|
| PUSH_REGISTRATION_STATUS_INCOGNITO_PERMISSION_DENIED));
|
| }
|
|
|
| void PushMessagingManager::Core::DidRegister(
|
| - const RegisterData& data,
|
| + RegisterData data,
|
| const std::string& push_registration_id,
|
| const std::vector<uint8_t>& p256dh,
|
| const std::vector<uint8_t>& auth,
|
| @@ -534,59 +554,63 @@ void PushMessagingManager::Core::DidRegister(
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| base::Bind(&PushMessagingManager::PersistRegistrationOnIO, io_parent_,
|
| - data, push_registration_id, p256dh, auth));
|
| + base::Passed(&data), push_registration_id, p256dh, auth));
|
| } else {
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| base::Bind(&PushMessagingManager::SendSubscriptionError, io_parent_,
|
| - data, status));
|
| + base::Passed(&data), status));
|
| }
|
| }
|
|
|
| void PushMessagingManager::PersistRegistrationOnIO(
|
| - const RegisterData& data,
|
| + RegisterData data,
|
| const std::string& push_registration_id,
|
| const std::vector<uint8_t>& p256dh,
|
| const std::vector<uint8_t>& auth) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + GURL requesting_origin = data.requesting_origin;
|
| + int64_t registration_id = data.service_worker_registration_id;
|
| + std::string sender_info = data.options.sender_info;
|
| service_worker_context_->StoreRegistrationUserData(
|
| - data.service_worker_registration_id, data.requesting_origin,
|
| + registration_id, requesting_origin,
|
| {{kPushRegistrationIdServiceWorkerKey, push_registration_id},
|
| - {kPushSenderIdServiceWorkerKey, data.options.sender_info}},
|
| + {kPushSenderIdServiceWorkerKey, sender_info}},
|
| base::Bind(&PushMessagingManager::DidPersistRegistrationOnIO,
|
| - weak_factory_io_to_io_.GetWeakPtr(), data,
|
| + weak_factory_io_to_io_.GetWeakPtr(), base::Passed(&data),
|
| push_registration_id, p256dh, auth));
|
| }
|
|
|
| void PushMessagingManager::DidPersistRegistrationOnIO(
|
| - const RegisterData& data,
|
| + RegisterData data,
|
| const std::string& push_registration_id,
|
| const std::vector<uint8_t>& p256dh,
|
| const std::vector<uint8_t>& auth,
|
| ServiceWorkerStatusCode service_worker_status) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| if (service_worker_status == SERVICE_WORKER_OK) {
|
| - SendSubscriptionSuccess(data,
|
| + SendSubscriptionSuccess(std::move(data),
|
| PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE,
|
| push_registration_id, p256dh, auth);
|
| } else {
|
| // TODO(johnme): Unregister, so PushMessagingServiceImpl can decrease count.
|
| - SendSubscriptionError(data, PUSH_REGISTRATION_STATUS_STORAGE_ERROR);
|
| + SendSubscriptionError(std::move(data),
|
| + PUSH_REGISTRATION_STATUS_STORAGE_ERROR);
|
| }
|
| }
|
|
|
| void PushMessagingManager::SendSubscriptionError(
|
| - const RegisterData& data,
|
| + RegisterData data,
|
| PushRegistrationStatus status) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - data.callback.Run(status, base::nullopt /* endpoint */,
|
| - base::nullopt /* options */, base::nullopt /* p256dh */,
|
| - base::nullopt /* auth */);
|
| + std::move(data.callback)
|
| + .Run(status, base::nullopt /* endpoint */, base::nullopt /* options */,
|
| + base::nullopt /* p256dh */, base::nullopt /* auth */);
|
| RecordRegistrationStatus(status);
|
| }
|
|
|
| void PushMessagingManager::SendSubscriptionSuccess(
|
| - const RegisterData& data,
|
| + RegisterData data,
|
| PushRegistrationStatus status,
|
| const std::string& push_subscription_id,
|
| const std::vector<uint8_t>& p256dh,
|
| @@ -596,14 +620,15 @@ 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(data, PUSH_REGISTRATION_STATUS_SERVICE_NOT_AVAILABLE);
|
| + SendSubscriptionError(std::move(data),
|
| + PUSH_REGISTRATION_STATUS_SERVICE_NOT_AVAILABLE);
|
| return;
|
| }
|
|
|
| const GURL endpoint = CreateEndpoint(
|
| IsApplicationServerKey(data.options.sender_info), push_subscription_id);
|
|
|
| - data.callback.Run(status, endpoint, data.options, p256dh, auth);
|
| + std::move(data.callback).Run(status, endpoint, data.options, p256dh, auth);
|
|
|
| RecordRegistrationStatus(status);
|
| }
|
| @@ -613,26 +638,27 @@ void PushMessagingManager::SendSubscriptionSuccess(
|
| // -----------------------------------------------------------------------------
|
|
|
| void PushMessagingManager::Unsubscribe(int64_t service_worker_registration_id,
|
| - const UnsubscribeCallback& callback) {
|
| + UnsubscribeCallback callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| ServiceWorkerRegistration* service_worker_registration =
|
| service_worker_context_->GetLiveRegistration(
|
| service_worker_registration_id);
|
| if (!service_worker_registration) {
|
| - DidUnregister(callback, PUSH_UNREGISTRATION_STATUS_NO_SERVICE_WORKER);
|
| + DidUnregister(std::move(callback),
|
| + PUSH_UNREGISTRATION_STATUS_NO_SERVICE_WORKER);
|
| return;
|
| }
|
|
|
| service_worker_context_->GetRegistrationUserData(
|
| service_worker_registration_id, {kPushSenderIdServiceWorkerKey},
|
| base::Bind(&PushMessagingManager::UnsubscribeHavingGottenSenderId,
|
| - weak_factory_io_to_io_.GetWeakPtr(), callback,
|
| + weak_factory_io_to_io_.GetWeakPtr(), base::Passed(&callback),
|
| service_worker_registration_id,
|
| service_worker_registration->pattern().GetOrigin()));
|
| }
|
|
|
| void PushMessagingManager::UnsubscribeHavingGottenSenderId(
|
| - const UnsubscribeCallback& callback,
|
| + UnsubscribeCallback callback,
|
| int64_t service_worker_registration_id,
|
| const GURL& requesting_origin,
|
| const std::vector<std::string>& sender_ids,
|
| @@ -647,12 +673,12 @@ void PushMessagingManager::UnsubscribeHavingGottenSenderId(
|
| BrowserThread::PostTask(
|
| BrowserThread::UI, FROM_HERE,
|
| base::Bind(&Core::UnregisterFromService, base::Unretained(ui_core_.get()),
|
| - callback, service_worker_registration_id, requesting_origin,
|
| - sender_id));
|
| + base::Passed(&callback), service_worker_registration_id,
|
| + requesting_origin, sender_id));
|
| }
|
|
|
| void PushMessagingManager::Core::UnregisterFromService(
|
| - const UnsubscribeCallback& callback,
|
| + UnsubscribeCallback callback,
|
| int64_t service_worker_registration_id,
|
| const GURL& requesting_origin,
|
| const std::string& sender_id) {
|
| @@ -664,7 +690,8 @@ void PushMessagingManager::Core::UnregisterFromService(
|
| DCHECK(!is_incognito());
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&PushMessagingManager::DidUnregister, io_parent_, callback,
|
| + base::Bind(&PushMessagingManager::DidUnregister, io_parent_,
|
| + base::Passed(&callback),
|
| PUSH_UNREGISTRATION_STATUS_SERVICE_NOT_AVAILABLE));
|
| return;
|
| }
|
| @@ -673,24 +700,24 @@ void PushMessagingManager::Core::UnregisterFromService(
|
| PUSH_UNREGISTRATION_REASON_JAVASCRIPT_API, requesting_origin,
|
| service_worker_registration_id, sender_id,
|
| base::Bind(&Core::DidUnregisterFromService,
|
| - weak_factory_ui_to_ui_.GetWeakPtr(), callback,
|
| + weak_factory_ui_to_ui_.GetWeakPtr(), base::Passed(&callback),
|
| service_worker_registration_id));
|
| }
|
|
|
| void PushMessagingManager::Core::DidUnregisterFromService(
|
| - const UnsubscribeCallback& callback,
|
| + UnsubscribeCallback callback,
|
| int64_t service_worker_registration_id,
|
| PushUnregistrationStatus unregistration_status) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
|
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&PushMessagingManager::DidUnregister, io_parent_, callback,
|
| - unregistration_status));
|
| + base::Bind(&PushMessagingManager::DidUnregister, io_parent_,
|
| + base::Passed(&callback), unregistration_status));
|
| }
|
|
|
| void PushMessagingManager::DidUnregister(
|
| - const UnsubscribeCallback& callback,
|
| + UnsubscribeCallback callback,
|
| PushUnregistrationStatus unregistration_status) {
|
| // Only called from IO thread, but would be safe to call from UI thread.
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| @@ -698,21 +725,21 @@ void PushMessagingManager::DidUnregister(
|
| case PUSH_UNREGISTRATION_STATUS_SUCCESS_UNREGISTERED:
|
| case PUSH_UNREGISTRATION_STATUS_PENDING_NETWORK_ERROR:
|
| case PUSH_UNREGISTRATION_STATUS_PENDING_SERVICE_ERROR:
|
| - callback.Run(blink::WebPushError::kErrorTypeNone,
|
| - true /* did_unsubscribe */,
|
| - base::nullopt /* error_message */);
|
| + std::move(callback).Run(blink::WebPushError::kErrorTypeNone,
|
| + true /* did_unsubscribe */,
|
| + base::nullopt /* error_message */);
|
| break;
|
| case PUSH_UNREGISTRATION_STATUS_SUCCESS_WAS_NOT_REGISTERED:
|
| - callback.Run(blink::WebPushError::kErrorTypeNone,
|
| - false /* did_unsubscribe */,
|
| - base::nullopt /* error_message */);
|
| + std::move(callback).Run(blink::WebPushError::kErrorTypeNone,
|
| + false /* did_unsubscribe */,
|
| + base::nullopt /* error_message */);
|
| break;
|
| case PUSH_UNREGISTRATION_STATUS_NO_SERVICE_WORKER:
|
| case PUSH_UNREGISTRATION_STATUS_SERVICE_NOT_AVAILABLE:
|
| case PUSH_UNREGISTRATION_STATUS_STORAGE_ERROR:
|
| - callback.Run(blink::WebPushError::kErrorTypeAbort, false,
|
| - std::string(PushUnregistrationStatusToString(
|
| - unregistration_status)) /* error_message */);
|
| + std::move(callback).Run(blink::WebPushError::kErrorTypeAbort, false,
|
| + std::string(PushUnregistrationStatusToString(
|
| + unregistration_status)) /* error_message */);
|
| break;
|
| case PUSH_UNREGISTRATION_STATUS_NETWORK_ERROR:
|
| NOTREACHED();
|
| @@ -727,19 +754,19 @@ void PushMessagingManager::DidUnregister(
|
|
|
| void PushMessagingManager::GetSubscription(
|
| int64_t service_worker_registration_id,
|
| - const GetSubscriptionCallback& callback) {
|
| + GetSubscriptionCallback callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| // TODO(johnme): Validate arguments?
|
| service_worker_context_->GetRegistrationUserData(
|
| service_worker_registration_id,
|
| {kPushRegistrationIdServiceWorkerKey, kPushSenderIdServiceWorkerKey},
|
| base::Bind(&PushMessagingManager::DidGetSubscription,
|
| - weak_factory_io_to_io_.GetWeakPtr(), callback,
|
| + weak_factory_io_to_io_.GetWeakPtr(), base::Passed(&callback),
|
| service_worker_registration_id));
|
| }
|
|
|
| void PushMessagingManager::DidGetSubscription(
|
| - const GetSubscriptionCallback& callback,
|
| + GetSubscriptionCallback callback,
|
| int64_t service_worker_registration_id,
|
| const std::vector<std::string>& push_subscription_id_and_sender_info,
|
| ServiceWorkerStatusCode service_worker_status) {
|
| @@ -783,9 +810,9 @@ void PushMessagingManager::DidGetSubscription(
|
| service_worker_registration_id, sender_info,
|
| push_subscription_id,
|
| base::Bind(&Core::GetSubscriptionDidGetInfoOnUI,
|
| - ui_core_weak_ptr_, callback, origin,
|
| - service_worker_registration_id, endpoint,
|
| - sender_info)));
|
| + ui_core_weak_ptr_, base::Passed(&callback),
|
| + origin, service_worker_registration_id,
|
| + endpoint, sender_info)));
|
|
|
| return;
|
| }
|
| @@ -820,14 +847,14 @@ void PushMessagingManager::DidGetSubscription(
|
| break;
|
| }
|
| }
|
| - callback.Run(get_status, base::nullopt /* endpoint */,
|
| - base::nullopt /* options */, base::nullopt /* p256dh */,
|
| - base::nullopt /* auth */);
|
| + std::move(callback).Run(get_status, base::nullopt /* endpoint */,
|
| + base::nullopt /* options */,
|
| + base::nullopt /* p256dh */, base::nullopt /* auth */);
|
| RecordGetRegistrationStatus(get_status);
|
| }
|
|
|
| void PushMessagingManager::Core::GetSubscriptionDidGetInfoOnUI(
|
| - const GetSubscriptionCallback& callback,
|
| + GetSubscriptionCallback callback,
|
| const GURL& origin,
|
| int64_t service_worker_registration_id,
|
| const GURL& endpoint,
|
| @@ -847,9 +874,9 @@ void PushMessagingManager::Core::GetSubscriptionDidGetInfoOnUI(
|
|
|
| PushGetRegistrationStatus status = PUSH_GETREGISTRATION_STATUS_SUCCESS;
|
|
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - base::Bind(callback, status, endpoint, options, p256dh, auth));
|
| + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
|
| + base::BindOnce(std::move(callback), status,
|
| + endpoint, options, p256dh, auth));
|
|
|
| RecordGetRegistrationStatus(status);
|
| } else {
|
| @@ -860,9 +887,11 @@ void PushMessagingManager::Core::GetSubscriptionDidGetInfoOnUI(
|
| // shutting down.
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| - base::Bind(callback, PUSH_GETREGISTRATION_STATUS_RENDERER_SHUTDOWN,
|
| - base::nullopt /* endpoint */, base::nullopt /* options */,
|
| - base::nullopt /* p256dh */, base::nullopt /* auth */));
|
| + base::BindOnce(std::move(callback),
|
| + PUSH_GETREGISTRATION_STATUS_RENDERER_SHUTDOWN,
|
| + base::nullopt /* endpoint */,
|
| + base::nullopt /* options */,
|
| + base::nullopt /* p256dh */, base::nullopt /* auth */));
|
| return;
|
| }
|
|
|
| @@ -877,22 +906,23 @@ void PushMessagingManager::Core::GetSubscriptionDidGetInfoOnUI(
|
| PUSH_UNREGISTRATION_REASON_GET_SUBSCRIPTION_STORAGE_CORRUPT, origin,
|
| service_worker_registration_id, sender_info,
|
| base::Bind(&Core::GetSubscriptionDidUnsubscribe,
|
| - weak_factory_ui_to_ui_.GetWeakPtr(), callback, status));
|
| + weak_factory_ui_to_ui_.GetWeakPtr(), base::Passed(&callback),
|
| + status));
|
|
|
| RecordGetRegistrationStatus(status);
|
| }
|
| }
|
|
|
| void PushMessagingManager::Core::GetSubscriptionDidUnsubscribe(
|
| - const GetSubscriptionCallback& callback,
|
| + GetSubscriptionCallback callback,
|
| PushGetRegistrationStatus get_status,
|
| PushUnregistrationStatus unsubscribe_status) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| - base::Bind(callback, get_status, base::nullopt /* endpoint */,
|
| - base::nullopt /* options */, base::nullopt /* p256dh */,
|
| - base::nullopt /* auth */));
|
| + base::BindOnce(std::move(callback), get_status,
|
| + base::nullopt /* endpoint */, base::nullopt /* options */,
|
| + base::nullopt /* p256dh */, base::nullopt /* auth */));
|
| }
|
|
|
| // GetPermission methods on both IO and UI threads, merged in order of use from
|
| @@ -902,28 +932,28 @@ void PushMessagingManager::Core::GetSubscriptionDidUnsubscribe(
|
| void PushMessagingManager::GetPermissionStatus(
|
| int64_t service_worker_registration_id,
|
| bool user_visible,
|
| - const GetPermissionStatusCallback& callback) {
|
| + GetPermissionStatusCallback callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| ServiceWorkerRegistration* service_worker_registration =
|
| service_worker_context_->GetLiveRegistration(
|
| service_worker_registration_id);
|
| if (!service_worker_registration) {
|
| // Return error: ErrorTypeAbort.
|
| - callback.Run(blink::WebPushError::kErrorTypeAbort,
|
| - blink::kWebPushPermissionStatusDenied);
|
| + std::move(callback).Run(blink::WebPushError::kErrorTypeAbort,
|
| + blink::kWebPushPermissionStatusDenied);
|
| return;
|
| }
|
|
|
| BrowserThread::PostTask(
|
| BrowserThread::UI, FROM_HERE,
|
| base::Bind(&Core::GetPermissionStatusOnUI,
|
| - base::Unretained(ui_core_.get()), callback,
|
| + base::Unretained(ui_core_.get()), base::Passed(&callback),
|
| service_worker_registration->pattern().GetOrigin(),
|
| user_visible));
|
| }
|
|
|
| void PushMessagingManager::Core::GetPermissionStatusOnUI(
|
| - const GetPermissionStatusCallback& callback,
|
| + GetPermissionStatusCallback callback,
|
| const GURL& requesting_origin,
|
| bool user_visible) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| @@ -934,8 +964,9 @@ void PushMessagingManager::Core::GetPermissionStatusOnUI(
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| // Return error: ErrorTypeNotSupported.
|
| - base::Bind(callback, blink::WebPushError::kErrorTypeNotSupported,
|
| - blink::kWebPushPermissionStatusDenied));
|
| + base::BindOnce(std::move(callback),
|
| + blink::WebPushError::kErrorTypeNotSupported,
|
| + blink::kWebPushPermissionStatusDenied));
|
| return;
|
| }
|
| permission_status =
|
| @@ -947,14 +978,15 @@ void PushMessagingManager::Core::GetPermissionStatusOnUI(
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| // Return error: ErrorTypeAbort.
|
| - base::Bind(callback, blink::WebPushError::kErrorTypeAbort,
|
| - blink::kWebPushPermissionStatusDenied));
|
| + base::BindOnce(std::move(callback),
|
| + blink::WebPushError::kErrorTypeAbort,
|
| + blink::kWebPushPermissionStatusDenied));
|
| return;
|
| }
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| - base::Bind(callback, blink::WebPushError::kErrorTypeNone,
|
| - permission_status));
|
| + base::BindOnce(std::move(callback), blink::WebPushError::kErrorTypeNone,
|
| + permission_status));
|
| }
|
|
|
| // Helper methods on both IO and UI threads, merged from
|
| @@ -966,17 +998,19 @@ void PushMessagingManager::Core::GetSubscriptionInfoOnUI(
|
| int64_t service_worker_registration_id,
|
| const std::string& sender_id,
|
| const std::string& push_subscription_id,
|
| - const PushMessagingService::SubscriptionInfoCallback& callback) {
|
| + PushMessagingService::SubscriptionInfoCallback callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| PushMessagingService* push_service = service();
|
| if (!push_service) {
|
| - callback.Run(false /* is_valid */, std::vector<uint8_t>() /* p256dh */,
|
| - std::vector<uint8_t>() /* auth */);
|
| + std::move(callback).Run(false /* is_valid */,
|
| + std::vector<uint8_t>() /* p256dh */,
|
| + std::vector<uint8_t>() /* auth */);
|
| return;
|
| }
|
|
|
| push_service->GetSubscriptionInfo(origin, service_worker_registration_id,
|
| - sender_id, push_subscription_id, callback);
|
| + sender_id, push_subscription_id,
|
| + std::move(callback));
|
| }
|
|
|
| GURL PushMessagingManager::CreateEndpoint(
|
|
|