| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/appcache/appcache_request_handler.h" | 5 #include "content/browser/appcache/appcache_request_handler.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 DCHECK(job_.get() && job_->IsWaiting()); | 308 DCHECK(job_.get() && job_->IsWaiting()); |
| 309 DCHECK_EQ(kAppCacheNoCacheId, cache_id_); | 309 DCHECK_EQ(kAppCacheNoCacheId, cache_id_); |
| 310 DCHECK(manifest_url_.is_empty()); | 310 DCHECK(manifest_url_.is_empty()); |
| 311 job_->DeliverErrorResponse(); | 311 job_->DeliverErrorResponse(); |
| 312 } | 312 } |
| 313 | 313 |
| 314 void AppCacheRequestHandler::DeliverNetworkResponse() { | 314 void AppCacheRequestHandler::DeliverNetworkResponse() { |
| 315 DCHECK(job_.get() && job_->IsWaiting()); | 315 DCHECK(job_.get() && job_->IsWaiting()); |
| 316 DCHECK_EQ(kAppCacheNoCacheId, cache_id_); | 316 DCHECK_EQ(kAppCacheNoCacheId, cache_id_); |
| 317 DCHECK(manifest_url_.is_empty()); | 317 DCHECK(manifest_url_.is_empty()); |
| 318 if (IsMainResourceType(resource_type_) && |
| 319 found_fallback_entry_.has_response_id() && |
| 320 base::FeatureList::IsEnabled(features::kNetworkService)) { |
| 321 job_->AsURLLoaderJob()->set_main_resource_fallback_handler( |
| 322 base::Bind(&AppCacheRequestHandler::MaybeGetFallbackForResponse, |
| 323 base::Unretained(this))); |
| 324 } |
| 318 job_->DeliverNetworkResponse(); | 325 job_->DeliverNetworkResponse(); |
| 319 } | 326 } |
| 320 | 327 |
| 321 void AppCacheRequestHandler::OnPrepareToRestart() { | 328 void AppCacheRequestHandler::OnPrepareToRestart() { |
| 322 DCHECK(job_->IsDeliveringNetworkResponse() || job_->IsCacheEntryNotFound()); | 329 DCHECK(job_->IsDeliveringNetworkResponse() || job_->IsCacheEntryNotFound()); |
| 323 | 330 |
| 324 // Any information about the source of the response is no longer relevant. | 331 // Any information about the source of the response is no longer relevant. |
| 325 cache_id_ = kAppCacheNoCacheId; | 332 cache_id_ = kAppCacheNoCacheId; |
| 326 manifest_url_ = GURL(); | 333 manifest_url_ = GURL(); |
| 327 | 334 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 347 loader_job->SetSubresourceLoadInfo( | 354 loader_job->SetSubresourceLoadInfo( |
| 348 std::move(subresource_load_info_), | 355 std::move(subresource_load_info_), |
| 349 network_url_loader_factory_getter_.get()); | 356 network_url_loader_factory_getter_.get()); |
| 350 } | 357 } |
| 351 | 358 |
| 352 return job; | 359 return job; |
| 353 } | 360 } |
| 354 | 361 |
| 355 std::unique_ptr<AppCacheJob> AppCacheRequestHandler::MaybeCreateJobForFallback( | 362 std::unique_ptr<AppCacheJob> AppCacheRequestHandler::MaybeCreateJobForFallback( |
| 356 net::NetworkDelegate* network_delegate) { | 363 net::NetworkDelegate* network_delegate) { |
| 357 if (!base::FeatureList::IsEnabled(features::kNetworkService)) | 364 if (!base::FeatureList::IsEnabled(features::kNetworkService) || |
| 365 IsMainResourceType(resource_type_)) { |
| 358 return CreateJob(network_delegate); | 366 return CreateJob(network_delegate); |
| 367 } |
| 359 // In network service land, the job initiates a fallback request. We reuse | 368 // In network service land, the job initiates a fallback request. We reuse |
| 360 // the existing job to deliver the fallback response. | 369 // the existing job to deliver the fallback response. |
| 361 DCHECK(job_.get()); | 370 DCHECK(job_.get()); |
| 362 return std::unique_ptr<AppCacheJob>(job_.get()); | 371 return std::unique_ptr<AppCacheJob>(job_.get()); |
| 363 } | 372 } |
| 364 | 373 |
| 365 // Main-resource handling ---------------------------------------------- | 374 // Main-resource handling ---------------------------------------------- |
| 366 | 375 |
| 367 std::unique_ptr<AppCacheJob> AppCacheRequestHandler::MaybeLoadMainResource( | 376 std::unique_ptr<AppCacheJob> AppCacheRequestHandler::MaybeLoadMainResource( |
| 368 net::NetworkDelegate* network_delegate) { | 377 net::NetworkDelegate* network_delegate) { |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 568 | 577 |
| 569 ContinueMaybeLoadSubResource(); | 578 ContinueMaybeLoadSubResource(); |
| 570 } | 579 } |
| 571 | 580 |
| 572 void AppCacheRequestHandler::MaybeCreateLoader( | 581 void AppCacheRequestHandler::MaybeCreateLoader( |
| 573 const ResourceRequest& resource_request, | 582 const ResourceRequest& resource_request, |
| 574 ResourceContext* resource_context, | 583 ResourceContext* resource_context, |
| 575 LoaderCallback callback) { | 584 LoaderCallback callback) { |
| 576 // MaybeLoadMainResource will invoke navigation_request_job's methods | 585 // MaybeLoadMainResource will invoke navigation_request_job's methods |
| 577 // asynchronously via AppCacheStorage::Delegate. | 586 // asynchronously via AppCacheStorage::Delegate. |
| 578 navigation_request_job_ = MaybeLoadMainResource(nullptr); | 587 std::unique_ptr<AppCacheJob> navigation_request_job = |
| 579 if (!navigation_request_job_.get()) { | 588 MaybeLoadMainResource(nullptr); |
| 580 std::move(callback).Run(StartLoaderCallback()); | 589 if (!navigation_request_job.get()) { |
| 590 std::move(callback).Run(StartLoaderCallback(), ResponseFallback()); |
| 581 return; | 591 return; |
| 582 } | 592 } |
| 583 navigation_request_job_->AsURLLoaderJob()->set_main_resource_loader_callback( | 593 // The AppCacheJob for the navigation request will get destroyed when the |
| 584 std::move(callback)); | 594 // client connection is dropped. |
| 595 navigation_request_job.release() |
| 596 ->AsURLLoaderJob() |
| 597 ->set_main_resource_loader_callback(std::move(callback)); |
| 585 } | 598 } |
| 586 | 599 |
| 587 mojom::URLLoaderFactoryPtr | 600 mojom::URLLoaderFactoryPtr |
| 588 AppCacheRequestHandler::MaybeCreateSubresourceFactory() { | 601 AppCacheRequestHandler::MaybeCreateSubresourceFactory() { |
| 589 mojom::URLLoaderFactoryPtr factory_ptr = nullptr; | 602 mojom::URLLoaderFactoryPtr factory_ptr = nullptr; |
| 590 | 603 |
| 591 // The factory is destroyed when the renderer drops the connection. | 604 // The factory is destroyed when the renderer drops the connection. |
| 592 AppCacheSubresourceURLFactory::CreateURLLoaderFactory( | 605 AppCacheSubresourceURLFactory::CreateURLLoaderFactory( |
| 593 network_url_loader_factory_getter_.get(), appcache_host_, &factory_ptr); | 606 network_url_loader_factory_getter_.get(), appcache_host_, &factory_ptr); |
| 594 | 607 |
| 595 return factory_ptr; | 608 return factory_ptr; |
| 596 } | 609 } |
| 597 | 610 |
| 611 bool AppCacheRequestHandler::MaybeGetFallbackForResponse( |
| 612 const ResourceResponseHead& response, |
| 613 mojom::URLLoaderClientPtr client, |
| 614 mojom::URLLoaderRequest request) { |
| 615 request_->AsURLLoaderRequest()->set_response(response); |
| 616 // The AppCacheJob will get destroyed when the client connection is |
| 617 // dropped. |
| 618 AppCacheJob* job = MaybeLoadFallbackForResponse(nullptr); |
| 619 if (job) { |
| 620 job->AsURLLoaderJob()->BindRequest(std::move(client), std::move(request)); |
| 621 return true; |
| 622 } |
| 623 return false; |
| 624 } |
| 625 |
| 598 } // namespace content | 626 } // namespace content |
| OLD | NEW |