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

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

Issue 2443103002: service worker: Implement NavigationPreloadManager.getState (Closed)
Patch Set: rm file added in bad merge 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 810c63f64b7994f8b18c71d57533e5e3063c440c..978aec5412311b3a389377e31e3973dbce3ccff8 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,69 @@ 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_GET_NAVIGATION_PRELOAD_STATE_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_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,

Powered by Google App Engine
This is Rietveld 408576698