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..0a74dc9004e26b7bf722c158fc1a3c97de6af6a2 100644 |
--- a/content/browser/loader/mojo_async_resource_handler.cc |
+++ b/content/browser/loader/mojo_async_resource_handler.cc |
@@ -4,13 +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" |
@@ -18,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" |
@@ -25,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" |
@@ -156,8 +159,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 +200,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; |
} |
@@ -345,6 +360,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; |
dcheng
2017/01/24 10:38:58
This might be a dumb question, but why do we need
tzik
2017/01/24 12:04:59
Yes, we skip it on cancellation and error cases. A
|
+ } |
+ |
shared_writer_ = nullptr; |
buffer_ = nullptr; |
handle_watcher_.Cancel(); |
@@ -486,6 +506,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 +524,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 |