| 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 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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[] = | 54 const char kEnableNavigationPreloadErrorPrefix[] = |
| 55 "Failed to enable or disable navigation preload: "; | 55 "Failed to enable or disable navigation preload: "; |
| 56 const char kGetNavigationPreloadStateErrorPrefix[] = |
| 57 "Failed to get navigation preload state: "; |
| 56 | 58 |
| 57 const uint32_t kFilteredMessageClasses[] = { | 59 const uint32_t kFilteredMessageClasses[] = { |
| 58 ServiceWorkerMsgStart, EmbeddedWorkerMsgStart, | 60 ServiceWorkerMsgStart, EmbeddedWorkerMsgStart, |
| 59 }; | 61 }; |
| 60 | 62 |
| 61 void RunSoon(const base::Closure& callback) { | 63 void RunSoon(const base::Closure& callback) { |
| 62 if (!callback.is_null()) | 64 if (!callback.is_null()) |
| 63 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 65 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); |
| 64 } | 66 } |
| 65 | 67 |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 OnIncrementServiceWorkerRefCount) | 183 OnIncrementServiceWorkerRefCount) |
| 182 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementServiceWorkerRefCount, | 184 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementServiceWorkerRefCount, |
| 183 OnDecrementServiceWorkerRefCount) | 185 OnDecrementServiceWorkerRefCount) |
| 184 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_IncrementRegistrationRefCount, | 186 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_IncrementRegistrationRefCount, |
| 185 OnIncrementRegistrationRefCount) | 187 OnIncrementRegistrationRefCount) |
| 186 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementRegistrationRefCount, | 188 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementRegistrationRefCount, |
| 187 OnDecrementRegistrationRefCount) | 189 OnDecrementRegistrationRefCount) |
| 188 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_TerminateWorker, OnTerminateWorker) | 190 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_TerminateWorker, OnTerminateWorker) |
| 189 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_EnableNavigationPreload, | 191 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_EnableNavigationPreload, |
| 190 OnEnableNavigationPreload) | 192 OnEnableNavigationPreload) |
| 193 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetNavigationPreloadState, |
| 194 OnGetNavigationPreloadState) |
| 191 IPC_MESSAGE_UNHANDLED(handled = false) | 195 IPC_MESSAGE_UNHANDLED(handled = false) |
| 192 IPC_END_MESSAGE_MAP() | 196 IPC_END_MESSAGE_MAP() |
| 193 | 197 |
| 194 if (!handled && GetContext()) { | 198 if (!handled && GetContext()) { |
| 195 handled = GetContext()->embedded_worker_registry()->OnMessageReceived( | 199 handled = GetContext()->embedded_worker_registry()->OnMessageReceived( |
| 196 message, render_process_id_); | 200 message, render_process_id_); |
| 197 if (!handled) | 201 if (!handled) |
| 198 bad_message::ReceivedBadMessage(this, bad_message::SWDH_NOT_HANDLED); | 202 bad_message::ReceivedBadMessage(this, bad_message::SWDH_NOT_HANDLED); |
| 199 } | 203 } |
| 200 | 204 |
| (...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 717 std::string(kEnableNavigationPreloadErrorPrefix) + | 721 std::string(kEnableNavigationPreloadErrorPrefix) + |
| 718 std::string(kUserDeniedPermissionMessage))); | 722 std::string(kUserDeniedPermissionMessage))); |
| 719 return; | 723 return; |
| 720 } | 724 } |
| 721 | 725 |
| 722 // TODO(falken): Write to disk before resolving the promise. | 726 // TODO(falken): Write to disk before resolving the promise. |
| 723 registration->EnableNavigationPreload(enable); | 727 registration->EnableNavigationPreload(enable); |
| 724 Send(new ServiceWorkerMsg_DidEnableNavigationPreload(thread_id, request_id)); | 728 Send(new ServiceWorkerMsg_DidEnableNavigationPreload(thread_id, request_id)); |
| 725 } | 729 } |
| 726 | 730 |
| 731 void ServiceWorkerDispatcherHost::OnGetNavigationPreloadState( |
| 732 int thread_id, |
| 733 int request_id, |
| 734 int provider_id, |
| 735 int64_t registration_id) { |
| 736 ProviderStatus provider_status; |
| 737 ServiceWorkerProviderHost* provider_host = |
| 738 GetProviderHostForRequest(&provider_status, provider_id); |
| 739 switch (provider_status) { |
| 740 case ProviderStatus::NO_CONTEXT: // fallthrough |
| 741 case ProviderStatus::DEAD_HOST: |
| 742 Send(new ServiceWorkerMsg_GetNavigationPreloadStateError( |
| 743 thread_id, request_id, WebServiceWorkerError::ErrorTypeAbort, |
| 744 std::string(kGetNavigationPreloadStateErrorPrefix) + |
| 745 std::string(kShutdownErrorMessage))); |
| 746 return; |
| 747 case ProviderStatus::NO_HOST: |
| 748 bad_message::ReceivedBadMessage( |
| 749 this, bad_message::SWDH_GET_NAVIGATION_PRELOAD_STATE_NO_HOST); |
| 750 return; |
| 751 case ProviderStatus::NO_URL: |
| 752 Send(new ServiceWorkerMsg_GetNavigationPreloadStateError( |
| 753 thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity, |
| 754 std::string(kGetNavigationPreloadStateErrorPrefix) + |
| 755 std::string(kNoDocumentURLErrorMessage))); |
| 756 return; |
| 757 case ProviderStatus::OK: |
| 758 break; |
| 759 } |
| 760 |
| 761 ServiceWorkerRegistration* registration = |
| 762 GetContext()->GetLiveRegistration(registration_id); |
| 763 if (!registration) { |
| 764 // |registration| must be alive because a renderer retains a registration |
| 765 // reference at this point. |
| 766 bad_message::ReceivedBadMessage( |
| 767 this, bad_message::SWDH_ENABLE_NAVIGATION_PRELOAD_BAD_REGISTRATION_ID); |
| 768 return; |
| 769 } |
| 770 |
| 771 std::vector<GURL> urls = {provider_host->document_url(), |
| 772 registration->pattern()}; |
| 773 if (!ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers(urls)) { |
| 774 bad_message::ReceivedBadMessage( |
| 775 this, bad_message::SWDH_GET_NAVIGATION_PRELOAD_STATE_INVALID_ORIGIN); |
| 776 return; |
| 777 } |
| 778 |
| 779 if (!GetContentClient()->browser()->AllowServiceWorker( |
| 780 registration->pattern(), provider_host->topmost_frame_url(), |
| 781 resource_context_, render_process_id_, provider_host->frame_id())) { |
| 782 Send(new ServiceWorkerMsg_GetNavigationPreloadStateError( |
| 783 thread_id, request_id, WebServiceWorkerError::ErrorTypeDisabled, |
| 784 std::string(kGetNavigationPreloadStateErrorPrefix) + |
| 785 std::string(kUserDeniedPermissionMessage))); |
| 786 return; |
| 787 } |
| 788 |
| 789 Send(new ServiceWorkerMsg_DidGetNavigationPreloadState( |
| 790 thread_id, request_id, registration->is_navigation_preload_enabled())); |
| 791 } |
| 792 |
| 727 void ServiceWorkerDispatcherHost::OnPostMessageToWorker( | 793 void ServiceWorkerDispatcherHost::OnPostMessageToWorker( |
| 728 int handle_id, | 794 int handle_id, |
| 729 int provider_id, | 795 int provider_id, |
| 730 const base::string16& message, | 796 const base::string16& message, |
| 731 const url::Origin& source_origin, | 797 const url::Origin& source_origin, |
| 732 const std::vector<int>& sent_message_ports) { | 798 const std::vector<int>& sent_message_ports) { |
| 733 TRACE_EVENT0("ServiceWorker", | 799 TRACE_EVENT0("ServiceWorker", |
| 734 "ServiceWorkerDispatcherHost::OnPostMessageToWorker"); | 800 "ServiceWorkerDispatcherHost::OnPostMessageToWorker"); |
| 735 if (!GetContext()) | 801 if (!GetContext()) |
| 736 return; | 802 return; |
| (...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1510 if (!handle) { | 1576 if (!handle) { |
| 1511 bad_message::ReceivedBadMessage(this, | 1577 bad_message::ReceivedBadMessage(this, |
| 1512 bad_message::SWDH_TERMINATE_BAD_HANDLE); | 1578 bad_message::SWDH_TERMINATE_BAD_HANDLE); |
| 1513 return; | 1579 return; |
| 1514 } | 1580 } |
| 1515 handle->version()->StopWorker( | 1581 handle->version()->StopWorker( |
| 1516 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 1582 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| 1517 } | 1583 } |
| 1518 | 1584 |
| 1519 } // namespace content | 1585 } // namespace content |
| OLD | NEW |