blob: 9df6d06083937a03e5bd98d6a6b125529f860e2a [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/service_worker/service_worker_url_job_wrapper.h"
#include "content/browser/service_worker/service_worker_navigation_loader.h"
#include "content/browser/service_worker/service_worker_url_request_job.h"
#include "content/public/browser/resource_request_info.h"
#include "content/public/common/content_switches.h"
namespace content {
ServiceWorkerURLJobWrapper::ServiceWorkerURLJobWrapper(
base::WeakPtr<ServiceWorkerURLRequestJob> url_request_job)
: url_request_job_(std::move(url_request_job)) {}
ServiceWorkerURLJobWrapper::ServiceWorkerURLJobWrapper(
std::unique_ptr<ServiceWorkerNavigationLoader> url_loader_job)
: url_loader_job_(std::move(url_loader_job)) {}
ServiceWorkerURLJobWrapper::~ServiceWorkerURLJobWrapper() {
if (url_loader_job_) {
// Detach the URLLoader from this wrapper (and therefore
// from the request handler). This may delete the
// |url_loader_job_| or may make it self-owned if it is
// bound to a Mojo endpoint.
url_loader_job_.release()->DetachedFromRequest();
}
}
void ServiceWorkerURLJobWrapper::FallbackToNetwork() {
if (url_loader_job_) {
url_loader_job_->FallbackToNetwork();
} else {
url_request_job_->FallbackToNetwork();
}
}
void ServiceWorkerURLJobWrapper::FallbackToNetworkOrRenderer() {
if (url_loader_job_) {
// Fallback to renderer is used when CORS checks need to be performed on the
// request. CORS doesn't apply to navigations, and |url_loader_job_| is for
// navigations, so just use FallbackToNetwork().
url_loader_job_->FallbackToNetwork();
} else {
url_request_job_->FallbackToNetworkOrRenderer();
}
}
void ServiceWorkerURLJobWrapper::ForwardToServiceWorker() {
if (url_loader_job_) {
url_loader_job_->ForwardToServiceWorker();
} else {
url_request_job_->ForwardToServiceWorker();
}
}
bool ServiceWorkerURLJobWrapper::ShouldFallbackToNetwork() {
if (url_loader_job_) {
return url_loader_job_->ShouldFallbackToNetwork();
} else {
return url_request_job_->ShouldFallbackToNetwork();
}
}
bool ServiceWorkerURLJobWrapper::ShouldForwardToServiceWorker() {
if (url_loader_job_) {
return url_loader_job_->ShouldForwardToServiceWorker();
} else {
return url_request_job_->ShouldForwardToServiceWorker();
}
}
void ServiceWorkerURLJobWrapper::FailDueToLostController() {
// This function is only called for subresource requests, so it can't
// be called for |url_loader_job_|, which is for navigations.
DCHECK(!url_loader_job_);
url_request_job_->FailDueToLostController();
}
bool ServiceWorkerURLJobWrapper::IsAlive() const {
return url_loader_job_ || url_request_job_;
}
} // namespace content