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

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

Issue 778243002: Push API: Return cached registration if available. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@store2
Patch Set: Address review comments Created 6 years 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 0ac0ce5b0a6e5c53c4d9dbc11b6b41fa62f02e25..8743a593e9896b99a85e4c074f297eb139a2e05f 100644
--- a/content/browser/push_messaging/push_messaging_message_filter.cc
+++ b/content/browser/push_messaging/push_messaging_message_filter.cc
@@ -111,10 +111,7 @@ void PushMessagingMessageFilter::OnRegisterFromDocument(
data.render_frame_id = render_frame_id;
data.user_visible_only = user_visible_only;
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&PushMessagingMessageFilter::RegisterOnUI,
- this, data, sender_id));
+ CheckForExistingRegistration(data, sender_id);
}
void PushMessagingMessageFilter::OnRegisterFromWorker(
@@ -137,10 +134,7 @@ void PushMessagingMessageFilter::OnRegisterFromWorker(
data.requesting_origin = service_worker_registration->pattern().GetOrigin();
data.service_worker_registration_id = service_worker_registration_id;
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&PushMessagingMessageFilter::RegisterOnUI,
- this, data, sender_id));
+ CheckForExistingRegistration(data, sender_id);
}
void PushMessagingMessageFilter::OnPermissionStatusRequest(
@@ -186,6 +180,41 @@ void PushMessagingMessageFilter::OnGetPermissionStatus(
request_id));
}
+void PushMessagingMessageFilter::CheckForExistingRegistration(
+ const RegisterData& data,
+ const std::string& sender_id) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ service_worker_context_->context()->storage()->GetUserData(
+ data.service_worker_registration_id,
+ kPushRegistrationIdServiceWorkerKey,
+ base::Bind(&PushMessagingMessageFilter::DidCheckForExistingRegistration,
+ weak_factory_io_to_io_.GetWeakPtr(),
+ data, sender_id));
+}
+
+void PushMessagingMessageFilter::DidCheckForExistingRegistration(
+ const RegisterData& data,
+ const std::string& sender_id,
+ const std::string& push_registration_id,
+ ServiceWorkerStatusCode service_worker_status) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ if (service_worker_status == SERVICE_WORKER_OK) {
+ GURL push_endpoint(service()->GetPushEndpoint());
Michael van Ouwerkerk 2014/12/11 17:12:53 The service() method is UI thread only, we're on t
johnme 2014/12/11 18:32:33 Done (sigh, more thread hops 8-)
+ SendRegisterSuccess(data, PUSH_REGISTRATION_STATUS_SUCCESS_FROM_CACHE,
+ push_endpoint, push_registration_id);
+ return;
+ }
+ // TODO(johnme): The spec allows the register algorithm to reject with an
+ // AbortError when accessing storage fails. Perhaps we should do that if
+ // 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
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&PushMessagingMessageFilter::RegisterOnUI,
+ this, data, sender_id));
+}
+
void PushMessagingMessageFilter::RegisterOnUI(
const RegisterData& data,
const std::string& sender_id) {
@@ -247,7 +276,7 @@ void PushMessagingMessageFilter::DidRegister(
const std::string& push_registration_id,
PushRegistrationStatus status) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- if (status == PUSH_REGISTRATION_STATUS_SUCCESS) {
+ if (status == PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE) {
GURL push_endpoint(service()->GetPushEndpoint());
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
@@ -279,10 +308,14 @@ void PushMessagingMessageFilter::DidPersistRegistrationOnIO(
const std::string& push_registration_id,
ServiceWorkerStatusCode service_worker_status) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (service_worker_status == SERVICE_WORKER_OK)
- SendRegisterSuccess(data, push_endpoint, push_registration_id);
- else
+ if (service_worker_status == SERVICE_WORKER_OK) {
+ SendRegisterSuccess(data,
+ PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE,
+ push_endpoint, push_registration_id);
+ } else {
+ // TODO(johnme): Unregister, so PushMessagingServiceImpl can decrease count.
SendRegisterError(data, PUSH_REGISTRATION_STATUS_STORAGE_ERROR);
+ }
}
void PushMessagingMessageFilter::SendRegisterError(
@@ -300,6 +333,7 @@ void PushMessagingMessageFilter::SendRegisterError(
void PushMessagingMessageFilter::SendRegisterSuccess(
const RegisterData& data,
+ PushRegistrationStatus status,
const GURL& push_endpoint,
const std::string& push_registration_id) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -311,7 +345,7 @@ void PushMessagingMessageFilter::SendRegisterSuccess(
Send(new PushMessagingMsg_RegisterFromWorkerSuccess(
data.request_id, push_endpoint, push_registration_id));
}
- RecordRegistrationStatus(PUSH_REGISTRATION_STATUS_SUCCESS);
+ RecordRegistrationStatus(status);
}
PushMessagingService* PushMessagingMessageFilter::service() {

Powered by Google App Engine
This is Rietveld 408576698