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

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

Issue 2433273003: service worker: Plumb NavigationPreloadManager.enable/disable to browser-side (Closed)
Patch Set: comments Created 4 years, 2 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 a69bd2785dc5f6317d55a4e5f6f34d2252ad9930..810c63f64b7994f8b18c71d57533e5e3063c440c 100644
--- a/content/browser/service_worker/service_worker_dispatcher_host.cc
+++ b/content/browser/service_worker/service_worker_dispatcher_host.cc
@@ -51,6 +51,8 @@ const char kShutdownErrorMessage[] =
const char kUserDeniedPermissionMessage[] =
"The user denied permission to use Service Worker.";
const char kInvalidStateErrorMessage[] = "The object is in an invalid state.";
+const char kEnableNavigationPreloadErrorPrefix[] =
+ "Failed to enable or disable navigation preload: ";
const uint32_t kFilteredMessageClasses[] = {
ServiceWorkerMsgStart, EmbeddedWorkerMsgStart,
@@ -184,6 +186,8 @@ bool ServiceWorkerDispatcherHost::OnMessageReceived(
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementRegistrationRefCount,
OnDecrementRegistrationRefCount)
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_TerminateWorker, OnTerminateWorker)
+ IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_EnableNavigationPreload,
+ OnEnableNavigationPreload)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
@@ -656,6 +660,70 @@ void ServiceWorkerDispatcherHost::OnGetRegistrationForReady(
}
}
+void ServiceWorkerDispatcherHost::OnEnableNavigationPreload(
+ int thread_id,
+ int request_id,
+ int provider_id,
+ int64_t registration_id,
+ bool enable) {
+ ProviderStatus provider_status;
+ ServiceWorkerProviderHost* provider_host =
+ GetProviderHostForRequest(&provider_status, provider_id);
+ switch (provider_status) {
+ case ProviderStatus::NO_CONTEXT: // fallthrough
+ case ProviderStatus::DEAD_HOST:
+ Send(new ServiceWorkerMsg_EnableNavigationPreloadError(
+ thread_id, request_id, WebServiceWorkerError::ErrorTypeAbort,
+ std::string(kEnableNavigationPreloadErrorPrefix) +
+ std::string(kShutdownErrorMessage)));
+ return;
+ case ProviderStatus::NO_HOST:
+ bad_message::ReceivedBadMessage(
+ this, bad_message::SWDH_ENABLE_NAVIGATION_PRELOAD_NO_HOST);
+ return;
+ case ProviderStatus::NO_URL:
+ Send(new ServiceWorkerMsg_EnableNavigationPreloadError(
+ thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity,
+ std::string(kEnableNavigationPreloadErrorPrefix) +
+ std::string(kNoDocumentURLErrorMessage)));
+ return;
+ case ProviderStatus::OK:
+ break;
+ }
+
+ ServiceWorkerRegistration* registration =
+ GetContext()->GetLiveRegistration(registration_id);
+ if (!registration) {
+ // |registration| must be alive because a renderer retains a registration
+ // reference at this point.
+ bad_message::ReceivedBadMessage(
+ this, bad_message::SWDH_ENABLE_NAVIGATION_PRELOAD_BAD_REGISTRATION_ID);
+ return;
+ }
+
+ std::vector<GURL> urls = {provider_host->document_url(),
+ registration->pattern()};
+ if (!ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers(urls)) {
+ bad_message::ReceivedBadMessage(
+ this, bad_message::SWDH_ENABLE_NAVIGATION_PRELOAD_INVALID_ORIGIN);
+ return;
+ }
+
+ if (!GetContentClient()->browser()->AllowServiceWorker(
+ registration->pattern(), provider_host->topmost_frame_url(),
+ resource_context_, render_process_id_, provider_host->frame_id())) {
+ Send(new ServiceWorkerMsg_EnableNavigationPreloadError(
+ thread_id, request_id, WebServiceWorkerError::ErrorTypeDisabled,
+ std::string(kEnableNavigationPreloadErrorPrefix) +
+ std::string(kUserDeniedPermissionMessage)));
+ return;
+ }
+
+ // TODO(falken): Write to disk before resolving the promise.
+ registration->EnableNavigationPreload(enable);
+ Send(new ServiceWorkerMsg_DidEnableNavigationPreload(thread_id, request_id));
+}
+
void ServiceWorkerDispatcherHost::OnPostMessageToWorker(
int handle_id,
int provider_id,

Powered by Google App Engine
This is Rietveld 408576698