Index: content/browser/appcache/appcache_url_loader_job.cc |
diff --git a/content/browser/appcache/appcache_url_loader_job.cc b/content/browser/appcache/appcache_url_loader_job.cc |
index 1d1932f7aa137d40dff546ab3ca0b9a31351ed4b..8ddd92a49dededf1527e9d065f0f3d539f28e15f 100644 |
--- a/content/browser/appcache/appcache_url_loader_job.cc |
+++ b/content/browser/appcache/appcache_url_loader_job.cc |
@@ -7,6 +7,7 @@ |
#include "base/strings/string_number_conversions.h" |
#include "content/browser/appcache/appcache_histograms.h" |
#include "content/browser/appcache/appcache_subresource_url_factory.h" |
+#include "content/browser/appcache/appcache_url_loader_request.h" |
#include "content/browser/url_loader_factory_getter.h" |
#include "content/common/net_adapters.h" |
#include "content/public/common/resource_type.h" |
@@ -76,13 +77,16 @@ void AppCacheURLLoaderJob::DeliverNetworkResponse() { |
// request. The loader callback is valid only for navigation requests. |
std::move(main_resource_loader_callback_).Run(StartLoaderCallback()); |
} else { |
+ mojom::URLLoaderClientPtr client_ptr; |
+ network_loader_client_binding_.Bind(mojo::MakeRequest(&client_ptr)); |
+ |
default_url_loader_factory_getter_->GetNetworkFactory() |
->get() |
->CreateLoaderAndStart( |
- mojo::MakeRequest(&network_loader_request_), |
+ mojo::MakeRequest(&network_loader_), |
subresource_load_info_->routing_id, |
subresource_load_info_->request_id, subresource_load_info_->options, |
- subresource_load_info_->request, std::move(client_info_), |
+ subresource_load_info_->request, std::move(client_ptr), |
subresource_load_info_->traffic_annotation); |
} |
} |
@@ -91,7 +95,7 @@ void AppCacheURLLoaderJob::DeliverErrorResponse() { |
delivery_type_ = ERROR_DELIVERY; |
// We expect the URLLoaderClient pointer to be valid at this point. |
- DCHECK(client_info_); |
+ DCHECK(client_); |
// AppCacheURLRequestJob uses ERR_FAILED as the error code here. That seems |
// to map to HTTP_INTERNAL_SERVER_ERROR. |
@@ -103,7 +107,7 @@ void AppCacheURLLoaderJob::DeliverErrorResponse() { |
ResourceResponseHead response; |
response.headers = new net::HttpResponseHeaders(status); |
- client_info_->OnReceiveResponse(response, base::nullopt, nullptr); |
+ client_->OnReceiveResponse(response, base::nullopt, nullptr); |
NotifyCompleted(net::ERR_FAILED); |
@@ -120,14 +124,90 @@ AppCacheURLLoaderJob* AppCacheURLLoaderJob::AsURLLoaderJob() { |
} |
void AppCacheURLLoaderJob::FollowRedirect() { |
- if (network_loader_request_) |
- network_loader_request_->FollowRedirect(); |
+ if (network_loader_) |
+ network_loader_->FollowRedirect(); |
} |
void AppCacheURLLoaderJob::SetPriority(net::RequestPriority priority, |
int32_t intra_priority_value) { |
- if (network_loader_request_) |
- network_loader_request_->SetPriority(priority, intra_priority_value); |
+ if (network_loader_) |
+ network_loader_->SetPriority(priority, intra_priority_value); |
+} |
+ |
+void AppCacheURLLoaderJob::OnReceiveResponse( |
+ const ResourceResponseHead& response_head, |
+ const base::Optional<net::SSLInfo>& ssl_info, |
+ mojom::DownloadedTempFilePtr downloaded_file) { |
+ appcache_request_->set_response(response_head); |
+ // The MaybeLoadFallbackForResponse() call below can pass a fallback |
+ // response to us. Reset the delivery_type_ to ensure that we can |
+ // receive it |
+ delivery_type_ = AWAITING_DELIVERY_ORDERS; |
+ if (!sub_resource_handler_->MaybeLoadFallbackForResponse(nullptr)) { |
+ client_->OnReceiveResponse(response_head, ssl_info, |
+ std::move(downloaded_file)); |
+ } else { |
+ // Disconnect from the network loader as we are delivering a fallback |
+ // response to the client. |
+ DisconnectFromNetworkLoader(); |
+ } |
+} |
+ |
+void AppCacheURLLoaderJob::OnReceiveRedirect( |
+ const net::RedirectInfo& redirect_info, |
+ const ResourceResponseHead& response_head) { |
+ appcache_request_->set_response(response_head); |
+ // The MaybeLoadFallbackForRedirect() call below can pass a fallback |
+ // response to us. Reset the delivery_type_ to ensure that we can |
+ // receive it |
+ delivery_type_ = AWAITING_DELIVERY_ORDERS; |
+ if (!sub_resource_handler_->MaybeLoadFallbackForRedirect( |
+ nullptr, redirect_info.new_url)) { |
+ client_->OnReceiveRedirect(redirect_info, response_head); |
+ } else { |
+ // Disconnect from the network loader as we are delivering a fallback |
+ // response to the client. |
+ DisconnectFromNetworkLoader(); |
+ } |
+} |
+ |
+void AppCacheURLLoaderJob::OnDataDownloaded(int64_t data_len, |
+ int64_t encoded_data_len) { |
+ client_->OnDataDownloaded(data_len, encoded_data_len); |
+} |
+ |
+void AppCacheURLLoaderJob::OnUploadProgress( |
+ int64_t current_position, |
+ int64_t total_size, |
+ OnUploadProgressCallback ack_callback) { |
+ client_->OnUploadProgress(current_position, total_size, |
+ std::move(ack_callback)); |
+} |
+ |
+void AppCacheURLLoaderJob::OnReceiveCachedMetadata( |
+ const std::vector<uint8_t>& data) { |
+ client_->OnReceiveCachedMetadata(data); |
+} |
+ |
+void AppCacheURLLoaderJob::OnTransferSizeUpdated(int32_t transfer_size_diff) { |
+ client_->OnTransferSizeUpdated(transfer_size_diff); |
+} |
+ |
+void AppCacheURLLoaderJob::OnStartLoadingResponseBody( |
+ mojo::ScopedDataPipeConsumerHandle body) { |
+ client_->OnStartLoadingResponseBody(std::move(body)); |
+} |
+ |
+void AppCacheURLLoaderJob::OnComplete( |
+ const ResourceRequestCompletionStatus& status) { |
+ delivery_type_ = AWAITING_DELIVERY_ORDERS; |
+ if (!sub_resource_handler_->MaybeLoadFallbackForResponse(nullptr)) { |
+ client_->OnComplete(status); |
+ } else { |
+ // Disconnect from the network loader as we are delivering a fallback |
+ // response to the client. |
+ DisconnectFromNetworkLoader(); |
+ } |
} |
void AppCacheURLLoaderJob::SetSubresourceLoadInfo( |
@@ -140,7 +220,7 @@ void AppCacheURLLoaderJob::SetSubresourceLoadInfo( |
associated_binding_->set_connection_error_handler(base::Bind( |
&AppCacheURLLoaderJob::OnConnectionError, StaticAsWeakPtr(this))); |
- client_info_ = std::move(subresource_load_info_->client); |
+ client_ = std::move(subresource_load_info_->client); |
default_url_loader_factory_getter_ = default_url_loader; |
} |
@@ -152,15 +232,17 @@ void AppCacheURLLoaderJob::Start(mojom::URLLoaderRequest request, |
binding_.set_connection_error_handler(base::Bind( |
&AppCacheURLLoaderJob::OnConnectionError, StaticAsWeakPtr(this))); |
- client_info_ = std::move(client); |
+ client_ = std::move(client); |
// Send the cached AppCacheResponse if any. |
if (info_.get()) |
SendResponseInfo(); |
} |
-AppCacheURLLoaderJob::AppCacheURLLoaderJob(const ResourceRequest& request, |
- AppCacheStorage* storage) |
+AppCacheURLLoaderJob::AppCacheURLLoaderJob( |
+ const ResourceRequest& request, |
+ AppCacheURLLoaderRequest* appcache_request, |
+ AppCacheStorage* storage) |
: request_(request), |
storage_(storage->GetWeakPtr()), |
start_time_tick_(base::TimeTicks::Now()), |
@@ -168,7 +250,9 @@ AppCacheURLLoaderJob::AppCacheURLLoaderJob(const ResourceRequest& request, |
is_fallback_(false), |
binding_(this), |
writable_handle_watcher_(FROM_HERE, |
- mojo::SimpleWatcher::ArmingPolicy::MANUAL) {} |
+ mojo::SimpleWatcher::ArmingPolicy::MANUAL), |
+ network_loader_client_binding_(this), |
+ appcache_request_(appcache_request) {} |
void AppCacheURLLoaderJob::OnResponseInfoLoaded( |
AppCacheResponseInfo* response_info, |
@@ -206,7 +290,7 @@ void AppCacheURLLoaderJob::OnResponseInfoLoaded( |
base::Bind(&AppCacheURLLoaderJob::OnResponseBodyStreamReady, |
StaticAsWeakPtr(this))); |
- if (client_info_) |
+ if (client_) |
SendResponseInfo(); |
ReadMore(); |
@@ -260,7 +344,7 @@ void AppCacheURLLoaderJob::OnConnectionError() { |
} |
void AppCacheURLLoaderJob::SendResponseInfo() { |
- DCHECK(client_info_); |
+ DCHECK(client_); |
// If this is null it means the response information was sent to the client. |
if (!data_pipe_.consumer_handle.is_valid()) |
return; |
@@ -293,11 +377,12 @@ void AppCacheURLLoaderJob::SendResponseInfo() { |
response_head.load_timing = load_timing_info_; |
- client_info_->OnReceiveResponse(response_head, http_info->ssl_info, |
- mojom::DownloadedTempFilePtr()); |
+ appcache_request_->set_response(response_head); |
- client_info_->OnStartLoadingResponseBody( |
- std::move(data_pipe_.consumer_handle)); |
+ client_->OnReceiveResponse(response_head, http_info->ssl_info, |
+ mojom::DownloadedTempFilePtr()); |
+ |
+ client_->OnStartLoadingResponseBody(std::move(data_pipe_.consumer_handle)); |
} |
void AppCacheURLLoaderJob::ReadMore() { |
@@ -363,7 +448,14 @@ void AppCacheURLLoaderJob::NotifyCompleted(int error_code) { |
request_complete_data.decoded_body_length = |
request_complete_data.encoded_body_length; |
} |
- client_info_->OnComplete(request_complete_data); |
+ client_->OnComplete(request_complete_data); |
+} |
+ |
+void AppCacheURLLoaderJob::DisconnectFromNetworkLoader() { |
+ // Close the pipe to the network loader as we are delivering a fallback |
+ // response to the client. |
+ network_loader_client_binding_.Close(); |
+ network_loader_ = nullptr; |
} |
} // namespace content |