Index: content/browser/appcache/appcache_subresource_url_factory.cc |
diff --git a/content/browser/appcache/appcache_subresource_url_factory.cc b/content/browser/appcache/appcache_subresource_url_factory.cc |
index e971ba63f3a7d31ef6fc0540bd5970b03182b361..4b6f9fd36b56372749525dd7296dfdc9fb592209 100644 |
--- a/content/browser/appcache/appcache_subresource_url_factory.cc |
+++ b/content/browser/appcache/appcache_subresource_url_factory.cc |
@@ -6,6 +6,7 @@ |
#include "base/bind.h" |
#include "base/logging.h" |
+#include "content/browser/appcache/appcache_host.h" |
#include "content/browser/appcache/appcache_request_handler.h" |
#include "content/browser/appcache/appcache_url_loader_job.h" |
#include "content/browser/appcache/appcache_url_loader_request.h" |
@@ -23,9 +24,11 @@ namespace content { |
// Implements the URLLoaderFactory mojom for AppCache requests. |
AppCacheSubresourceURLFactory::AppCacheSubresourceURLFactory( |
mojom::URLLoaderFactoryRequest request, |
- URLLoaderFactoryGetter* default_url_loader_factory_getter) |
+ URLLoaderFactoryGetter* default_url_loader_factory_getter, |
+ base::WeakPtr<AppCacheHost> host) |
: binding_(this, std::move(request)), |
- default_url_loader_factory_getter_(default_url_loader_factory_getter) { |
+ default_url_loader_factory_getter_(default_url_loader_factory_getter), |
+ appcache_host_(host) { |
binding_.set_connection_error_handler( |
base::Bind(&AppCacheSubresourceURLFactory::OnConnectionError, |
base::Unretained(this))); |
@@ -34,17 +37,17 @@ AppCacheSubresourceURLFactory::AppCacheSubresourceURLFactory( |
AppCacheSubresourceURLFactory::~AppCacheSubresourceURLFactory() {} |
// static |
-mojom::URLLoaderFactoryPtr |
+AppCacheSubresourceURLFactory* |
AppCacheSubresourceURLFactory::CreateURLLoaderFactory( |
- URLLoaderFactoryGetter* default_url_loader_factory_getter) { |
- mojom::URLLoaderFactoryPtr loader_factory; |
- mojom::URLLoaderFactoryRequest request = mojo::MakeRequest(&loader_factory); |
+ URLLoaderFactoryGetter* default_url_loader_factory_getter, |
+ base::WeakPtr<AppCacheHost> host, |
+ mojom::URLLoaderFactoryPtr* loader_factory) { |
+ mojom::URLLoaderFactoryRequest request = mojo::MakeRequest(loader_factory); |
// This instance will get deleted when the client drops the connection. |
// Please see OnConnectionError() for details. |
- new AppCacheSubresourceURLFactory(std::move(request), |
- default_url_loader_factory_getter); |
- return loader_factory; |
+ return new AppCacheSubresourceURLFactory( |
+ std::move(request), default_url_loader_factory_getter, host); |
} |
void AppCacheSubresourceURLFactory::CreateLoaderAndStart( |
@@ -57,11 +60,42 @@ void AppCacheSubresourceURLFactory::CreateLoaderAndStart( |
const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
DLOG(WARNING) << "Received request for loading : " << request.url.spec(); |
- default_url_loader_factory_getter_->GetNetworkFactory() |
- ->get() |
- ->CreateLoaderAndStart(mojom::URLLoaderAssociatedRequest(), routing_id, |
- request_id, options, request, std::move(client), |
- traffic_annotation); |
+ |
+ // If the host is invalid, it means that the renderer has probably died. |
+ // (Frame has navigated elsewhere?) |
+ if (!appcache_host_.get()) |
+ return; |
+ |
+ std::unique_ptr<AppCacheRequestHandler> handler = |
+ appcache_host_->CreateRequestHandler( |
+ AppCacheURLLoaderRequest::Create(request), request.resource_type, |
+ request.should_reset_appcache); |
+ if (!handler) { |
+ ResourceRequestCompletionStatus request_result; |
+ request_result.error_code = net::ERR_FAILED; |
+ client->OnComplete(request_result); |
+ return; |
+ } |
+ |
+ handler->set_network_url_loader_factory_getter( |
+ default_url_loader_factory_getter_.get()); |
+ |
+ std::unique_ptr<SubresourceLoadInfo> load_info(new SubresourceLoadInfo()); |
+ load_info->url_loader_request = std::move(url_loader_request); |
+ load_info->routing_id = routing_id; |
+ load_info->request_id = request_id; |
+ load_info->options = options; |
+ load_info->request = request; |
+ load_info->client = std::move(client); |
+ load_info->traffic_annotation = traffic_annotation; |
+ |
+ handler->SetSubresourceRequestLoadInfo(std::move(load_info)); |
+ |
+ AppCacheJob* job = handler->MaybeLoadResource(nullptr); |
+ if (job) { |
+ // The handler is owned by the job. |
+ job->AsURLLoaderJob()->set_request_handler(std::move(handler)); |
+ } |
} |
void AppCacheSubresourceURLFactory::SyncLoad(int32_t routing_id, |