| Index: content/browser/appcache/appcache_request_handler.cc
|
| diff --git a/content/browser/appcache/appcache_request_handler.cc b/content/browser/appcache/appcache_request_handler.cc
|
| index 8db5e59d2af5dd2613339268bc1ae17722559c0a..6956cfb9041f86de781233d0ff3db41f72ee5cc5 100644
|
| --- a/content/browser/appcache/appcache_request_handler.cc
|
| +++ b/content/browser/appcache/appcache_request_handler.cc
|
| @@ -315,6 +315,13 @@ void AppCacheRequestHandler::DeliverNetworkResponse() {
|
| DCHECK(job_.get() && job_->IsWaiting());
|
| DCHECK_EQ(kAppCacheNoCacheId, cache_id_);
|
| DCHECK(manifest_url_.is_empty());
|
| + if (IsMainResourceType(resource_type_) &&
|
| + found_fallback_entry_.has_response_id() &&
|
| + base::FeatureList::IsEnabled(features::kNetworkService)) {
|
| + job_->AsURLLoaderJob()->set_main_resource_fallback_handler(
|
| + base::Bind(&AppCacheRequestHandler::MaybeGetFallbackForResponse,
|
| + base::Unretained(this)));
|
| + }
|
| job_->DeliverNetworkResponse();
|
| }
|
|
|
| @@ -354,8 +361,10 @@ std::unique_ptr<AppCacheJob> AppCacheRequestHandler::CreateJob(
|
|
|
| std::unique_ptr<AppCacheJob> AppCacheRequestHandler::MaybeCreateJobForFallback(
|
| net::NetworkDelegate* network_delegate) {
|
| - if (!base::FeatureList::IsEnabled(features::kNetworkService))
|
| + if (!base::FeatureList::IsEnabled(features::kNetworkService) ||
|
| + IsMainResourceType(resource_type_)) {
|
| return CreateJob(network_delegate);
|
| + }
|
| // In network service land, the job initiates a fallback request. We reuse
|
| // the existing job to deliver the fallback response.
|
| DCHECK(job_.get());
|
| @@ -575,13 +584,17 @@ void AppCacheRequestHandler::MaybeCreateLoader(
|
| LoaderCallback callback) {
|
| // MaybeLoadMainResource will invoke navigation_request_job's methods
|
| // asynchronously via AppCacheStorage::Delegate.
|
| - navigation_request_job_ = MaybeLoadMainResource(nullptr);
|
| - if (!navigation_request_job_.get()) {
|
| - std::move(callback).Run(StartLoaderCallback());
|
| + std::unique_ptr<AppCacheJob> navigation_request_job =
|
| + MaybeLoadMainResource(nullptr);
|
| + if (!navigation_request_job.get()) {
|
| + std::move(callback).Run(StartLoaderCallback(), ResponseFallback());
|
| return;
|
| }
|
| - navigation_request_job_->AsURLLoaderJob()->set_main_resource_loader_callback(
|
| - std::move(callback));
|
| + // The AppCacheJob for the navigation request will get destroyed when the
|
| + // client connection is dropped.
|
| + navigation_request_job.release()
|
| + ->AsURLLoaderJob()
|
| + ->set_main_resource_loader_callback(std::move(callback));
|
| }
|
|
|
| mojom::URLLoaderFactoryPtr
|
| @@ -595,4 +608,19 @@ AppCacheRequestHandler::MaybeCreateSubresourceFactory() {
|
| return factory_ptr;
|
| }
|
|
|
| +bool AppCacheRequestHandler::MaybeGetFallbackForResponse(
|
| + const ResourceResponseHead& response,
|
| + mojom::URLLoaderClientPtr client,
|
| + mojom::URLLoaderRequest request) {
|
| + request_->AsURLLoaderRequest()->set_response(response);
|
| + // The AppCacheJob will get destroyed when the client connection is
|
| + // dropped.
|
| + AppCacheJob* job = MaybeLoadFallbackForResponse(nullptr);
|
| + if (job) {
|
| + job->AsURLLoaderJob()->BindRequest(std::move(client), std::move(request));
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| } // namespace content
|
|
|