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

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

Issue 2518523003: Limit timeout for foreign fetch events when triggered by another service worker. (Closed)
Patch Set: don't intercept worker main resource fetches Created 4 years 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/foreign_fetch_request_handler.h" 5 #include "content/browser/service_worker/foreign_fetch_request_handler.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 84
85 if (!context_wrapper) 85 if (!context_wrapper)
86 return; 86 return;
87 87
88 if (skip_service_worker == SkipServiceWorker::ALL) 88 if (skip_service_worker == SkipServiceWorker::ALL)
89 return; 89 return;
90 90
91 if (!initiated_in_secure_context) 91 if (!initiated_in_secure_context)
92 return; 92 return;
93 93
94 if (ServiceWorkerUtils::IsMainResourceType(resource_type)) 94 // ServiceWorkerUtils::IsMainResource doesn't consider all worker types to
95 // be main resources. This code shouldn't handle any main resource requests
96 // though, so explicitly exclude the extra worker types.
97 if (ServiceWorkerUtils::IsMainResourceType(resource_type) ||
98 resource_type == RESOURCE_TYPE_WORKER ||
99 resource_type == RESOURCE_TYPE_SERVICE_WORKER)
95 return; 100 return;
96 101
97 if (request->initiator().has_value() && 102 if (request->initiator().has_value() &&
98 request->initiator()->IsSameOriginWith(url::Origin(request->url()))) { 103 request->initiator()->IsSameOriginWith(url::Origin(request->url()))) {
99 return; 104 return;
100 } 105 }
101 106
107 ServiceWorkerProviderHost* provider_host =
108 context_wrapper->context()->GetProviderHost(process_id, provider_id);
109 if (!provider_host || !provider_host->IsContextAlive())
110 return;
111
112 base::Optional<base::TimeDelta> timeout;
113 if (provider_host->IsHostToRunningServiceWorker()) {
114 timeout = base::make_optional(
115 provider_host->running_hosted_version()->remaining_timeout());
116 }
117
102 if (!context_wrapper->OriginHasForeignFetchRegistrations( 118 if (!context_wrapper->OriginHasForeignFetchRegistrations(
103 request->url().GetOrigin())) { 119 request->url().GetOrigin())) {
104 return; 120 return;
105 } 121 }
106 122
107 // Any more precise checks to see if the request should be intercepted are 123 // Any more precise checks to see if the request should be intercepted are
108 // asynchronous, so just create our handler in all cases. 124 // asynchronous, so just create our handler in all cases.
109 std::unique_ptr<ForeignFetchRequestHandler> handler( 125 std::unique_ptr<ForeignFetchRequestHandler> handler(
110 new ForeignFetchRequestHandler( 126 new ForeignFetchRequestHandler(
111 context_wrapper, blob_storage_context->AsWeakPtr(), request_mode, 127 context_wrapper, blob_storage_context->AsWeakPtr(), request_mode,
112 credentials_mode, redirect_mode, resource_type, request_context_type, 128 credentials_mode, redirect_mode, resource_type, request_context_type,
113 frame_type, body)); 129 frame_type, body, timeout));
114 request->SetUserData(&kUserDataKey, handler.release()); 130 request->SetUserData(&kUserDataKey, handler.release());
115 } 131 }
116 132
117 ForeignFetchRequestHandler* ForeignFetchRequestHandler::GetHandler( 133 ForeignFetchRequestHandler* ForeignFetchRequestHandler::GetHandler(
118 net::URLRequest* request) { 134 net::URLRequest* request) {
119 return static_cast<ForeignFetchRequestHandler*>( 135 return static_cast<ForeignFetchRequestHandler*>(
120 request->GetUserData(&kUserDataKey)); 136 request->GetUserData(&kUserDataKey));
121 } 137 }
122 138
123 std::unique_ptr<net::URLRequestInterceptor> 139 std::unique_ptr<net::URLRequestInterceptor>
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 return nullptr; 172 return nullptr;
157 } 173 }
158 174
159 // It's for original request (A) or redirect case (B-a or B-b). 175 // It's for original request (A) or redirect case (B-a or B-b).
160 DCHECK(!job_.get() || job_->ShouldForwardToServiceWorker()); 176 DCHECK(!job_.get() || job_->ShouldForwardToServiceWorker());
161 177
162 ServiceWorkerURLRequestJob* job = new ServiceWorkerURLRequestJob( 178 ServiceWorkerURLRequestJob* job = new ServiceWorkerURLRequestJob(
163 request, network_delegate, std::string(), blob_storage_context_, 179 request, network_delegate, std::string(), blob_storage_context_,
164 resource_context, request_mode_, credentials_mode_, redirect_mode_, 180 resource_context, request_mode_, credentials_mode_, redirect_mode_,
165 resource_type_, request_context_type_, frame_type_, body_, 181 resource_type_, request_context_type_, frame_type_, body_,
166 ServiceWorkerFetchType::FOREIGN_FETCH, this); 182 ServiceWorkerFetchType::FOREIGN_FETCH, timeout_, this);
167 job_ = job->GetWeakPtr(); 183 job_ = job->GetWeakPtr();
168 resource_context_ = resource_context; 184 resource_context_ = resource_context;
169 185
170 context_->FindReadyRegistrationForDocument( 186 context_->FindReadyRegistrationForDocument(
171 request->url(), 187 request->url(),
172 base::Bind(&ForeignFetchRequestHandler::DidFindRegistration, 188 base::Bind(&ForeignFetchRequestHandler::DidFindRegistration,
173 weak_factory_.GetWeakPtr(), job_)); 189 weak_factory_.GetWeakPtr(), job_));
174 190
175 return job_.get(); 191 return job_.get();
176 } 192 }
177 193
178 ForeignFetchRequestHandler::ForeignFetchRequestHandler( 194 ForeignFetchRequestHandler::ForeignFetchRequestHandler(
179 ServiceWorkerContextWrapper* context, 195 ServiceWorkerContextWrapper* context,
180 base::WeakPtr<storage::BlobStorageContext> blob_storage_context, 196 base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
181 FetchRequestMode request_mode, 197 FetchRequestMode request_mode,
182 FetchCredentialsMode credentials_mode, 198 FetchCredentialsMode credentials_mode,
183 FetchRedirectMode redirect_mode, 199 FetchRedirectMode redirect_mode,
184 ResourceType resource_type, 200 ResourceType resource_type,
185 RequestContextType request_context_type, 201 RequestContextType request_context_type,
186 RequestContextFrameType frame_type, 202 RequestContextFrameType frame_type,
187 scoped_refptr<ResourceRequestBodyImpl> body) 203 scoped_refptr<ResourceRequestBodyImpl> body,
204 const base::Optional<base::TimeDelta>& timeout)
188 : context_(context), 205 : context_(context),
189 blob_storage_context_(blob_storage_context), 206 blob_storage_context_(blob_storage_context),
190 resource_type_(resource_type), 207 resource_type_(resource_type),
191 request_mode_(request_mode), 208 request_mode_(request_mode),
192 credentials_mode_(credentials_mode), 209 credentials_mode_(credentials_mode),
193 redirect_mode_(redirect_mode), 210 redirect_mode_(redirect_mode),
194 request_context_type_(request_context_type), 211 request_context_type_(request_context_type),
195 frame_type_(frame_type), 212 frame_type_(frame_type),
196 body_(body), 213 body_(body),
214 timeout_(timeout),
197 weak_factory_(this) {} 215 weak_factory_(this) {}
198 216
199 void ForeignFetchRequestHandler::DidFindRegistration( 217 void ForeignFetchRequestHandler::DidFindRegistration(
200 const base::WeakPtr<ServiceWorkerURLRequestJob>& job, 218 const base::WeakPtr<ServiceWorkerURLRequestJob>& job,
201 ServiceWorkerStatusCode status, 219 ServiceWorkerStatusCode status,
202 scoped_refptr<ServiceWorkerRegistration> registration) { 220 scoped_refptr<ServiceWorkerRegistration> registration) {
203 if (!job || job.get() != job_.get()) { 221 if (!job || job.get() != job_.get()) {
204 // No more job to handle, or job changed somehow, so just return. 222 // No more job to handle, or job changed somehow, so just return.
205 return; 223 return;
206 } 224 }
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 // The worker entry in the database was written by old version Chrome (< M56) 303 // The worker entry in the database was written by old version Chrome (< M56)
286 // and the main script was not loaded yet. In this case, we can't check the 304 // and the main script was not loaded yet. In this case, we can't check the
287 // origin trial token. 305 // origin trial token.
288 if (!active_version->origin_trial_tokens()) 306 if (!active_version->origin_trial_tokens())
289 return true; 307 return true;
290 const auto& token_map = *active_version->origin_trial_tokens(); 308 const auto& token_map = *active_version->origin_trial_tokens();
291 return base::ContainsKey(token_map, "ForeignFetch"); 309 return base::ContainsKey(token_map, "ForeignFetch");
292 } 310 }
293 311
294 } // namespace content 312 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698