| 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 75abb83a1c563f4c14d44aa0e84ea234540a5bc2..c2070cdb6b9ddac81f96e656c381eb4382bd423b 100644
|
| --- a/content/browser/loader/mojo_async_resource_handler.cc
|
| +++ b/content/browser/loader/mojo_async_resource_handler.cc
|
| @@ -4,14 +4,16 @@
|
|
|
| #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/location.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"
|
| @@ -19,6 +21,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"
|
| @@ -26,7 +29,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"
|
|
|
| @@ -167,8 +169,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);
|
| @@ -204,6 +210,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,
|
| + base::BindRepeating(&MojoAsyncResourceHandler::SendUploadProgress,
|
| + base::Unretained(this)));
|
| + }
|
| +
|
| return true;
|
| }
|
|
|
| @@ -356,6 +370,14 @@ net::IOBufferWithSize* MojoAsyncResourceHandler::GetResponseMetadata(
|
| void MojoAsyncResourceHandler::OnResponseCompleted(
|
| const net::URLRequestStatus& status,
|
| bool* defer) {
|
| + // Ensure sending the final upload progress message here, since
|
| + // OnResponseCompleted can be called without OnResponseStarted on cancellation
|
| + // or error cases.
|
| + if (upload_progress_tracker_) {
|
| + upload_progress_tracker_->OnUploadCompleted();
|
| + upload_progress_tracker_ = nullptr;
|
| + }
|
| +
|
| shared_writer_ = nullptr;
|
| buffer_ = nullptr;
|
| handle_watcher_.Cancel();
|
| @@ -497,6 +519,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) {
|
| @@ -507,4 +537,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
|
|
|