Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(322)

Side by Side Diff: content/browser/service_worker/service_worker_dispatcher_host.cc

Issue 2451373003: service worker: Implement NavigationPreloadManager.setHeaderValue (Closed)
Patch Set: rebase Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 17 matching lines...) Expand all
28 #include "content/browser/service_worker/service_worker_registration_handle.h" 28 #include "content/browser/service_worker/service_worker_registration_handle.h"
29 #include "content/common/service_worker/embedded_worker_messages.h" 29 #include "content/common/service_worker/embedded_worker_messages.h"
30 #include "content/common/service_worker/service_worker_messages.h" 30 #include "content/common/service_worker/service_worker_messages.h"
31 #include "content/common/service_worker/service_worker_types.h" 31 #include "content/common/service_worker/service_worker_types.h"
32 #include "content/common/service_worker/service_worker_utils.h" 32 #include "content/common/service_worker/service_worker_utils.h"
33 #include "content/public/browser/content_browser_client.h" 33 #include "content/public/browser/content_browser_client.h"
34 #include "content/public/common/browser_side_navigation_policy.h" 34 #include "content/public/common/browser_side_navigation_policy.h"
35 #include "content/public/common/content_client.h" 35 #include "content/public/common/content_client.h"
36 #include "content/public/common/origin_util.h" 36 #include "content/public/common/origin_util.h"
37 #include "ipc/ipc_message_macros.h" 37 #include "ipc/ipc_message_macros.h"
38 #include "net/http/http_util.h"
38 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor kerError.h" 39 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor kerError.h"
39 #include "url/gurl.h" 40 #include "url/gurl.h"
40 41
41 using blink::WebServiceWorkerError; 42 using blink::WebServiceWorkerError;
42 43
43 namespace content { 44 namespace content {
44 45
45 namespace { 46 namespace {
46 47
47 const char kNoDocumentURLErrorMessage[] = 48 const char kNoDocumentURLErrorMessage[] =
48 "No URL is associated with the caller's document."; 49 "No URL is associated with the caller's document.";
49 const char kShutdownErrorMessage[] = 50 const char kShutdownErrorMessage[] =
50 "The Service Worker system has shutdown."; 51 "The Service Worker system has shutdown.";
51 const char kUserDeniedPermissionMessage[] = 52 const char kUserDeniedPermissionMessage[] =
52 "The user denied permission to use Service Worker."; 53 "The user denied permission to use Service Worker.";
53 const char kInvalidStateErrorMessage[] = "The object is in an invalid state."; 54 const char kInvalidStateErrorMessage[] = "The object is in an invalid state.";
54 const char kEnableNavigationPreloadErrorPrefix[] = 55 const char kEnableNavigationPreloadErrorPrefix[] =
55 "Failed to enable or disable navigation preload: "; 56 "Failed to enable or disable navigation preload: ";
56 const char kGetNavigationPreloadStateErrorPrefix[] = 57 const char kGetNavigationPreloadStateErrorPrefix[] =
57 "Failed to get navigation preload state: "; 58 "Failed to get navigation preload state: ";
59 const char kSetNavigationPreloadHeaderErrorPrefix[] =
60 "Failed to set navigation preload header: ";
58 61
59 const uint32_t kFilteredMessageClasses[] = { 62 const uint32_t kFilteredMessageClasses[] = {
60 ServiceWorkerMsgStart, EmbeddedWorkerMsgStart, 63 ServiceWorkerMsgStart, EmbeddedWorkerMsgStart,
61 }; 64 };
62 65
63 void RunSoon(const base::Closure& callback) { 66 void RunSoon(const base::Closure& callback) {
64 if (!callback.is_null()) 67 if (!callback.is_null())
65 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); 68 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback);
66 } 69 }
67 70
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 OnDecrementServiceWorkerRefCount) 186 OnDecrementServiceWorkerRefCount)
184 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_IncrementRegistrationRefCount, 187 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_IncrementRegistrationRefCount,
185 OnIncrementRegistrationRefCount) 188 OnIncrementRegistrationRefCount)
186 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementRegistrationRefCount, 189 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementRegistrationRefCount,
187 OnDecrementRegistrationRefCount) 190 OnDecrementRegistrationRefCount)
188 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_TerminateWorker, OnTerminateWorker) 191 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_TerminateWorker, OnTerminateWorker)
189 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_EnableNavigationPreload, 192 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_EnableNavigationPreload,
190 OnEnableNavigationPreload) 193 OnEnableNavigationPreload)
191 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetNavigationPreloadState, 194 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetNavigationPreloadState,
192 OnGetNavigationPreloadState) 195 OnGetNavigationPreloadState)
196 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SetNavigationPreloadHeader,
197 OnSetNavigationPreloadHeader)
193 IPC_MESSAGE_UNHANDLED(handled = false) 198 IPC_MESSAGE_UNHANDLED(handled = false)
194 IPC_END_MESSAGE_MAP() 199 IPC_END_MESSAGE_MAP()
195 200
196 if (!handled && GetContext()) { 201 if (!handled && GetContext()) {
197 handled = GetContext()->embedded_worker_registry()->OnMessageReceived( 202 handled = GetContext()->embedded_worker_registry()->OnMessageReceived(
198 message, render_process_id_); 203 message, render_process_id_);
199 if (!handled) 204 if (!handled)
200 bad_message::ReceivedBadMessage(this, bad_message::SWDH_NOT_HANDLED); 205 bad_message::ReceivedBadMessage(this, bad_message::SWDH_NOT_HANDLED);
201 } 206 }
202 207
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after
779 registration->pattern(), provider_host->topmost_frame_url(), 784 registration->pattern(), provider_host->topmost_frame_url(),
780 resource_context_, render_process_id_, provider_host->frame_id())) { 785 resource_context_, render_process_id_, provider_host->frame_id())) {
781 Send(new ServiceWorkerMsg_GetNavigationPreloadStateError( 786 Send(new ServiceWorkerMsg_GetNavigationPreloadStateError(
782 thread_id, request_id, WebServiceWorkerError::ErrorTypeDisabled, 787 thread_id, request_id, WebServiceWorkerError::ErrorTypeDisabled,
783 std::string(kGetNavigationPreloadStateErrorPrefix) + 788 std::string(kGetNavigationPreloadStateErrorPrefix) +
784 std::string(kUserDeniedPermissionMessage))); 789 std::string(kUserDeniedPermissionMessage)));
785 return; 790 return;
786 } 791 }
787 792
788 Send(new ServiceWorkerMsg_DidGetNavigationPreloadState( 793 Send(new ServiceWorkerMsg_DidGetNavigationPreloadState(
789 thread_id, request_id, registration->is_navigation_preload_enabled())); 794 thread_id, request_id,
795 NavigationPreloadState(registration->is_navigation_preload_enabled(),
796 registration->navigation_preload_header())));
797 }
798
799 void ServiceWorkerDispatcherHost::OnSetNavigationPreloadHeader(
800 int thread_id,
801 int request_id,
802 int provider_id,
803 int64_t registration_id,
804 const std::string& value) {
805 ProviderStatus provider_status;
806 ServiceWorkerProviderHost* provider_host =
807 GetProviderHostForRequest(&provider_status, provider_id);
808 switch (provider_status) {
809 case ProviderStatus::NO_CONTEXT: // fallthrough
810 case ProviderStatus::DEAD_HOST:
811 Send(new ServiceWorkerMsg_SetNavigationPreloadHeaderError(
812 thread_id, request_id, WebServiceWorkerError::ErrorTypeAbort,
813 std::string(kSetNavigationPreloadHeaderErrorPrefix) +
814 std::string(kShutdownErrorMessage)));
815 return;
816 case ProviderStatus::NO_HOST:
817 bad_message::ReceivedBadMessage(
818 this, bad_message::SWDH_SET_NAVIGATION_PRELOAD_HEADER_NO_HOST);
819 return;
820 case ProviderStatus::NO_URL:
821 Send(new ServiceWorkerMsg_SetNavigationPreloadHeaderError(
822 thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity,
823 std::string(kSetNavigationPreloadHeaderErrorPrefix) +
824 std::string(kNoDocumentURLErrorMessage)));
825 return;
826 case ProviderStatus::OK:
827 break;
828 }
829
830 ServiceWorkerRegistration* registration =
831 GetContext()->GetLiveRegistration(registration_id);
832 if (!registration) {
833 // |registration| must be alive because a renderer retains a registration
834 // reference at this point.
835 bad_message::ReceivedBadMessage(
836 this,
837 bad_message::SWDH_SET_NAVIGATION_PRELOAD_HEADER_BAD_REGISTRATION_ID);
838 return;
839 }
840
841 std::vector<GURL> urls = {provider_host->document_url(),
842 registration->pattern()};
843 if (!ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers(urls)) {
844 bad_message::ReceivedBadMessage(
845 this, bad_message::SWDH_SET_NAVIGATION_PRELOAD_HEADER_INVALID_ORIGIN);
846 return;
847 }
848
849 // TODO(falken): Ideally this would match Blink's isValidHTTPHeaderValue.
850 // Chrome's check is less restrictive: it allows non-latin1 characters.
851 if (!net::HttpUtil::IsValidHeaderValue(value)) {
852 bad_message::ReceivedBadMessage(
853 this, bad_message::SWDH_SET_NAVIGATION_PRELOAD_HEADER_BAD_VALUE);
854 return;
855 }
856
857 if (!GetContentClient()->browser()->AllowServiceWorker(
858 registration->pattern(), provider_host->topmost_frame_url(),
859 resource_context_, render_process_id_, provider_host->frame_id())) {
860 Send(new ServiceWorkerMsg_SetNavigationPreloadHeaderError(
861 thread_id, request_id, WebServiceWorkerError::ErrorTypeDisabled,
862 std::string(kSetNavigationPreloadHeaderErrorPrefix) +
863 std::string(kUserDeniedPermissionMessage)));
864 return;
865 }
866
867 // TODO(falken): Write to disk before resolving the promise.
868 registration->SetNavigationPreloadHeader(value);
869 Send(new ServiceWorkerMsg_DidSetNavigationPreloadHeader(thread_id,
870 request_id));
790 } 871 }
791 872
792 void ServiceWorkerDispatcherHost::OnPostMessageToWorker( 873 void ServiceWorkerDispatcherHost::OnPostMessageToWorker(
793 int handle_id, 874 int handle_id,
794 int provider_id, 875 int provider_id,
795 const base::string16& message, 876 const base::string16& message,
796 const url::Origin& source_origin, 877 const url::Origin& source_origin,
797 const std::vector<int>& sent_message_ports) { 878 const std::vector<int>& sent_message_ports) {
798 TRACE_EVENT0("ServiceWorker", 879 TRACE_EVENT0("ServiceWorker",
799 "ServiceWorkerDispatcherHost::OnPostMessageToWorker"); 880 "ServiceWorkerDispatcherHost::OnPostMessageToWorker");
(...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after
1575 if (!handle) { 1656 if (!handle) {
1576 bad_message::ReceivedBadMessage(this, 1657 bad_message::ReceivedBadMessage(this,
1577 bad_message::SWDH_TERMINATE_BAD_HANDLE); 1658 bad_message::SWDH_TERMINATE_BAD_HANDLE);
1578 return; 1659 return;
1579 } 1660 }
1580 handle->version()->StopWorker( 1661 handle->version()->StopWorker(
1581 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); 1662 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
1582 } 1663 }
1583 1664
1584 } // namespace content 1665 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698