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 1c443d33f8d9c4dc99dbff486b2f8f87197fa1c8..f1ee3e7ec5112814edb05ac63361907f595f089e 100644 |
| --- a/content/browser/service_worker/service_worker_dispatcher_host.cc |
| +++ b/content/browser/service_worker/service_worker_dispatcher_host.cc |
| @@ -41,6 +41,7 @@ const char kShutdownErrorMessage[] = |
| "The Service Worker system has shutdown."; |
| const char kUserDeniedPermissionMessage[] = |
| "The user denied permission to use Service Worker."; |
| +const char kInvalidStateErrorMessage[] = "The object is in an invalid state."; |
| const uint32 kFilteredMessageClasses[] = { |
| ServiceWorkerMsgStart, |
| @@ -364,12 +365,19 @@ void ServiceWorkerDispatcherHost::OnRegisterServiceWorker( |
| request_id)); |
| } |
| -void ServiceWorkerDispatcherHost::OnUpdateServiceWorker(int provider_id, |
| +void ServiceWorkerDispatcherHost::OnUpdateServiceWorker(int thread_id, |
| + int request_id, |
| + int provider_id, |
| int64 registration_id) { |
| TRACE_EVENT0("ServiceWorker", |
| "ServiceWorkerDispatcherHost::OnUpdateServiceWorker"); |
| - if (!GetContext()) |
| + if (!GetContext()) { |
| + Send(new ServiceWorkerMsg_ServiceWorkerUpdateError( |
| + thread_id, request_id, WebServiceWorkerError::ErrorTypeAbort, |
| + base::ASCIIToUTF16(kServiceWorkerUpdateErrorPrefix) + |
| + base::ASCIIToUTF16(kShutdownErrorMessage))); |
| return; |
| + } |
| ServiceWorkerProviderHost* provider_host = |
| GetContext()->GetProviderHost(render_process_id_, provider_id); |
| @@ -377,12 +385,22 @@ void ServiceWorkerDispatcherHost::OnUpdateServiceWorker(int provider_id, |
| bad_message::ReceivedBadMessage(this, bad_message::SWDH_UPDATE_NO_HOST); |
| return; |
| } |
| - if (!provider_host->IsContextAlive()) |
| + if (!provider_host->IsContextAlive()) { |
| + Send(new ServiceWorkerMsg_ServiceWorkerUpdateError( |
| + thread_id, request_id, WebServiceWorkerError::ErrorTypeAbort, |
| + base::ASCIIToUTF16(kServiceWorkerUpdateErrorPrefix) + |
| + base::ASCIIToUTF16(kShutdownErrorMessage))); |
| return; |
| + } |
| - // TODO(ksakamoto): This check can be removed once crbug.com/439697 is fixed. |
| - if (provider_host->document_url().is_empty()) |
| + // TODO(jungkees): This check can be removed once crbug.com/439697 is fixed. |
| + if (provider_host->document_url().is_empty()) { |
| + Send(new ServiceWorkerMsg_ServiceWorkerUpdateError( |
| + thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity, |
| + base::ASCIIToUTF16(kServiceWorkerUpdateErrorPrefix) + |
| + base::ASCIIToUTF16(kNoDocumentURLErrorMessage))); |
| return; |
| + } |
| ServiceWorkerRegistration* registration = |
| GetContext()->GetLiveRegistration(registration_id); |
| @@ -403,19 +421,29 @@ void ServiceWorkerDispatcherHost::OnUpdateServiceWorker(int provider_id, |
| if (!GetContentClient()->browser()->AllowServiceWorker( |
| registration->pattern(), provider_host->topmost_frame_url(), |
| resource_context_, render_process_id_, provider_host->frame_id())) { |
| + Send(new ServiceWorkerMsg_ServiceWorkerUpdateError( |
| + thread_id, request_id, WebServiceWorkerError::ErrorTypeUnknown, |
| + base::ASCIIToUTF16(kServiceWorkerUpdateErrorPrefix) + |
| + base::ASCIIToUTF16(kUserDeniedPermissionMessage))); |
| return; |
| } |
| if (!registration->GetNewestVersion()) { |
| // This can happen if update() is called during initial script evaluation. |
| // Abort the following steps according to the spec. |
| + Send(new ServiceWorkerMsg_ServiceWorkerUpdateError( |
| + thread_id, request_id, WebServiceWorkerError::ErrorTypeState, |
| + base::ASCIIToUTF16(kServiceWorkerUpdateErrorPrefix) + |
| + base::ASCIIToUTF16(kInvalidStateErrorMessage))); |
|
nhiroki
2015/07/31 06:49:11
We might need to change the update() algorithm in
jungkees
2015/07/31 07:09:58
I noticed that and was gonna change this. ;-) I wi
|
| return; |
| } |
| // The spec says, "update() pings the server for an updated version of this |
| // script without consulting caches", so set |force_bypass_cache| to true. |
| - GetContext()->UpdateServiceWorker(registration, |
| - true /* force_bypass_cache */); |
| + GetContext()->UpdateServiceWorker( |
| + registration, true, /* force_bypass_cache */ |
| + provider_host, base::Bind(&ServiceWorkerDispatcherHost::UpdateComplete, |
| + this, thread_id, provider_id, request_id)); |
| } |
| void ServiceWorkerDispatcherHost::OnUnregisterServiceWorker( |
| @@ -844,6 +872,41 @@ void ServiceWorkerDispatcherHost::RegistrationComplete( |
| registration_id); |
| } |
| +void ServiceWorkerDispatcherHost::UpdateComplete( |
| + int thread_id, |
| + int provider_id, |
| + int request_id, |
| + ServiceWorkerStatusCode status, |
| + const std::string& status_message, |
| + int64 registration_id) { |
| + if (!GetContext()) |
| + return; |
| + |
| + ServiceWorkerProviderHost* provider_host = |
| + GetContext()->GetProviderHost(render_process_id_, provider_id); |
| + if (!provider_host) |
| + return; // The provider has already been destroyed. |
| + |
| + if (status != SERVICE_WORKER_OK) { |
| + SendRegistrationError(thread_id, request_id, status, status_message); |
| + return; |
| + } |
| + |
| + ServiceWorkerRegistration* registration = |
| + GetContext()->GetLiveRegistration(registration_id); |
| + DCHECK(registration); |
| + |
| + ServiceWorkerRegistrationObjectInfo info; |
| + ServiceWorkerVersionAttributes attrs; |
| + GetRegistrationObjectInfoAndVersionAttributes(provider_host->AsWeakPtr(), |
| + registration, &info, &attrs); |
| + |
| + Send(new ServiceWorkerMsg_ServiceWorkerUpdated(thread_id, request_id)); |
| + TRACE_EVENT_ASYNC_END1("ServiceWorker", |
| + "ServiceWorkerDispatcherHost::UpdateServiceWorker", |
| + request_id, "Registration ID", registration_id); |
| +} |
| + |
| void ServiceWorkerDispatcherHost::OnWorkerReadyForInspection( |
| int embedded_worker_id) { |
| TRACE_EVENT0("ServiceWorker", |