Chromium Code Reviews| 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 810c63f64b7994f8b18c71d57533e5e3063c440c..3b6ec99eeac4970fcac26063a152cd7392ca7084 100644 |
| --- a/content/browser/service_worker/service_worker_dispatcher_host.cc |
| +++ b/content/browser/service_worker/service_worker_dispatcher_host.cc |
| @@ -53,6 +53,8 @@ const char kUserDeniedPermissionMessage[] = |
| const char kInvalidStateErrorMessage[] = "The object is in an invalid state."; |
| const char kEnableNavigationPreloadErrorPrefix[] = |
| "Failed to enable or disable navigation preload: "; |
| +const char kGetNavigationPreloadStateErrorPrefix[] = |
| + "Failed to get navigation preload state: "; |
| const uint32_t kFilteredMessageClasses[] = { |
| ServiceWorkerMsgStart, EmbeddedWorkerMsgStart, |
| @@ -188,6 +190,8 @@ bool ServiceWorkerDispatcherHost::OnMessageReceived( |
| IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_TerminateWorker, OnTerminateWorker) |
| IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_EnableNavigationPreload, |
| OnEnableNavigationPreload) |
| + IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetNavigationPreloadState, |
| + OnGetNavigationPreloadState) |
| IPC_MESSAGE_UNHANDLED(handled = false) |
| IPC_END_MESSAGE_MAP() |
| @@ -724,6 +728,68 @@ void ServiceWorkerDispatcherHost::OnEnableNavigationPreload( |
| Send(new ServiceWorkerMsg_DidEnableNavigationPreload(thread_id, request_id)); |
| } |
| +void ServiceWorkerDispatcherHost::OnGetNavigationPreloadState( |
| + int thread_id, |
| + int request_id, |
| + int provider_id, |
| + int64_t registration_id) { |
| + 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_GetNavigationPreloadStateError( |
| + thread_id, request_id, WebServiceWorkerError::ErrorTypeAbort, |
| + std::string(kGetNavigationPreloadStateErrorPrefix) + |
| + std::string(kShutdownErrorMessage))); |
| + return; |
| + case ProviderStatus::NO_HOST: |
| + bad_message::ReceivedBadMessage( |
| + this, bad_message::SWDH_GET_NAVIGATION_PRELOAD_STATE_NO_HOST); |
| + return; |
| + case ProviderStatus::NO_URL: |
| + Send(new ServiceWorkerMsg_GetNavigationPreloadStateError( |
| + thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity, |
| + std::string(kGetNavigationPreloadStateErrorPrefix) + |
| + 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); |
|
nasko
2016/10/25 23:23:42
Shouldn't this be SWDH_GET_NAVIGATION_PRELOAD_STAT
falken
2016/10/25 23:55:58
Done. Yes more bad copy paste coding.
|
| + return; |
| + } |
| + |
| + std::vector<GURL> urls = {provider_host->document_url(), |
| + registration->pattern()}; |
| + if (!ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers(urls)) { |
| + bad_message::ReceivedBadMessage( |
| + this, bad_message::SWDH_GET_NAVIGATION_PRELOAD_STATE_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_GetNavigationPreloadStateError( |
| + thread_id, request_id, WebServiceWorkerError::ErrorTypeDisabled, |
| + std::string(kGetNavigationPreloadStateErrorPrefix) + |
| + std::string(kUserDeniedPermissionMessage))); |
| + return; |
| + } |
| + |
| + Send(new ServiceWorkerMsg_DidGetNavigationPreloadState( |
| + thread_id, request_id, registration->is_navigation_preload_enabled())); |
| +} |
| + |
| void ServiceWorkerDispatcherHost::OnPostMessageToWorker( |
| int handle_id, |
| int provider_id, |