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

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

Issue 1294243004: PlzNavigate: Make ServiceWorker work with PlzNavigate. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review comments Created 5 years, 2 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/browser/service_worker/service_worker_request_handler.h" 5 #include "content/browser/service_worker/service_worker_request_handler.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/command_line.h"
9 #include "content/browser/service_worker/service_worker_context_core.h" 10 #include "content/browser/service_worker/service_worker_context_core.h"
10 #include "content/browser/service_worker/service_worker_context_wrapper.h" 11 #include "content/browser/service_worker/service_worker_context_wrapper.h"
11 #include "content/browser/service_worker/service_worker_provider_host.h" 12 #include "content/browser/service_worker/service_worker_provider_host.h"
12 #include "content/browser/service_worker/service_worker_registration.h" 13 #include "content/browser/service_worker/service_worker_registration.h"
13 #include "content/browser/service_worker/service_worker_url_request_job.h" 14 #include "content/browser/service_worker/service_worker_url_request_job.h"
14 #include "content/common/resource_request_body.h" 15 #include "content/common/resource_request_body.h"
15 #include "content/common/service_worker/service_worker_types.h" 16 #include "content/common/service_worker/service_worker_types.h"
16 #include "content/common/service_worker/service_worker_utils.h" 17 #include "content/common/service_worker/service_worker_utils.h"
17 #include "content/public/browser/resource_context.h" 18 #include "content/public/browser/resource_context.h"
19 #include "content/public/common/child_process_host.h"
20 #include "content/public/common/content_switches.h"
18 #include "content/public/common/origin_util.h" 21 #include "content/public/common/origin_util.h"
22 #include "ipc/ipc_message.h"
19 #include "net/base/net_util.h" 23 #include "net/base/net_util.h"
20 #include "net/url_request/url_request.h" 24 #include "net/url_request/url_request.h"
21 #include "net/url_request/url_request_interceptor.h" 25 #include "net/url_request/url_request_interceptor.h"
22 #include "storage/browser/blob/blob_storage_context.h" 26 #include "storage/browser/blob/blob_storage_context.h"
23 27
24 namespace content { 28 namespace content {
25 29
26 namespace { 30 namespace {
27 31
28 int kUserDataKey; // Key value is not important. 32 int kUserDataKey; // Key value is not important.
(...skipping 13 matching lines...) Expand all
42 return NULL; 46 return NULL;
43 return handler->MaybeCreateJob( 47 return handler->MaybeCreateJob(
44 request, network_delegate, resource_context_); 48 request, network_delegate, resource_context_);
45 } 49 }
46 50
47 private: 51 private:
48 ResourceContext* resource_context_; 52 ResourceContext* resource_context_;
49 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRequestInterceptor); 53 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRequestInterceptor);
50 }; 54 };
51 55
56 void FinalizeHandlerInitialization(
57 net::URLRequest* request,
58 ServiceWorkerProviderHost* provider_host,
59 storage::BlobStorageContext* blob_storage_context,
60 bool skip_service_worker,
61 FetchRequestMode request_mode,
62 FetchCredentialsMode credentials_mode,
63 FetchRedirectMode redirect_mode,
64 ResourceType resource_type,
65 RequestContextType request_context_type,
66 RequestContextFrameType frame_type,
67 scoped_refptr<ResourceRequestBody> body) {
68 if (skip_service_worker) {
69 // TODO(horo): Does this work properly for PlzNavigate?
70 if (ServiceWorkerUtils::IsMainResourceType(resource_type)) {
71 provider_host->SetDocumentUrl(net::SimplifyUrlForRequest(request->url()));
72 provider_host->SetTopmostFrameUrl(request->first_party_for_cookies());
73 // A page load with skip_service_worker should be triggered by
74 // shift-reload, so retain all live matching registrations.
75 provider_host->AddAllMatchingRegistrations();
76 }
77 return;
78 }
79
80 scoped_ptr<ServiceWorkerRequestHandler> handler(
81 provider_host->CreateRequestHandler(
82 request_mode, credentials_mode, redirect_mode, resource_type,
83 request_context_type, frame_type, blob_storage_context->AsWeakPtr(),
84 body));
85 if (!handler)
86 return;
87
88 request->SetUserData(&kUserDataKey, handler.release());
89 }
90
52 } // namespace 91 } // namespace
53 92
93 // PlzNavigate
94 void ServiceWorkerRequestHandler::InitializeForNavigation(
95 net::URLRequest* request,
96 ServiceWorkerContextWrapper* context_wrapper,
97 storage::BlobStorageContext* blob_storage_context,
98 int provider_id,
99 bool skip_service_worker,
100 ResourceType resource_type,
101 RequestContextType request_context_type,
102 RequestContextFrameType frame_type,
103 scoped_refptr<ResourceRequestBody> body) {
104 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
105 switches::kEnableBrowserSideNavigation));
106
107 // Create the handler even for insecure HTTP since it's used in the
108 // case of redirect to HTTPS.
109 if (!request->url().SchemeIsHTTPOrHTTPS() &&
110 !OriginCanAccessServiceWorkers(request->url())) {
111 return;
112 }
113
114 if (!context_wrapper || !context_wrapper->context()) {
115 return;
116 }
117
118 // The navigation request comes from a sandboxed frame. Do not create a
119 // SWProviderHost for sandboxed frames.
120 if (provider_id == kInvalidServiceWorkerProviderId)
121 return;
122
123 // Initialize the SWProviderHost.
124 scoped_ptr<ServiceWorkerProviderHost> provider_host(
125 new ServiceWorkerProviderHost(
126 ChildProcessHost::kInvalidUniqueID, MSG_ROUTING_NONE, provider_id,
127 SERVICE_WORKER_PROVIDER_FOR_WINDOW,
128 context_wrapper->context()->AsWeakPtr(), nullptr));
129
130 FinalizeHandlerInitialization(
131 request, provider_host.get(), blob_storage_context, skip_service_worker,
132 FETCH_REQUEST_MODE_SAME_ORIGIN, FETCH_CREDENTIALS_MODE_INCLUDE,
133 FetchRedirectMode::MANUAL_MODE, resource_type, request_context_type,
134 frame_type, body);
135
136 // Transfer ownership to the context map.
137 // In the case of a successful navigation, the SWProviderHost will be
138 // transferred to its "final" destination in the OnProviderCreated handler. If
139 // the navigation fails, the NavigationHandle dtor will take care of
140 // destroying the SWProviderHost.
141 context_wrapper->context()->AddNavigationProviderHost(provider_host.Pass());
142 }
143
54 void ServiceWorkerRequestHandler::InitializeHandler( 144 void ServiceWorkerRequestHandler::InitializeHandler(
55 net::URLRequest* request, 145 net::URLRequest* request,
56 ServiceWorkerContextWrapper* context_wrapper, 146 ServiceWorkerContextWrapper* context_wrapper,
57 storage::BlobStorageContext* blob_storage_context, 147 storage::BlobStorageContext* blob_storage_context,
58 int process_id, 148 int process_id,
59 int provider_id, 149 int provider_id,
60 bool skip_service_worker, 150 bool skip_service_worker,
61 FetchRequestMode request_mode, 151 FetchRequestMode request_mode,
62 FetchCredentialsMode credentials_mode, 152 FetchCredentialsMode credentials_mode,
63 FetchRedirectMode redirect_mode, 153 FetchRedirectMode redirect_mode,
(...skipping 11 matching lines...) Expand all
75 if (!context_wrapper || !context_wrapper->context() || 165 if (!context_wrapper || !context_wrapper->context() ||
76 provider_id == kInvalidServiceWorkerProviderId) { 166 provider_id == kInvalidServiceWorkerProviderId) {
77 return; 167 return;
78 } 168 }
79 169
80 ServiceWorkerProviderHost* provider_host = 170 ServiceWorkerProviderHost* provider_host =
81 context_wrapper->context()->GetProviderHost(process_id, provider_id); 171 context_wrapper->context()->GetProviderHost(process_id, provider_id);
82 if (!provider_host || !provider_host->IsContextAlive()) 172 if (!provider_host || !provider_host->IsContextAlive())
83 return; 173 return;
84 174
85 if (skip_service_worker) { 175 FinalizeHandlerInitialization(request, provider_host, blob_storage_context,
86 if (ServiceWorkerUtils::IsMainResourceType(resource_type)) { 176 skip_service_worker, request_mode,
87 provider_host->SetDocumentUrl(net::SimplifyUrlForRequest(request->url())); 177 credentials_mode, redirect_mode, resource_type,
88 provider_host->SetTopmostFrameUrl(request->first_party_for_cookies()); 178 request_context_type, frame_type, body);
89 // A page load with skip_service_worker should be triggered by
90 // shift-reload, so retain all live matching registrations.
91 provider_host->AddAllMatchingRegistrations();
92 }
93 return;
94 }
95
96 scoped_ptr<ServiceWorkerRequestHandler> handler(
97 provider_host->CreateRequestHandler(
98 request_mode, credentials_mode, redirect_mode, resource_type,
99 request_context_type, frame_type, blob_storage_context->AsWeakPtr(),
100 body));
101 if (!handler)
102 return;
103
104 request->SetUserData(&kUserDataKey, handler.release());
105 } 179 }
106 180
107 ServiceWorkerRequestHandler* ServiceWorkerRequestHandler::GetHandler( 181 ServiceWorkerRequestHandler* ServiceWorkerRequestHandler::GetHandler(
108 net::URLRequest* request) { 182 net::URLRequest* request) {
109 return static_cast<ServiceWorkerRequestHandler*>( 183 return static_cast<ServiceWorkerRequestHandler*>(
110 request->GetUserData(&kUserDataKey)); 184 request->GetUserData(&kUserDataKey));
111 } 185 }
112 186
113 scoped_ptr<net::URLRequestInterceptor> 187 scoped_ptr<net::URLRequestInterceptor>
114 ServiceWorkerRequestHandler::CreateInterceptor( 188 ServiceWorkerRequestHandler::CreateInterceptor(
115 ResourceContext* resource_context) { 189 ResourceContext* resource_context) {
116 return scoped_ptr<net::URLRequestInterceptor>( 190 return scoped_ptr<net::URLRequestInterceptor>(
117 new ServiceWorkerRequestInterceptor(resource_context)); 191 new ServiceWorkerRequestInterceptor(resource_context));
118 } 192 }
119 193
120 bool ServiceWorkerRequestHandler::IsControlledByServiceWorker( 194 bool ServiceWorkerRequestHandler::IsControlledByServiceWorker(
121 net::URLRequest* request) { 195 net::URLRequest* request) {
122 ServiceWorkerRequestHandler* handler = GetHandler(request); 196 ServiceWorkerRequestHandler* handler = GetHandler(request);
123 if (!handler || !handler->provider_host_) 197 if (!handler || !handler->provider_host_)
124 return false; 198 return false;
125 return handler->provider_host_->associated_registration() || 199 return handler->provider_host_->associated_registration() ||
126 handler->provider_host_->running_hosted_version(); 200 handler->provider_host_->running_hosted_version();
127 } 201 }
128 202
129 void ServiceWorkerRequestHandler::PrepareForCrossSiteTransfer( 203 void ServiceWorkerRequestHandler::PrepareForCrossSiteTransfer(
130 int old_process_id) { 204 int old_process_id) {
205 CHECK(!base::CommandLine::ForCurrentProcess()->HasSwitch(
206 switches::kEnableBrowserSideNavigation));
131 if (!provider_host_ || !context_) 207 if (!provider_host_ || !context_)
132 return; 208 return;
133 old_process_id_ = old_process_id; 209 old_process_id_ = old_process_id;
134 old_provider_id_ = provider_host_->provider_id(); 210 old_provider_id_ = provider_host_->provider_id();
135 host_for_cross_site_transfer_ = 211 host_for_cross_site_transfer_ = context_->TransferProviderHostOut(
136 context_->TransferProviderHostOut(old_process_id, 212 old_process_id, provider_host_->provider_id());
137 provider_host_->provider_id());
138 DCHECK_EQ(provider_host_.get(), host_for_cross_site_transfer_.get()); 213 DCHECK_EQ(provider_host_.get(), host_for_cross_site_transfer_.get());
139 } 214 }
140 215
141 void ServiceWorkerRequestHandler::CompleteCrossSiteTransfer( 216 void ServiceWorkerRequestHandler::CompleteCrossSiteTransfer(
142 int new_process_id, int new_provider_id) { 217 int new_process_id, int new_provider_id) {
218 CHECK(!base::CommandLine::ForCurrentProcess()->HasSwitch(
219 switches::kEnableBrowserSideNavigation));
143 if (!host_for_cross_site_transfer_.get() || !context_) 220 if (!host_for_cross_site_transfer_.get() || !context_)
144 return; 221 return;
145 DCHECK_EQ(provider_host_.get(), host_for_cross_site_transfer_.get()); 222 DCHECK_EQ(provider_host_.get(), host_for_cross_site_transfer_.get());
146 context_->TransferProviderHostIn( 223 context_->TransferProviderHostIn(new_process_id, new_provider_id,
147 new_process_id, 224 host_for_cross_site_transfer_.Pass());
148 new_provider_id,
149 host_for_cross_site_transfer_.Pass());
150 DCHECK_EQ(provider_host_->provider_id(), new_provider_id); 225 DCHECK_EQ(provider_host_->provider_id(), new_provider_id);
151 } 226 }
152 227
153 void ServiceWorkerRequestHandler::MaybeCompleteCrossSiteTransferInOldProcess( 228 void ServiceWorkerRequestHandler::MaybeCompleteCrossSiteTransferInOldProcess(
154 int old_process_id) { 229 int old_process_id) {
230 CHECK(!base::CommandLine::ForCurrentProcess()->HasSwitch(
231 switches::kEnableBrowserSideNavigation));
155 if (!host_for_cross_site_transfer_.get() || !context_ || 232 if (!host_for_cross_site_transfer_.get() || !context_ ||
156 old_process_id_ != old_process_id) { 233 old_process_id_ != old_process_id) {
157 return; 234 return;
158 } 235 }
159 CompleteCrossSiteTransfer(old_process_id_, old_provider_id_); 236 CompleteCrossSiteTransfer(old_process_id_, old_provider_id_);
160 } 237 }
161 238
162 ServiceWorkerRequestHandler::~ServiceWorkerRequestHandler() { 239 ServiceWorkerRequestHandler::~ServiceWorkerRequestHandler() {
163 } 240 }
164 241
165 ServiceWorkerRequestHandler::ServiceWorkerRequestHandler( 242 ServiceWorkerRequestHandler::ServiceWorkerRequestHandler(
166 base::WeakPtr<ServiceWorkerContextCore> context, 243 base::WeakPtr<ServiceWorkerContextCore> context,
167 base::WeakPtr<ServiceWorkerProviderHost> provider_host, 244 base::WeakPtr<ServiceWorkerProviderHost> provider_host,
168 base::WeakPtr<storage::BlobStorageContext> blob_storage_context, 245 base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
169 ResourceType resource_type) 246 ResourceType resource_type)
170 : context_(context), 247 : context_(context),
171 provider_host_(provider_host), 248 provider_host_(provider_host),
172 blob_storage_context_(blob_storage_context), 249 blob_storage_context_(blob_storage_context),
173 resource_type_(resource_type), 250 resource_type_(resource_type),
174 old_process_id_(0), 251 old_process_id_(0),
175 old_provider_id_(kInvalidServiceWorkerProviderId) { 252 old_provider_id_(kInvalidServiceWorkerProviderId) {
176 } 253 }
177 254
178 } // namespace content 255 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698