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

Unified Diff: content/browser/appcache/appcache_url_loader_job.cc

Issue 2974733002: Add support for subresource request fallback in AppCache for the network service.. (Closed)
Patch Set: Format changes Created 3 years, 5 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 side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « content/browser/appcache/appcache_url_loader_job.h ('k') | content/browser/appcache/appcache_url_loader_request.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698