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 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 OnReportConsoleMessage) | 175 OnReportConsoleMessage) |
176 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_IncrementServiceWorkerRefCount, | 176 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_IncrementServiceWorkerRefCount, |
177 OnIncrementServiceWorkerRefCount) | 177 OnIncrementServiceWorkerRefCount) |
178 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementServiceWorkerRefCount, | 178 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementServiceWorkerRefCount, |
179 OnDecrementServiceWorkerRefCount) | 179 OnDecrementServiceWorkerRefCount) |
180 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_IncrementRegistrationRefCount, | 180 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_IncrementRegistrationRefCount, |
181 OnIncrementRegistrationRefCount) | 181 OnIncrementRegistrationRefCount) |
182 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementRegistrationRefCount, | 182 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementRegistrationRefCount, |
183 OnDecrementRegistrationRefCount) | 183 OnDecrementRegistrationRefCount) |
184 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_TerminateWorker, OnTerminateWorker) | 184 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_TerminateWorker, OnTerminateWorker) |
| 185 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_EnableNavigationPreload, |
| 186 OnEnableNavigationPreload) |
185 IPC_MESSAGE_UNHANDLED(handled = false) | 187 IPC_MESSAGE_UNHANDLED(handled = false) |
186 IPC_END_MESSAGE_MAP() | 188 IPC_END_MESSAGE_MAP() |
187 | 189 |
188 if (!handled && GetContext()) { | 190 if (!handled && GetContext()) { |
189 handled = GetContext()->embedded_worker_registry()->OnMessageReceived( | 191 handled = GetContext()->embedded_worker_registry()->OnMessageReceived( |
190 message, render_process_id_); | 192 message, render_process_id_); |
191 if (!handled) | 193 if (!handled) |
192 bad_message::ReceivedBadMessage(this, bad_message::SWDH_NOT_HANDLED); | 194 bad_message::ReceivedBadMessage(this, bad_message::SWDH_NOT_HANDLED); |
193 } | 195 } |
194 | 196 |
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
647 "ServiceWorker", "ServiceWorkerDispatcherHost::GetRegistrationForReady", | 649 "ServiceWorker", "ServiceWorkerDispatcherHost::GetRegistrationForReady", |
648 request_id); | 650 request_id); |
649 if (!provider_host->GetRegistrationForReady(base::Bind( | 651 if (!provider_host->GetRegistrationForReady(base::Bind( |
650 &ServiceWorkerDispatcherHost::GetRegistrationForReadyComplete, | 652 &ServiceWorkerDispatcherHost::GetRegistrationForReadyComplete, |
651 this, thread_id, request_id, provider_host->AsWeakPtr()))) { | 653 this, thread_id, request_id, provider_host->AsWeakPtr()))) { |
652 bad_message::ReceivedBadMessage( | 654 bad_message::ReceivedBadMessage( |
653 this, bad_message::SWDH_GET_REGISTRATION_FOR_READY_ALREADY_IN_PROGRESS); | 655 this, bad_message::SWDH_GET_REGISTRATION_FOR_READY_ALREADY_IN_PROGRESS); |
654 } | 656 } |
655 } | 657 } |
656 | 658 |
| 659 void ServiceWorkerDispatcherHost::OnEnableNavigationPreload( |
| 660 int thread_id, |
| 661 int request_id, |
| 662 int provider_id, |
| 663 int64_t registration_id, |
| 664 bool enable) { |
| 665 ProviderStatus provider_status; |
| 666 ServiceWorkerProviderHost* provider_host = |
| 667 GetProviderHostForRequest(&provider_status, provider_id); |
| 668 switch (provider_status) { |
| 669 case ProviderStatus::NO_CONTEXT: // fallthrough |
| 670 case ProviderStatus::DEAD_HOST: |
| 671 Send(new ServiceWorkerMsg_EnableNavigationPreloadError( |
| 672 thread_id, request_id, WebServiceWorkerError::ErrorTypeAbort, |
| 673 base::ASCIIToUTF16(kShutdownErrorMessage))); |
| 674 return; |
| 675 case ProviderStatus::NO_HOST: |
| 676 bad_message::ReceivedBadMessage( |
| 677 this, bad_message::SWDH_ENABLE_NAVIGATION_PRELOAD_NO_HOST); |
| 678 return; |
| 679 case ProviderStatus::NO_URL: |
| 680 Send(new ServiceWorkerMsg_EnableNavigationPreloadError( |
| 681 thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity, |
| 682 base::ASCIIToUTF16(kNoDocumentURLErrorMessage))); |
| 683 return; |
| 684 case ProviderStatus::OK: |
| 685 break; |
| 686 } |
| 687 |
| 688 ServiceWorkerRegistration* registration = |
| 689 GetContext()->GetLiveRegistration(registration_id); |
| 690 if (!registration) { |
| 691 // |registration| must be alive because a renderer retains a registration |
| 692 // reference at this point. |
| 693 bad_message::ReceivedBadMessage( |
| 694 this, bad_message::SWDH_ENABLE_NAVIGATION_PRELOAD_BAD_REGISTRATION_ID); |
| 695 return; |
| 696 } |
| 697 |
| 698 std::vector<GURL> urls = {provider_host->document_url(), |
| 699 registration->pattern()}; |
| 700 if (!ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers(urls)) { |
| 701 bad_message::ReceivedBadMessage( |
| 702 this, bad_message::SWDH_ENABLE_NAVIGATION_PRELOAD_INVALID_ORIGIN); |
| 703 return; |
| 704 } |
| 705 |
| 706 if (!GetContentClient()->browser()->AllowServiceWorker( |
| 707 registration->pattern(), provider_host->topmost_frame_url(), |
| 708 resource_context_, render_process_id_, provider_host->frame_id())) { |
| 709 Send(new ServiceWorkerMsg_EnableNavigationPreloadError( |
| 710 thread_id, request_id, WebServiceWorkerError::ErrorTypeDisabled, |
| 711 base::ASCIIToUTF16(kUserDeniedPermissionMessage))); |
| 712 return; |
| 713 } |
| 714 |
| 715 // TODO(falken): Write to disk before resolving the promise. |
| 716 registration->EnableNavigationPreload(enable); |
| 717 Send(new ServiceWorkerMsg_DidEnableNavigationPreload(thread_id, request_id)); |
| 718 } |
| 719 |
657 void ServiceWorkerDispatcherHost::OnPostMessageToWorker( | 720 void ServiceWorkerDispatcherHost::OnPostMessageToWorker( |
658 int handle_id, | 721 int handle_id, |
659 int provider_id, | 722 int provider_id, |
660 const base::string16& message, | 723 const base::string16& message, |
661 const url::Origin& source_origin, | 724 const url::Origin& source_origin, |
662 const std::vector<int>& sent_message_ports) { | 725 const std::vector<int>& sent_message_ports) { |
663 TRACE_EVENT0("ServiceWorker", | 726 TRACE_EVENT0("ServiceWorker", |
664 "ServiceWorkerDispatcherHost::OnPostMessageToWorker"); | 727 "ServiceWorkerDispatcherHost::OnPostMessageToWorker"); |
665 if (!GetContext()) | 728 if (!GetContext()) |
666 return; | 729 return; |
(...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1440 if (!handle) { | 1503 if (!handle) { |
1441 bad_message::ReceivedBadMessage(this, | 1504 bad_message::ReceivedBadMessage(this, |
1442 bad_message::SWDH_TERMINATE_BAD_HANDLE); | 1505 bad_message::SWDH_TERMINATE_BAD_HANDLE); |
1443 return; | 1506 return; |
1444 } | 1507 } |
1445 handle->version()->StopWorker( | 1508 handle->version()->StopWorker( |
1446 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 1509 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
1447 } | 1510 } |
1448 | 1511 |
1449 } // namespace content | 1512 } // namespace content |
OLD | NEW |