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

Side by Side Diff: content/child/service_worker/service_worker_network_provider.cc

Issue 2045383002: PlzNavigate: detect when a ServiceWorker is present (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments Created 4 years, 5 months 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/child/service_worker/service_worker_network_provider.h" 5 #include "content/child/service_worker/service_worker_network_provider.h"
6 6
7 #include "base/atomic_sequence_num.h" 7 #include "base/atomic_sequence_num.h"
8 #include "content/child/child_thread_impl.h" 8 #include "content/child/child_thread_impl.h"
9 #include "content/child/service_worker/service_worker_provider_context.h" 9 #include "content/child/service_worker/service_worker_provider_context.h"
10 #include "content/common/navigation_params.h"
11 #include "content/common/service_worker/service_worker_messages.h" 10 #include "content/common/service_worker/service_worker_messages.h"
12 #include "content/common/service_worker/service_worker_utils.h" 11 #include "content/common/service_worker/service_worker_utils.h"
13 #include "content/public/common/browser_side_navigation_policy.h" 12 #include "content/public/common/browser_side_navigation_policy.h"
14 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" 13 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h"
15 #include "third_party/WebKit/public/web/WebLocalFrame.h" 14 #include "third_party/WebKit/public/web/WebLocalFrame.h"
16 #include "third_party/WebKit/public/web/WebSandboxFlags.h" 15 #include "third_party/WebKit/public/web/WebSandboxFlags.h"
17 16
18 namespace content { 17 namespace content {
19 18
20 namespace { 19 namespace {
(...skipping 30 matching lines...) Expand all
51 ServiceWorkerNetworkProvider* ServiceWorkerNetworkProvider::FromDocumentState( 50 ServiceWorkerNetworkProvider* ServiceWorkerNetworkProvider::FromDocumentState(
52 base::SupportsUserData* datasource_userdata) { 51 base::SupportsUserData* datasource_userdata) {
53 return static_cast<ServiceWorkerNetworkProvider*>( 52 return static_cast<ServiceWorkerNetworkProvider*>(
54 datasource_userdata->GetUserData(&kUserDataKey)); 53 datasource_userdata->GetUserData(&kUserDataKey));
55 } 54 }
56 55
57 // static 56 // static
58 std::unique_ptr<ServiceWorkerNetworkProvider> 57 std::unique_ptr<ServiceWorkerNetworkProvider>
59 ServiceWorkerNetworkProvider::CreateForNavigation( 58 ServiceWorkerNetworkProvider::CreateForNavigation(
60 int route_id, 59 int route_id,
61 const RequestNavigationParams& request_params,
62 blink::WebLocalFrame* frame, 60 blink::WebLocalFrame* frame,
63 bool content_initiated) { 61 bool content_initiated) {
64 bool browser_side_navigation = IsBrowserSideNavigationEnabled();
65 bool should_create_provider_for_window = false;
66 int service_worker_provider_id = kInvalidServiceWorkerProviderId;
67 std::unique_ptr<ServiceWorkerNetworkProvider> network_provider;
68
69 // Determine if a ServiceWorkerNetworkProvider should be created and properly 62 // Determine if a ServiceWorkerNetworkProvider should be created and properly
70 // initialized for the navigation. A default ServiceWorkerNetworkProvider 63 // initialized for the navigation. A default ServiceWorkerNetworkProvider
71 // will always be created since it is expected in a certain number of places, 64 // will always be created since it is expected in a certain number of places,
72 // however it will have an invalid id. 65 // however it will have an invalid id.
73 // PlzNavigate: |service_worker_provider_id| can be sent by the browser, if 66 bool should_create_provider_for_window =
74 // it already created the SeviceWorkerProviderHost. 67 ((frame->effectiveSandboxFlags() & blink::WebSandboxFlags::Origin) !=
75 if (browser_side_navigation && !content_initiated) { 68 blink::WebSandboxFlags::Origin);
76 should_create_provider_for_window =
77 request_params.should_create_service_worker;
78 service_worker_provider_id = request_params.service_worker_provider_id;
79 DCHECK(ServiceWorkerUtils::IsBrowserAssignedProviderId(
80 service_worker_provider_id) ||
81 service_worker_provider_id == kInvalidServiceWorkerProviderId);
82 } else {
83 should_create_provider_for_window =
84 ((frame->effectiveSandboxFlags() & blink::WebSandboxFlags::Origin) !=
85 blink::WebSandboxFlags::Origin);
86 }
87 69
88 // Now create the ServiceWorkerNetworkProvider (with invalid id if needed). 70 // Now create the ServiceWorkerNetworkProvider (with invalid id if needed).
71 std::unique_ptr<ServiceWorkerNetworkProvider> network_provider;
89 if (should_create_provider_for_window) { 72 if (should_create_provider_for_window) {
90 // Ideally Document::isSecureContext would be called here, but the document 73 // Ideally Document::isSecureContext would be called here, but the document
91 // is not created yet, and due to redirects the URL may change. So pass 74 // is not created yet, and due to redirects the URL may change. So pass
92 // is_parent_frame_secure to the browser process, so it can determine the 75 // is_parent_frame_secure to the browser process, so it can determine the
93 // context security when deciding whether to allow a service worker to 76 // context security when deciding whether to allow a service worker to
94 // control the document. 77 // control the document.
95 const bool is_parent_frame_secure = IsFrameSecure(frame->parent()); 78 const bool is_parent_frame_secure = IsFrameSecure(frame->parent());
96 79
97 if (service_worker_provider_id == kInvalidServiceWorkerProviderId) { 80 network_provider = std::unique_ptr<ServiceWorkerNetworkProvider>(
98 network_provider = std::unique_ptr<ServiceWorkerNetworkProvider>( 81 new ServiceWorkerNetworkProvider(route_id,
99 new ServiceWorkerNetworkProvider(route_id, 82 SERVICE_WORKER_PROVIDER_FOR_WINDOW,
100 SERVICE_WORKER_PROVIDER_FOR_WINDOW, 83 is_parent_frame_secure));
101 is_parent_frame_secure));
102 } else {
103 CHECK(browser_side_navigation);
104 DCHECK(ServiceWorkerUtils::IsBrowserAssignedProviderId(
105 service_worker_provider_id));
106 network_provider = std::unique_ptr<ServiceWorkerNetworkProvider>(
107 new ServiceWorkerNetworkProvider(
108 route_id, SERVICE_WORKER_PROVIDER_FOR_WINDOW,
109 service_worker_provider_id, is_parent_frame_secure));
110 }
111 } else { 84 } else {
112 network_provider = std::unique_ptr<ServiceWorkerNetworkProvider>( 85 network_provider = std::unique_ptr<ServiceWorkerNetworkProvider>(
113 new ServiceWorkerNetworkProvider()); 86 new ServiceWorkerNetworkProvider());
114 } 87 }
115 return network_provider; 88 return network_provider;
116 } 89 }
117 90
118 ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider( 91 ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider(
119 int route_id, 92 int route_id,
120 ServiceWorkerProviderType provider_type, 93 ServiceWorkerProviderType provider_type,
121 int browser_provider_id,
122 bool is_parent_frame_secure) 94 bool is_parent_frame_secure)
123 : provider_id_(browser_provider_id) { 95 : provider_id_(GetNextProviderId()) {
124 if (provider_id_ == kInvalidServiceWorkerProviderId) 96 DCHECK(provider_id_ != kInvalidServiceWorkerProviderId);
125 return;
126 if (!ChildThreadImpl::current()) 97 if (!ChildThreadImpl::current())
127 return; // May be null in some tests. 98 return; // May be null in some tests.
128 context_ = new ServiceWorkerProviderContext( 99 context_ = new ServiceWorkerProviderContext(
129 provider_id_, provider_type, 100 provider_id_, provider_type,
130 ChildThreadImpl::current()->thread_safe_sender()); 101 ChildThreadImpl::current()->thread_safe_sender());
131 ChildThreadImpl::current()->Send(new ServiceWorkerHostMsg_ProviderCreated( 102 ChildThreadImpl::current()->Send(new ServiceWorkerHostMsg_ProviderCreated(
132 provider_id_, route_id, provider_type, is_parent_frame_secure)); 103 provider_id_, route_id, provider_type, is_parent_frame_secure));
133 } 104 }
134 105
135 ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider(
136 int route_id,
137 ServiceWorkerProviderType provider_type,
138 bool is_parent_frame_secure)
139 : ServiceWorkerNetworkProvider(route_id,
140 provider_type,
141 GetNextProviderId(),
142 is_parent_frame_secure) {}
143
144 ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider() 106 ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider()
145 : provider_id_(kInvalidServiceWorkerProviderId) {} 107 : provider_id_(kInvalidServiceWorkerProviderId) {}
146 108
147 ServiceWorkerNetworkProvider::~ServiceWorkerNetworkProvider() { 109 ServiceWorkerNetworkProvider::~ServiceWorkerNetworkProvider() {
148 if (provider_id_ == kInvalidServiceWorkerProviderId) 110 if (provider_id_ == kInvalidServiceWorkerProviderId)
149 return; 111 return;
150 if (!ChildThreadImpl::current()) 112 if (!ChildThreadImpl::current())
151 return; // May be null in some tests. 113 return; // May be null in some tests.
152 ChildThreadImpl::current()->Send( 114 ChildThreadImpl::current()->Send(
153 new ServiceWorkerHostMsg_ProviderDestroyed(provider_id_)); 115 new ServiceWorkerHostMsg_ProviderDestroyed(provider_id_));
154 } 116 }
155 117
156 void ServiceWorkerNetworkProvider::SetServiceWorkerVersionId( 118 void ServiceWorkerNetworkProvider::SetServiceWorkerVersionId(
157 int64_t version_id) { 119 int64_t version_id) {
158 DCHECK_NE(kInvalidServiceWorkerProviderId, provider_id_); 120 DCHECK_NE(kInvalidServiceWorkerProviderId, provider_id_);
159 if (!ChildThreadImpl::current()) 121 if (!ChildThreadImpl::current())
160 return; // May be null in some tests. 122 return; // May be null in some tests.
161 ChildThreadImpl::current()->Send( 123 ChildThreadImpl::current()->Send(
162 new ServiceWorkerHostMsg_SetVersionId(provider_id_, version_id)); 124 new ServiceWorkerHostMsg_SetVersionId(provider_id_, version_id));
163 } 125 }
164 126
165 bool ServiceWorkerNetworkProvider::IsControlledByServiceWorker() const { 127 bool ServiceWorkerNetworkProvider::IsControlledByServiceWorker() const {
166 return context() && context()->controller(); 128 return context() && context()->controller();
167 } 129 }
168 130
169 } // namespace content 131 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698