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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/service_worker/foreign_fetch_request_handler.cc
diff --git a/content/browser/service_worker/foreign_fetch_request_handler.cc b/content/browser/service_worker/foreign_fetch_request_handler.cc
index 5298f1c7cf45020a0f929d556086f309a55de40e..ab2d134554e4e818f0ddf3edda12dfdea52706f4 100644
--- a/content/browser/service_worker/foreign_fetch_request_handler.cc
+++ b/content/browser/service_worker/foreign_fetch_request_handler.cc
@@ -91,7 +91,12 @@ void ForeignFetchRequestHandler::InitializeHandler(
if (!initiated_in_secure_context)
return;
- if (ServiceWorkerUtils::IsMainResourceType(resource_type))
+ // ServiceWorkerUtils::IsMainResource doesn't consider all worker types to
+ // be main resources. This code shouldn't handle any main resource requests
+ // though, so explicitly exclude the extra worker types.
+ if (ServiceWorkerUtils::IsMainResourceType(resource_type) ||
+ resource_type == RESOURCE_TYPE_WORKER ||
+ resource_type == RESOURCE_TYPE_SERVICE_WORKER)
return;
if (request->initiator().has_value() &&
@@ -99,6 +104,17 @@ void ForeignFetchRequestHandler::InitializeHandler(
return;
}
+ ServiceWorkerProviderHost* provider_host =
+ context_wrapper->context()->GetProviderHost(process_id, provider_id);
+ if (!provider_host || !provider_host->IsContextAlive())
+ return;
+
+ base::Optional<base::TimeDelta> timeout;
+ if (provider_host->IsHostToRunningServiceWorker()) {
+ timeout = base::make_optional(
+ provider_host->running_hosted_version()->remaining_timeout());
+ }
+
if (!context_wrapper->OriginHasForeignFetchRegistrations(
request->url().GetOrigin())) {
return;
@@ -110,7 +126,7 @@ void ForeignFetchRequestHandler::InitializeHandler(
new ForeignFetchRequestHandler(
context_wrapper, blob_storage_context->AsWeakPtr(), request_mode,
credentials_mode, redirect_mode, resource_type, request_context_type,
- frame_type, body));
+ frame_type, body, timeout));
request->SetUserData(&kUserDataKey, handler.release());
}
@@ -163,7 +179,7 @@ net::URLRequestJob* ForeignFetchRequestHandler::MaybeCreateJob(
request, network_delegate, std::string(), blob_storage_context_,
resource_context, request_mode_, credentials_mode_, redirect_mode_,
resource_type_, request_context_type_, frame_type_, body_,
- ServiceWorkerFetchType::FOREIGN_FETCH, this);
+ ServiceWorkerFetchType::FOREIGN_FETCH, timeout_, this);
job_ = job->GetWeakPtr();
resource_context_ = resource_context;
@@ -184,7 +200,8 @@ ForeignFetchRequestHandler::ForeignFetchRequestHandler(
ResourceType resource_type,
RequestContextType request_context_type,
RequestContextFrameType frame_type,
- scoped_refptr<ResourceRequestBodyImpl> body)
+ scoped_refptr<ResourceRequestBodyImpl> body,
+ const base::Optional<base::TimeDelta>& timeout)
: context_(context),
blob_storage_context_(blob_storage_context),
resource_type_(resource_type),
@@ -194,6 +211,7 @@ ForeignFetchRequestHandler::ForeignFetchRequestHandler(
request_context_type_(request_context_type),
frame_type_(frame_type),
body_(body),
+ timeout_(timeout),
weak_factory_(this) {}
void ForeignFetchRequestHandler::DidFindRegistration(

Powered by Google App Engine
This is Rietveld 408576698