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); | |
nasko
2016/10/25 23:23:42
Shouldn't this be SWDH_GET_NAVIGATION_PRELOAD_STAT
falken
2016/10/25 23:55:58
Done. Yes more bad copy paste coding.
| |
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 |