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 f65ee2decaa9edecc1c97463c2d1d90a4fc1665d..9031354c2cc0ea18788d44a216ed3505778008b5 100644 |
--- a/content/browser/service_worker/service_worker_dispatcher_host.cc |
+++ b/content/browser/service_worker/service_worker_dispatcher_host.cc |
@@ -168,6 +168,8 @@ bool ServiceWorkerDispatcherHost::OnMessageReceived( |
OnRegisterServiceWorker) |
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_UpdateServiceWorker, |
OnUpdateServiceWorker) |
+ IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DeprecatedUnregisterServiceWorker, |
+ OnDeprecatedUnregisterServiceWorker) |
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_UnregisterServiceWorker, |
OnUnregisterServiceWorker) |
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetRegistration, |
@@ -424,7 +426,7 @@ void ServiceWorkerDispatcherHost::OnUpdateServiceWorker(int provider_id, |
true /* force_bypass_cache */); |
} |
-void ServiceWorkerDispatcherHost::OnUnregisterServiceWorker( |
+void ServiceWorkerDispatcherHost::OnDeprecatedUnregisterServiceWorker( |
int thread_id, |
int request_id, |
int provider_id, |
@@ -498,6 +500,75 @@ void ServiceWorkerDispatcherHost::OnUnregisterServiceWorker( |
request_id)); |
} |
+void ServiceWorkerDispatcherHost::OnUnregisterServiceWorker( |
+ int thread_id, |
+ int request_id, |
+ int provider_id, |
+ int64 registration_id) { |
+ TRACE_EVENT0("ServiceWorker", |
+ "ServiceWorkerDispatcherHost::OnUnregisterServiceWorker"); |
+ if (!GetContext()) { |
+ Send(new ServiceWorkerMsg_ServiceWorkerUnregistrationError( |
+ thread_id, request_id, blink::WebServiceWorkerError::ErrorTypeAbort, |
+ base::ASCIIToUTF16(kShutdownErrorMessage))); |
+ return; |
+ } |
+ |
+ ServiceWorkerProviderHost* provider_host = |
+ GetContext()->GetProviderHost(render_process_id_, provider_id); |
+ if (!provider_host) { |
+ bad_message::ReceivedBadMessage(this, bad_message::SWDH_UNREGISTER_NO_HOST); |
+ return; |
+ } |
+ if (!provider_host->IsContextAlive()) { |
+ Send(new ServiceWorkerMsg_ServiceWorkerUnregistrationError( |
+ thread_id, request_id, blink::WebServiceWorkerError::ErrorTypeAbort, |
+ base::ASCIIToUTF16(kShutdownErrorMessage))); |
+ return; |
+ } |
+ |
+ // TODO(ksakamoto): This check can be removed once crbug.com/439697 is fixed. |
+ if (provider_host->document_url().is_empty()) { |
+ Send(new ServiceWorkerMsg_ServiceWorkerUnregistrationError( |
+ thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity, |
+ base::ASCIIToUTF16(kNoDocumentURLErrorMessage))); |
+ return; |
+ } |
+ |
+ 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_UNREGISTER_BAD_REGISTRATION_ID); |
+ return; |
+ } |
+ |
+ if (!CanUnregisterServiceWorker(provider_host->document_url(), |
+ registration->pattern())) { |
+ bad_message::ReceivedBadMessage(this, bad_message::SWDH_UNREGISTER_CANNOT); |
+ return; |
+ } |
+ |
+ if (!GetContentClient()->browser()->AllowServiceWorker( |
+ registration->pattern(), provider_host->topmost_frame_url(), |
+ resource_context_, render_process_id_, provider_host->frame_id())) { |
+ Send(new ServiceWorkerMsg_ServiceWorkerUnregistrationError( |
+ thread_id, request_id, WebServiceWorkerError::ErrorTypeUnknown, |
+ base::ASCIIToUTF16(kUserDeniedPermissionMessage))); |
+ return; |
+ } |
+ |
+ TRACE_EVENT_ASYNC_BEGIN1( |
+ "ServiceWorker", "ServiceWorkerDispatcherHost::UnregisterServiceWorker", |
+ request_id, "Pattern", registration->pattern().spec()); |
+ GetContext()->UnregisterServiceWorker( |
+ registration->pattern(), |
+ base::Bind(&ServiceWorkerDispatcherHost::UnregistrationComplete, this, |
+ thread_id, request_id)); |
+} |
+ |
void ServiceWorkerDispatcherHost::OnGetRegistration( |
int thread_id, |
int request_id, |