Index: content/browser/loader/test_resource_handler.cc |
diff --git a/content/browser/loader/test_resource_handler.cc b/content/browser/loader/test_resource_handler.cc |
index 1f8c97038413306e09933e2646073cef2f241367..4bcf6e296a2bc85ab0c954498753fabdbb5d6ed0 100644 |
--- a/content/browser/loader/test_resource_handler.cc |
+++ b/content/browser/loader/test_resource_handler.cc |
@@ -141,8 +141,10 @@ void TestResourceHandler::OnWillStart( |
controller->Resume(); |
} |
-bool TestResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, |
- int* buf_size) { |
+void TestResourceHandler::OnWillRead( |
+ scoped_refptr<net::IOBuffer>* buf, |
+ int* buf_size, |
+ std::unique_ptr<ResourceController> controller) { |
EXPECT_FALSE(canceled_); |
EXPECT_FALSE(expect_on_data_downloaded_); |
EXPECT_EQ(0, on_response_completed_called_); |
@@ -157,13 +159,22 @@ bool TestResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, |
if (!on_will_read_result_) { |
canceled_ = true; |
- } else { |
- *buf = buffer_; |
- *buf_size = buffer_size_; |
- memset(buffer_->data(), '\0', buffer_size_); |
+ controller->Cancel(); |
+ return; |
+ } |
+ |
+ if (defer_on_will_read_) { |
+ parent_read_buffer_ = buf; |
+ parent_read_buffer_size_ = buf_size; |
+ defer_on_will_read_ = false; |
+ HoldController(std::move(controller)); |
+ deferred_run_loop_->Quit(); |
+ return; |
} |
- return on_will_read_result_; |
+ *buf = buffer_; |
+ *buf_size = buffer_size_; |
+ controller->Resume(); |
} |
void TestResourceHandler::OnReadCompleted( |
@@ -174,12 +185,12 @@ void TestResourceHandler::OnReadCompleted( |
EXPECT_EQ(1, on_will_start_called_); |
EXPECT_EQ(1, on_response_started_called_); |
EXPECT_EQ(0, on_response_completed_called_); |
- EXPECT_EQ(0, on_read_eof_); |
+ EXPECT_EQ(0, on_read_eof_called_); |
ScopedCallDepthTracker call_depth_tracker(&call_depth_); |
++on_read_completed_called_; |
if (bytes_read == 0) |
- ++on_read_eof_; |
+ ++on_read_eof_called_; |
EXPECT_LE(static_cast<size_t>(bytes_read), buffer_size_); |
if (body_ptr_) |
@@ -207,9 +218,13 @@ void TestResourceHandler::OnResponseCompleted( |
std::unique_ptr<ResourceController> controller) { |
ScopedCallDepthTracker call_depth_tracker(&call_depth_); |
+ // These may be non-NULL if there was an out-of-band cancel. |
+ parent_read_buffer_ = nullptr; |
+ parent_read_buffer_size_ = nullptr; |
+ |
EXPECT_EQ(0, on_response_completed_called_); |
if (status.is_success() && !expect_on_data_downloaded_ && expect_eof_read_) |
- EXPECT_EQ(1, on_read_eof_); |
+ EXPECT_EQ(1, on_read_eof_called_); |
++on_response_completed_called_; |
@@ -242,12 +257,26 @@ void TestResourceHandler::OnDataDownloaded(int bytes_downloaded) { |
void TestResourceHandler::Resume() { |
ScopedCallDepthTracker call_depth_tracker(&call_depth_); |
+ |
+ if (parent_read_buffer_) { |
+ *parent_read_buffer_ = buffer_; |
+ *parent_read_buffer_size_ = buffer_size_; |
+ parent_read_buffer_ = nullptr; |
+ parent_read_buffer_size_ = nullptr; |
+ memset(buffer_->data(), '\0', buffer_size_); |
+ } |
+ |
ResourceHandler::Resume(); |
} |
void TestResourceHandler::CancelWithError(net::Error net_error) { |
ScopedCallDepthTracker call_depth_tracker(&call_depth_); |
canceled_ = true; |
+ |
+ // Don't want to populate these after a cancel. |
+ parent_read_buffer_ = nullptr; |
+ parent_read_buffer_size_ = nullptr; |
+ |
ResourceHandler::CancelWithError(net_error); |
} |