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

Unified Diff: content/browser/service_worker/service_worker_dispatcher_host.cc

Issue 1146913004: Service Worker: Add ServiceWorkerContainer.getRegistrations() method. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update tools/metrics/histograms/histograms.xml. Created 5 years, 6 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/service_worker/service_worker_dispatcher_host.cc
diff --git a/content/browser/service_worker/service_worker_dispatcher_host.cc b/content/browser/service_worker/service_worker_dispatcher_host.cc
index 16fb50bccb0a67e027eab7d8582195a4d1e3e39c..d80cd145383564fe60cf3592cacea310c20fa7b6 100644
--- a/content/browser/service_worker/service_worker_dispatcher_host.cc
+++ b/content/browser/service_worker/service_worker_dispatcher_host.cc
@@ -162,6 +162,8 @@ bool ServiceWorkerDispatcherHost::OnMessageReceived(
OnUnregisterServiceWorker)
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetRegistration,
OnGetRegistration)
+ IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetRegistrations,
+ OnGetRegistrations)
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetRegistrationForReady,
OnGetRegistrationForReady)
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ProviderCreated,
@@ -439,6 +441,9 @@ void ServiceWorkerDispatcherHost::OnGetRegistration(
const GURL& document_url) {
TRACE_EVENT0("ServiceWorker",
"ServiceWorkerDispatcherHost::OnGetRegistration");
+
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
if (!GetContext()) {
Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationError(
thread_id, request_id, blink::WebServiceWorkerError::ErrorTypeAbort,
@@ -492,7 +497,6 @@ void ServiceWorkerDispatcherHost::OnGetRegistration(
return;
}
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (GetContext()->storage()->IsDisabled()) {
SendGetRegistrationError(thread_id, request_id, SERVICE_WORKER_ERROR_ABORT);
return;
@@ -513,6 +517,75 @@ void ServiceWorkerDispatcherHost::OnGetRegistration(
request_id));
}
+void ServiceWorkerDispatcherHost::OnGetRegistrations(int thread_id,
+ int request_id,
+ int provider_id) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+ if (!GetContext()) {
+ Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationsError(
+ thread_id, request_id, blink::WebServiceWorkerError::ErrorTypeAbort,
+ base::ASCIIToUTF16(kServiceWorkerGetRegistrationsErrorPrefix) +
+ base::ASCIIToUTF16(kShutdownErrorMessage)));
+ return;
+ }
+
+ ServiceWorkerProviderHost* provider_host =
+ GetContext()->GetProviderHost(render_process_id_, provider_id);
+ if (!provider_host) {
+ bad_message::ReceivedBadMessage(
+ this, bad_message::SWDH_GET_REGISTRATIONS_NO_HOST);
+ return;
+ }
+ if (!provider_host->IsContextAlive()) {
+ Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationsError(
+ thread_id, request_id, blink::WebServiceWorkerError::ErrorTypeAbort,
+ base::ASCIIToUTF16(kServiceWorkerGetRegistrationsErrorPrefix) +
+ base::ASCIIToUTF16(kShutdownErrorMessage)));
+ return;
+ }
+
+ // TODO(jungkees): This check can be removed once crbug.com/439697 is fixed.
+ if (provider_host->document_url().is_empty()) {
+ Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationsError(
+ thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity,
+ base::ASCIIToUTF16(kServiceWorkerGetRegistrationsErrorPrefix) +
+ base::ASCIIToUTF16(kNoDocumentURLErrorMessage)));
+ return;
+ }
+
+ if (!OriginCanAccessServiceWorkers(provider_host->document_url())) {
+ bad_message::ReceivedBadMessage(
+ this, bad_message::SWDH_GET_REGISTRATIONS_INVALID_ORIGIN);
+ return;
+ }
+
+ if (!GetContentClient()->browser()->AllowServiceWorker(
+ provider_host->document_url(), provider_host->topmost_frame_url(),
+ resource_context_, render_process_id_, provider_host->frame_id())) {
+ Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationsError(
+ thread_id, request_id, WebServiceWorkerError::ErrorTypeUnknown,
+ base::ASCIIToUTF16(kServiceWorkerGetRegistrationsErrorPrefix) +
+ base::ASCIIToUTF16(kUserDeniedPermissionMessage)));
+ return;
+ }
+
+ if (GetContext()->storage()->IsDisabled()) {
+ SendGetRegistrationsError(thread_id, request_id,
+ SERVICE_WORKER_ERROR_ABORT);
+ return;
+ }
+
+ TRACE_EVENT_ASYNC_BEGIN0("ServiceWorker",
+ "ServiceWorkerDispatcherHost::GetRegistrations",
+ request_id);
+
+ GetContext()->storage()->GetRegistrationsForOrigin(
+ provider_host->document_url().GetOrigin(),
+ base::Bind(&ServiceWorkerDispatcherHost::GetRegistrationsComplete, this,
+ thread_id, provider_id, request_id));
+}
+
void ServiceWorkerDispatcherHost::OnGetRegistrationForReady(
int thread_id,
int request_id,
@@ -972,6 +1045,43 @@ void ServiceWorkerDispatcherHost::GetRegistrationComplete(
thread_id, request_id, info, attrs));
}
+void ServiceWorkerDispatcherHost::GetRegistrationsComplete(
+ int thread_id,
+ int provider_id,
+ int request_id,
+ const std::vector<scoped_refptr<ServiceWorkerRegistration>>&
+ registrations) {
+ TRACE_EVENT_ASYNC_END0("ServiceWorker",
+ "ServiceWorkerDispatcherHost::GetRegistrations",
+ request_id);
+ if (!GetContext())
+ return;
+
+ ServiceWorkerProviderHost* provider_host =
+ GetContext()->GetProviderHost(render_process_id_, provider_id);
+ if (!provider_host)
+ return; // The provider has already been destroyed.
+
+ std::vector<ServiceWorkerRegistrationObjectInfo> object_infos;
+ std::vector<ServiceWorkerVersionAttributes> version_attrs;
+
+ for (const auto& registration : registrations) {
+ DCHECK(registration.get());
+ if (!registration->is_uninstalling()) {
+ ServiceWorkerRegistrationObjectInfo object_info;
+ ServiceWorkerVersionAttributes version_attr;
+ GetRegistrationObjectInfoAndVersionAttributes(
+ provider_host->AsWeakPtr(), registration.get(), &object_info,
+ &version_attr);
+ object_infos.push_back(object_info);
+ version_attrs.push_back(version_attr);
+ }
+ }
+
+ Send(new ServiceWorkerMsg_DidGetRegistrations(thread_id, request_id,
+ object_infos, version_attrs));
+}
+
void ServiceWorkerDispatcherHost::GetRegistrationForReadyComplete(
int thread_id,
int request_id,
@@ -1037,6 +1147,20 @@ void ServiceWorkerDispatcherHost::SendGetRegistrationError(
error_message));
}
+void ServiceWorkerDispatcherHost::SendGetRegistrationsError(
+ int thread_id,
+ int request_id,
+ ServiceWorkerStatusCode status) {
+ base::string16 error_message;
+ blink::WebServiceWorkerError::ErrorType error_type;
+ GetServiceWorkerRegistrationStatusResponse(status, std::string(), &error_type,
+ &error_message);
+ Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationsError(
+ thread_id, request_id, error_type,
+ base::ASCIIToUTF16(kServiceWorkerGetRegistrationErrorPrefix) +
+ error_message));
+}
+
ServiceWorkerContextCore* ServiceWorkerDispatcherHost::GetContext() {
if (!context_wrapper_.get())
return nullptr;

Powered by Google App Engine
This is Rietveld 408576698