OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/service_worker/service_worker_dispatcher_host.h" | 5 #include "content/browser/service_worker/service_worker_dispatcher_host.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/profiler/scoped_tracker.h" | 8 #include "base/profiler/scoped_tracker.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
(...skipping 23 matching lines...) Expand all Loading... |
34 namespace content { | 34 namespace content { |
35 | 35 |
36 namespace { | 36 namespace { |
37 | 37 |
38 const char kNoDocumentURLErrorMessage[] = | 38 const char kNoDocumentURLErrorMessage[] = |
39 "No URL is associated with the caller's document."; | 39 "No URL is associated with the caller's document."; |
40 const char kShutdownErrorMessage[] = | 40 const char kShutdownErrorMessage[] = |
41 "The Service Worker system has shutdown."; | 41 "The Service Worker system has shutdown."; |
42 const char kUserDeniedPermissionMessage[] = | 42 const char kUserDeniedPermissionMessage[] = |
43 "The user denied permission to use Service Worker."; | 43 "The user denied permission to use Service Worker."; |
| 44 const char kInvalidStateErrorMessage[] = "The object is in an invalid state."; |
44 | 45 |
45 const uint32 kFilteredMessageClasses[] = { | 46 const uint32 kFilteredMessageClasses[] = { |
46 ServiceWorkerMsgStart, | 47 ServiceWorkerMsgStart, |
47 EmbeddedWorkerMsgStart, | 48 EmbeddedWorkerMsgStart, |
48 }; | 49 }; |
49 | 50 |
50 bool AllOriginsMatch(const GURL& url_a, const GURL& url_b, const GURL& url_c) { | 51 bool AllOriginsMatch(const GURL& url_a, const GURL& url_b, const GURL& url_c) { |
51 return url_a.GetOrigin() == url_b.GetOrigin() && | 52 return url_a.GetOrigin() == url_b.GetOrigin() && |
52 url_a.GetOrigin() == url_c.GetOrigin(); | 53 url_a.GetOrigin() == url_c.GetOrigin(); |
53 } | 54 } |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 pattern, | 358 pattern, |
358 script_url, | 359 script_url, |
359 provider_host, | 360 provider_host, |
360 base::Bind(&ServiceWorkerDispatcherHost::RegistrationComplete, | 361 base::Bind(&ServiceWorkerDispatcherHost::RegistrationComplete, |
361 this, | 362 this, |
362 thread_id, | 363 thread_id, |
363 provider_id, | 364 provider_id, |
364 request_id)); | 365 request_id)); |
365 } | 366 } |
366 | 367 |
367 void ServiceWorkerDispatcherHost::OnUpdateServiceWorker(int provider_id, | 368 void ServiceWorkerDispatcherHost::OnUpdateServiceWorker(int thread_id, |
| 369 int request_id, |
| 370 int provider_id, |
368 int64 registration_id) { | 371 int64 registration_id) { |
369 TRACE_EVENT0("ServiceWorker", | 372 TRACE_EVENT0("ServiceWorker", |
370 "ServiceWorkerDispatcherHost::OnUpdateServiceWorker"); | 373 "ServiceWorkerDispatcherHost::OnUpdateServiceWorker"); |
371 if (!GetContext()) | 374 if (!GetContext()) { |
| 375 Send(new ServiceWorkerMsg_ServiceWorkerUpdateError( |
| 376 thread_id, request_id, WebServiceWorkerError::ErrorTypeAbort, |
| 377 base::ASCIIToUTF16(kServiceWorkerUpdateErrorPrefix) + |
| 378 base::ASCIIToUTF16(kShutdownErrorMessage))); |
372 return; | 379 return; |
| 380 } |
373 | 381 |
374 ServiceWorkerProviderHost* provider_host = | 382 ServiceWorkerProviderHost* provider_host = |
375 GetContext()->GetProviderHost(render_process_id_, provider_id); | 383 GetContext()->GetProviderHost(render_process_id_, provider_id); |
376 if (!provider_host) { | 384 if (!provider_host) { |
377 bad_message::ReceivedBadMessage(this, bad_message::SWDH_UPDATE_NO_HOST); | 385 bad_message::ReceivedBadMessage(this, bad_message::SWDH_UPDATE_NO_HOST); |
378 return; | 386 return; |
379 } | 387 } |
380 if (!provider_host->IsContextAlive()) | 388 if (!provider_host->IsContextAlive()) { |
| 389 Send(new ServiceWorkerMsg_ServiceWorkerUpdateError( |
| 390 thread_id, request_id, WebServiceWorkerError::ErrorTypeAbort, |
| 391 base::ASCIIToUTF16(kServiceWorkerUpdateErrorPrefix) + |
| 392 base::ASCIIToUTF16(kShutdownErrorMessage))); |
381 return; | 393 return; |
| 394 } |
382 | 395 |
383 // TODO(ksakamoto): This check can be removed once crbug.com/439697 is fixed. | 396 // TODO(jungkees): This check can be removed once crbug.com/439697 is fixed. |
384 if (provider_host->document_url().is_empty()) | 397 if (provider_host->document_url().is_empty()) { |
| 398 Send(new ServiceWorkerMsg_ServiceWorkerUpdateError( |
| 399 thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity, |
| 400 base::ASCIIToUTF16(kServiceWorkerUpdateErrorPrefix) + |
| 401 base::ASCIIToUTF16(kNoDocumentURLErrorMessage))); |
385 return; | 402 return; |
| 403 } |
386 | 404 |
387 ServiceWorkerRegistration* registration = | 405 ServiceWorkerRegistration* registration = |
388 GetContext()->GetLiveRegistration(registration_id); | 406 GetContext()->GetLiveRegistration(registration_id); |
389 if (!registration) { | 407 if (!registration) { |
390 // |registration| must be alive because a renderer retains a registration | 408 // |registration| must be alive because a renderer retains a registration |
391 // reference at this point. | 409 // reference at this point. |
392 bad_message::ReceivedBadMessage( | 410 bad_message::ReceivedBadMessage( |
393 this, bad_message::SWDH_UPDATE_BAD_REGISTRATION_ID); | 411 this, bad_message::SWDH_UPDATE_BAD_REGISTRATION_ID); |
394 return; | 412 return; |
395 } | 413 } |
396 | 414 |
397 if (!CanUpdateServiceWorker(provider_host->document_url(), | 415 if (!CanUpdateServiceWorker(provider_host->document_url(), |
398 registration->pattern())) { | 416 registration->pattern())) { |
399 bad_message::ReceivedBadMessage(this, bad_message::SWDH_UPDATE_CANNOT); | 417 bad_message::ReceivedBadMessage(this, bad_message::SWDH_UPDATE_CANNOT); |
400 return; | 418 return; |
401 } | 419 } |
402 | 420 |
403 if (!GetContentClient()->browser()->AllowServiceWorker( | 421 if (!GetContentClient()->browser()->AllowServiceWorker( |
404 registration->pattern(), provider_host->topmost_frame_url(), | 422 registration->pattern(), provider_host->topmost_frame_url(), |
405 resource_context_, render_process_id_, provider_host->frame_id())) { | 423 resource_context_, render_process_id_, provider_host->frame_id())) { |
| 424 Send(new ServiceWorkerMsg_ServiceWorkerUpdateError( |
| 425 thread_id, request_id, WebServiceWorkerError::ErrorTypeUnknown, |
| 426 base::ASCIIToUTF16(kServiceWorkerUpdateErrorPrefix) + |
| 427 base::ASCIIToUTF16(kUserDeniedPermissionMessage))); |
406 return; | 428 return; |
407 } | 429 } |
408 | 430 |
409 if (!registration->GetNewestVersion()) { | 431 if (!registration->GetNewestVersion()) { |
410 // This can happen if update() is called during initial script evaluation. | 432 // This can happen if update() is called during initial script evaluation. |
411 // Abort the following steps according to the spec. | 433 // Abort the following steps according to the spec. |
| 434 Send(new ServiceWorkerMsg_ServiceWorkerUpdateError( |
| 435 thread_id, request_id, WebServiceWorkerError::ErrorTypeState, |
| 436 base::ASCIIToUTF16(kServiceWorkerUpdateErrorPrefix) + |
| 437 base::ASCIIToUTF16(kInvalidStateErrorMessage))); |
412 return; | 438 return; |
413 } | 439 } |
414 | 440 |
415 // The spec says, "update() pings the server for an updated version of this | 441 // The spec says, "update() pings the server for an updated version of this |
416 // script without consulting caches", so set |force_bypass_cache| to true. | 442 // script without consulting caches", so set |force_bypass_cache| to true. |
417 GetContext()->UpdateServiceWorker(registration, | 443 GetContext()->UpdateServiceWorker( |
418 true /* force_bypass_cache */); | 444 registration, true, /* force_bypass_cache */ |
| 445 provider_host, base::Bind(&ServiceWorkerDispatcherHost::UpdateComplete, |
| 446 this, thread_id, provider_id, request_id)); |
419 } | 447 } |
420 | 448 |
421 void ServiceWorkerDispatcherHost::OnUnregisterServiceWorker( | 449 void ServiceWorkerDispatcherHost::OnUnregisterServiceWorker( |
422 int thread_id, | 450 int thread_id, |
423 int request_id, | 451 int request_id, |
424 int provider_id, | 452 int provider_id, |
425 int64 registration_id) { | 453 int64 registration_id) { |
426 TRACE_EVENT0("ServiceWorker", | 454 TRACE_EVENT0("ServiceWorker", |
427 "ServiceWorkerDispatcherHost::OnUnregisterServiceWorker"); | 455 "ServiceWorkerDispatcherHost::OnUnregisterServiceWorker"); |
428 if (!GetContext()) { | 456 if (!GetContext()) { |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
837 | 865 |
838 Send(new ServiceWorkerMsg_ServiceWorkerRegistered( | 866 Send(new ServiceWorkerMsg_ServiceWorkerRegistered( |
839 thread_id, request_id, info, attrs)); | 867 thread_id, request_id, info, attrs)); |
840 TRACE_EVENT_ASYNC_END1("ServiceWorker", | 868 TRACE_EVENT_ASYNC_END1("ServiceWorker", |
841 "ServiceWorkerDispatcherHost::RegisterServiceWorker", | 869 "ServiceWorkerDispatcherHost::RegisterServiceWorker", |
842 request_id, | 870 request_id, |
843 "Registration ID", | 871 "Registration ID", |
844 registration_id); | 872 registration_id); |
845 } | 873 } |
846 | 874 |
| 875 void ServiceWorkerDispatcherHost::UpdateComplete( |
| 876 int thread_id, |
| 877 int provider_id, |
| 878 int request_id, |
| 879 ServiceWorkerStatusCode status, |
| 880 const std::string& status_message, |
| 881 int64 registration_id) { |
| 882 if (!GetContext()) |
| 883 return; |
| 884 |
| 885 ServiceWorkerProviderHost* provider_host = |
| 886 GetContext()->GetProviderHost(render_process_id_, provider_id); |
| 887 if (!provider_host) |
| 888 return; // The provider has already been destroyed. |
| 889 |
| 890 if (status != SERVICE_WORKER_OK) { |
| 891 SendRegistrationError(thread_id, request_id, status, status_message); |
| 892 return; |
| 893 } |
| 894 |
| 895 ServiceWorkerRegistration* registration = |
| 896 GetContext()->GetLiveRegistration(registration_id); |
| 897 DCHECK(registration); |
| 898 |
| 899 ServiceWorkerRegistrationObjectInfo info; |
| 900 ServiceWorkerVersionAttributes attrs; |
| 901 GetRegistrationObjectInfoAndVersionAttributes(provider_host->AsWeakPtr(), |
| 902 registration, &info, &attrs); |
| 903 |
| 904 Send(new ServiceWorkerMsg_ServiceWorkerUpdated(thread_id, request_id)); |
| 905 TRACE_EVENT_ASYNC_END1("ServiceWorker", |
| 906 "ServiceWorkerDispatcherHost::UpdateServiceWorker", |
| 907 request_id, "Registration ID", registration_id); |
| 908 } |
| 909 |
847 void ServiceWorkerDispatcherHost::OnWorkerReadyForInspection( | 910 void ServiceWorkerDispatcherHost::OnWorkerReadyForInspection( |
848 int embedded_worker_id) { | 911 int embedded_worker_id) { |
849 TRACE_EVENT0("ServiceWorker", | 912 TRACE_EVENT0("ServiceWorker", |
850 "ServiceWorkerDispatcherHost::OnWorkerReadyForInspection"); | 913 "ServiceWorkerDispatcherHost::OnWorkerReadyForInspection"); |
851 if (!GetContext()) | 914 if (!GetContext()) |
852 return; | 915 return; |
853 EmbeddedWorkerRegistry* registry = GetContext()->embedded_worker_registry(); | 916 EmbeddedWorkerRegistry* registry = GetContext()->embedded_worker_registry(); |
854 if (!registry->CanHandle(embedded_worker_id)) | 917 if (!registry->CanHandle(embedded_worker_id)) |
855 return; | 918 return; |
856 registry->OnWorkerReadyForInspection(render_process_id_, embedded_worker_id); | 919 registry->OnWorkerReadyForInspection(render_process_id_, embedded_worker_id); |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1212 if (!handle) { | 1275 if (!handle) { |
1213 bad_message::ReceivedBadMessage(this, | 1276 bad_message::ReceivedBadMessage(this, |
1214 bad_message::SWDH_TERMINATE_BAD_HANDLE); | 1277 bad_message::SWDH_TERMINATE_BAD_HANDLE); |
1215 return; | 1278 return; |
1216 } | 1279 } |
1217 handle->version()->StopWorker( | 1280 handle->version()->StopWorker( |
1218 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 1281 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
1219 } | 1282 } |
1220 | 1283 |
1221 } // namespace content | 1284 } // namespace content |
OLD | NEW |