| 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 b0cffbdea7a567c67d08e25441a4335b526f4cdc..69e29a852e2a7b54588414fa1ff2f47c4d782001 100644
|
| --- a/content/browser/service_worker/service_worker_dispatcher_host.cc
|
| +++ b/content/browser/service_worker/service_worker_dispatcher_host.cc
|
| @@ -182,6 +182,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()
|
|
|
| @@ -654,6 +656,67 @@ 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,
|
| + base::ASCIIToUTF16(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,
|
| + base::ASCIIToUTF16(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,
|
| + base::ASCIIToUTF16(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,
|
|
|