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 <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/debug/crash_logging.h" | 9 #include "base/debug/crash_logging.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 | 44 |
45 namespace { | 45 namespace { |
46 | 46 |
47 const char kNoDocumentURLErrorMessage[] = | 47 const char kNoDocumentURLErrorMessage[] = |
48 "No URL is associated with the caller's document."; | 48 "No URL is associated with the caller's document."; |
49 const char kShutdownErrorMessage[] = | 49 const char kShutdownErrorMessage[] = |
50 "The Service Worker system has shutdown."; | 50 "The Service Worker system has shutdown."; |
51 const char kUserDeniedPermissionMessage[] = | 51 const char kUserDeniedPermissionMessage[] = |
52 "The user denied permission to use Service Worker."; | 52 "The user denied permission to use Service Worker."; |
53 const char kInvalidStateErrorMessage[] = "The object is in an invalid state."; | 53 const char kInvalidStateErrorMessage[] = "The object is in an invalid state."; |
| 54 const char kEnableNavigationPreloadErrorPrefix[] = |
| 55 "Failed to enable or disable navigation preload: "; |
54 | 56 |
55 const uint32_t kFilteredMessageClasses[] = { | 57 const uint32_t kFilteredMessageClasses[] = { |
56 ServiceWorkerMsgStart, EmbeddedWorkerMsgStart, | 58 ServiceWorkerMsgStart, EmbeddedWorkerMsgStart, |
57 }; | 59 }; |
58 | 60 |
59 void RunSoon(const base::Closure& callback) { | 61 void RunSoon(const base::Closure& callback) { |
60 if (!callback.is_null()) | 62 if (!callback.is_null()) |
61 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 63 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); |
62 } | 64 } |
63 | 65 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 OnReportConsoleMessage) | 179 OnReportConsoleMessage) |
178 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_IncrementServiceWorkerRefCount, | 180 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_IncrementServiceWorkerRefCount, |
179 OnIncrementServiceWorkerRefCount) | 181 OnIncrementServiceWorkerRefCount) |
180 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementServiceWorkerRefCount, | 182 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementServiceWorkerRefCount, |
181 OnDecrementServiceWorkerRefCount) | 183 OnDecrementServiceWorkerRefCount) |
182 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_IncrementRegistrationRefCount, | 184 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_IncrementRegistrationRefCount, |
183 OnIncrementRegistrationRefCount) | 185 OnIncrementRegistrationRefCount) |
184 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementRegistrationRefCount, | 186 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementRegistrationRefCount, |
185 OnDecrementRegistrationRefCount) | 187 OnDecrementRegistrationRefCount) |
186 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_TerminateWorker, OnTerminateWorker) | 188 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_TerminateWorker, OnTerminateWorker) |
| 189 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_EnableNavigationPreload, |
| 190 OnEnableNavigationPreload) |
187 IPC_MESSAGE_UNHANDLED(handled = false) | 191 IPC_MESSAGE_UNHANDLED(handled = false) |
188 IPC_END_MESSAGE_MAP() | 192 IPC_END_MESSAGE_MAP() |
189 | 193 |
190 if (!handled && GetContext()) { | 194 if (!handled && GetContext()) { |
191 handled = GetContext()->embedded_worker_registry()->OnMessageReceived( | 195 handled = GetContext()->embedded_worker_registry()->OnMessageReceived( |
192 message, render_process_id_); | 196 message, render_process_id_); |
193 if (!handled) | 197 if (!handled) |
194 bad_message::ReceivedBadMessage(this, bad_message::SWDH_NOT_HANDLED); | 198 bad_message::ReceivedBadMessage(this, bad_message::SWDH_NOT_HANDLED); |
195 } | 199 } |
196 | 200 |
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
649 "ServiceWorker", "ServiceWorkerDispatcherHost::GetRegistrationForReady", | 653 "ServiceWorker", "ServiceWorkerDispatcherHost::GetRegistrationForReady", |
650 request_id); | 654 request_id); |
651 if (!provider_host->GetRegistrationForReady(base::Bind( | 655 if (!provider_host->GetRegistrationForReady(base::Bind( |
652 &ServiceWorkerDispatcherHost::GetRegistrationForReadyComplete, | 656 &ServiceWorkerDispatcherHost::GetRegistrationForReadyComplete, |
653 this, thread_id, request_id, provider_host->AsWeakPtr()))) { | 657 this, thread_id, request_id, provider_host->AsWeakPtr()))) { |
654 bad_message::ReceivedBadMessage( | 658 bad_message::ReceivedBadMessage( |
655 this, bad_message::SWDH_GET_REGISTRATION_FOR_READY_ALREADY_IN_PROGRESS); | 659 this, bad_message::SWDH_GET_REGISTRATION_FOR_READY_ALREADY_IN_PROGRESS); |
656 } | 660 } |
657 } | 661 } |
658 | 662 |
| 663 void ServiceWorkerDispatcherHost::OnEnableNavigationPreload( |
| 664 int thread_id, |
| 665 int request_id, |
| 666 int provider_id, |
| 667 int64_t registration_id, |
| 668 bool enable) { |
| 669 ProviderStatus provider_status; |
| 670 ServiceWorkerProviderHost* provider_host = |
| 671 GetProviderHostForRequest(&provider_status, provider_id); |
| 672 switch (provider_status) { |
| 673 case ProviderStatus::NO_CONTEXT: // fallthrough |
| 674 case ProviderStatus::DEAD_HOST: |
| 675 Send(new ServiceWorkerMsg_EnableNavigationPreloadError( |
| 676 thread_id, request_id, WebServiceWorkerError::ErrorTypeAbort, |
| 677 std::string(kEnableNavigationPreloadErrorPrefix) + |
| 678 std::string(kShutdownErrorMessage))); |
| 679 return; |
| 680 case ProviderStatus::NO_HOST: |
| 681 bad_message::ReceivedBadMessage( |
| 682 this, bad_message::SWDH_ENABLE_NAVIGATION_PRELOAD_NO_HOST); |
| 683 return; |
| 684 case ProviderStatus::NO_URL: |
| 685 Send(new ServiceWorkerMsg_EnableNavigationPreloadError( |
| 686 thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity, |
| 687 std::string(kEnableNavigationPreloadErrorPrefix) + |
| 688 std::string(kNoDocumentURLErrorMessage))); |
| 689 return; |
| 690 case ProviderStatus::OK: |
| 691 break; |
| 692 } |
| 693 |
| 694 ServiceWorkerRegistration* registration = |
| 695 GetContext()->GetLiveRegistration(registration_id); |
| 696 if (!registration) { |
| 697 // |registration| must be alive because a renderer retains a registration |
| 698 // reference at this point. |
| 699 bad_message::ReceivedBadMessage( |
| 700 this, bad_message::SWDH_ENABLE_NAVIGATION_PRELOAD_BAD_REGISTRATION_ID); |
| 701 return; |
| 702 } |
| 703 |
| 704 std::vector<GURL> urls = {provider_host->document_url(), |
| 705 registration->pattern()}; |
| 706 if (!ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers(urls)) { |
| 707 bad_message::ReceivedBadMessage( |
| 708 this, bad_message::SWDH_ENABLE_NAVIGATION_PRELOAD_INVALID_ORIGIN); |
| 709 return; |
| 710 } |
| 711 |
| 712 if (!GetContentClient()->browser()->AllowServiceWorker( |
| 713 registration->pattern(), provider_host->topmost_frame_url(), |
| 714 resource_context_, render_process_id_, provider_host->frame_id())) { |
| 715 Send(new ServiceWorkerMsg_EnableNavigationPreloadError( |
| 716 thread_id, request_id, WebServiceWorkerError::ErrorTypeDisabled, |
| 717 std::string(kEnableNavigationPreloadErrorPrefix) + |
| 718 std::string(kUserDeniedPermissionMessage))); |
| 719 return; |
| 720 } |
| 721 |
| 722 // TODO(falken): Write to disk before resolving the promise. |
| 723 registration->EnableNavigationPreload(enable); |
| 724 Send(new ServiceWorkerMsg_DidEnableNavigationPreload(thread_id, request_id)); |
| 725 } |
| 726 |
659 void ServiceWorkerDispatcherHost::OnPostMessageToWorker( | 727 void ServiceWorkerDispatcherHost::OnPostMessageToWorker( |
660 int handle_id, | 728 int handle_id, |
661 int provider_id, | 729 int provider_id, |
662 const base::string16& message, | 730 const base::string16& message, |
663 const url::Origin& source_origin, | 731 const url::Origin& source_origin, |
664 const std::vector<int>& sent_message_ports) { | 732 const std::vector<int>& sent_message_ports) { |
665 TRACE_EVENT0("ServiceWorker", | 733 TRACE_EVENT0("ServiceWorker", |
666 "ServiceWorkerDispatcherHost::OnPostMessageToWorker"); | 734 "ServiceWorkerDispatcherHost::OnPostMessageToWorker"); |
667 if (!GetContext()) | 735 if (!GetContext()) |
668 return; | 736 return; |
(...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1442 if (!handle) { | 1510 if (!handle) { |
1443 bad_message::ReceivedBadMessage(this, | 1511 bad_message::ReceivedBadMessage(this, |
1444 bad_message::SWDH_TERMINATE_BAD_HANDLE); | 1512 bad_message::SWDH_TERMINATE_BAD_HANDLE); |
1445 return; | 1513 return; |
1446 } | 1514 } |
1447 handle->version()->StopWorker( | 1515 handle->version()->StopWorker( |
1448 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 1516 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
1449 } | 1517 } |
1450 | 1518 |
1451 } // namespace content | 1519 } // namespace content |
OLD | NEW |