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

Side by Side Diff: content/browser/appcache/appcache_request_handler.cc

Issue 2982363002: Add support for fallback content for the frame. This includes main and subframes. (Closed)
Patch Set: Address review comments. Add the fallback function as a parameter to LoaderCallback Created 3 years, 4 months 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 (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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698