Chromium Code Reviews| Index: content/browser/loader/mojo_async_resource_handler.cc |
| diff --git a/content/browser/loader/mojo_async_resource_handler.cc b/content/browser/loader/mojo_async_resource_handler.cc |
| index 8792cd59f8cbce7db2ba30b73037942fb993b52a..c17d592d98633492c4bed8594832b7e0504e37c3 100644 |
| --- a/content/browser/loader/mojo_async_resource_handler.cc |
| +++ b/content/browser/loader/mojo_async_resource_handler.cc |
| @@ -4,13 +4,15 @@ |
| #include "content/browser/loader/mojo_async_resource_handler.h" |
| +#include <algorithm> |
| #include <utility> |
| #include <vector> |
| +#include "base/bind.h" |
| #include "base/command_line.h" |
| -#include "base/containers/hash_tables.h" |
| #include "base/logging.h" |
| #include "base/macros.h" |
| +#include "base/memory/ptr_util.h" |
| #include "base/strings/string_number_conversions.h" |
| #include "base/time/time.h" |
| #include "content/browser/loader/downloaded_temp_file_impl.h" |
| @@ -18,6 +20,7 @@ |
| #include "content/browser/loader/resource_controller.h" |
| #include "content/browser/loader/resource_dispatcher_host_impl.h" |
| #include "content/browser/loader/resource_request_info_impl.h" |
| +#include "content/browser/loader/upload_progress_tracker.h" |
| #include "content/common/resource_request_completion_status.h" |
| #include "content/public/browser/global_request_id.h" |
| #include "content/public/browser/resource_dispatcher_host_delegate.h" |
| @@ -25,7 +28,6 @@ |
| #include "mojo/public/c/system/data_pipe.h" |
| #include "mojo/public/cpp/bindings/message.h" |
| #include "net/base/io_buffer.h" |
| -#include "net/base/load_flags.h" |
| #include "net/base/mime_sniffer.h" |
| #include "net/url_request/redirect_info.h" |
| @@ -156,8 +158,12 @@ bool MojoAsyncResourceHandler::OnRequestRedirected( |
| bool MojoAsyncResourceHandler::OnResponseStarted(ResourceResponse* response, |
| bool* defer) { |
| - const ResourceRequestInfoImpl* info = GetRequestInfo(); |
| + if (upload_progress_tracker_) { |
| + upload_progress_tracker_->OnUploadCompleted(); |
| + upload_progress_tracker_ = nullptr; |
| + } |
| + const ResourceRequestInfoImpl* info = GetRequestInfo(); |
| if (rdh_->delegate()) { |
| rdh_->delegate()->OnResponseStarted(request(), info->GetContext(), |
| response); |
| @@ -193,6 +199,14 @@ bool MojoAsyncResourceHandler::OnResponseStarted(ResourceResponse* response, |
| } |
| bool MojoAsyncResourceHandler::OnWillStart(const GURL& url, bool* defer) { |
| + if (GetRequestInfo()->is_upload_progress_enabled() && |
| + request()->has_upload()) { |
| + upload_progress_tracker_ = CreateUploadProgressTracker( |
| + FROM_HERE, |
|
mmenke
2017/01/19 16:06:49
nit: Pre-existing issue, but should include locat
tzik
2017/01/20 04:42:03
Done.
|
| + base::BindRepeating(&MojoAsyncResourceHandler::SendUploadProgress, |
| + base::Unretained(this))); |
| + } |
| + |
| return true; |
| } |
| @@ -345,6 +359,11 @@ net::IOBufferWithSize* MojoAsyncResourceHandler::GetResponseMetadata( |
| void MojoAsyncResourceHandler::OnResponseCompleted( |
| const net::URLRequestStatus& status, |
| bool* defer) { |
| + if (upload_progress_tracker_) { |
| + upload_progress_tracker_->OnUploadCompleted(); |
| + upload_progress_tracker_ = nullptr; |
| + } |
| + |
| shared_writer_ = nullptr; |
| buffer_ = nullptr; |
| handle_watcher_.Cancel(); |
| @@ -486,6 +505,14 @@ void MojoAsyncResourceHandler::ReportBadMessage(const std::string& error) { |
| mojo::ReportBadMessage(error); |
| } |
| +std::unique_ptr<UploadProgressTracker> |
| +MojoAsyncResourceHandler::CreateUploadProgressTracker( |
| + const tracked_objects::Location& from_here, |
| + UploadProgressTracker::UploadProgressReportCallback callback) { |
| + return base::MakeUnique<UploadProgressTracker>(from_here, std::move(callback), |
| + request()); |
| +} |
| + |
| void MojoAsyncResourceHandler::OnTransfer( |
| mojom::URLLoaderAssociatedRequest mojo_request, |
| mojom::URLLoaderClientAssociatedPtr url_loader_client) { |
| @@ -496,4 +523,17 @@ void MojoAsyncResourceHandler::OnTransfer( |
| url_loader_client_ = std::move(url_loader_client); |
| } |
| +void MojoAsyncResourceHandler::SendUploadProgress( |
| + const net::UploadProgress& progress) { |
| + url_loader_client_->OnUploadProgress( |
| + progress.position(), progress.size(), |
| + base::Bind(&MojoAsyncResourceHandler::OnUploadProgressACK, |
| + weak_factory_.GetWeakPtr())); |
| +} |
| + |
| +void MojoAsyncResourceHandler::OnUploadProgressACK() { |
| + if (upload_progress_tracker_) |
| + upload_progress_tracker_->OnAckReceived(); |
| +} |
| + |
| } // namespace content |