| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/loader/test_resource_handler.h" | 5 #include "content/browser/loader/test_resource_handler.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
| 9 #include "content/browser/loader/resource_controller.h" | 9 #include "content/browser/loader/resource_controller.h" |
| 10 #include "content/public/common/resource_response.h" | 10 #include "content/public/common/resource_response.h" |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 if (defer_on_will_start_) { | 134 if (defer_on_will_start_) { |
| 135 defer_on_will_start_ = false; | 135 defer_on_will_start_ = false; |
| 136 HoldController(std::move(controller)); | 136 HoldController(std::move(controller)); |
| 137 deferred_run_loop_->Quit(); | 137 deferred_run_loop_->Quit(); |
| 138 return; | 138 return; |
| 139 } | 139 } |
| 140 | 140 |
| 141 controller->Resume(); | 141 controller->Resume(); |
| 142 } | 142 } |
| 143 | 143 |
| 144 bool TestResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, | 144 void TestResourceHandler::OnWillRead( |
| 145 int* buf_size) { | 145 scoped_refptr<net::IOBuffer>* buf, |
| 146 int* buf_size, |
| 147 std::unique_ptr<ResourceController> controller) { |
| 146 EXPECT_FALSE(canceled_); | 148 EXPECT_FALSE(canceled_); |
| 147 EXPECT_FALSE(expect_on_data_downloaded_); | 149 EXPECT_FALSE(expect_on_data_downloaded_); |
| 148 EXPECT_EQ(0, on_response_completed_called_); | 150 EXPECT_EQ(0, on_response_completed_called_); |
| 149 // Only create a ScopedCallDepthTracker if not called re-entrantly, as | 151 // Only create a ScopedCallDepthTracker if not called re-entrantly, as |
| 150 // OnWillRead may be called synchronously in response to a Resume(), but | 152 // OnWillRead may be called synchronously in response to a Resume(), but |
| 151 // nothing may be called synchronously in response to the OnWillRead call. | 153 // nothing may be called synchronously in response to the OnWillRead call. |
| 152 std::unique_ptr<ScopedCallDepthTracker> call_depth_tracker; | 154 std::unique_ptr<ScopedCallDepthTracker> call_depth_tracker; |
| 153 if (call_depth_ == 0) | 155 if (call_depth_ == 0) |
| 154 call_depth_tracker = base::MakeUnique<ScopedCallDepthTracker>(&call_depth_); | 156 call_depth_tracker = base::MakeUnique<ScopedCallDepthTracker>(&call_depth_); |
| 155 | 157 |
| 156 ++on_will_read_called_; | 158 ++on_will_read_called_; |
| 157 | 159 |
| 158 if (!on_will_read_result_) { | 160 if (!on_will_read_result_) { |
| 159 canceled_ = true; | 161 canceled_ = true; |
| 160 } else { | 162 controller->Cancel(); |
| 161 *buf = buffer_; | 163 return; |
| 162 *buf_size = buffer_size_; | |
| 163 memset(buffer_->data(), '\0', buffer_size_); | |
| 164 } | 164 } |
| 165 | 165 |
| 166 return on_will_read_result_; | 166 if (defer_on_will_read_) { |
| 167 parent_read_buffer_ = buf; |
| 168 parent_read_buffer_size_ = buf_size; |
| 169 defer_on_will_read_ = false; |
| 170 HoldController(std::move(controller)); |
| 171 deferred_run_loop_->Quit(); |
| 172 return; |
| 173 } |
| 174 |
| 175 *buf = buffer_; |
| 176 *buf_size = buffer_size_; |
| 177 controller->Resume(); |
| 167 } | 178 } |
| 168 | 179 |
| 169 void TestResourceHandler::OnReadCompleted( | 180 void TestResourceHandler::OnReadCompleted( |
| 170 int bytes_read, | 181 int bytes_read, |
| 171 std::unique_ptr<ResourceController> controller) { | 182 std::unique_ptr<ResourceController> controller) { |
| 172 EXPECT_FALSE(canceled_); | 183 EXPECT_FALSE(canceled_); |
| 173 EXPECT_FALSE(expect_on_data_downloaded_); | 184 EXPECT_FALSE(expect_on_data_downloaded_); |
| 174 EXPECT_EQ(1, on_will_start_called_); | 185 EXPECT_EQ(1, on_will_start_called_); |
| 175 EXPECT_EQ(1, on_response_started_called_); | 186 EXPECT_EQ(1, on_response_started_called_); |
| 176 EXPECT_EQ(0, on_response_completed_called_); | 187 EXPECT_EQ(0, on_response_completed_called_); |
| 177 EXPECT_EQ(0, on_read_eof_); | 188 EXPECT_EQ(0, on_read_eof_called_); |
| 178 ScopedCallDepthTracker call_depth_tracker(&call_depth_); | 189 ScopedCallDepthTracker call_depth_tracker(&call_depth_); |
| 179 | 190 |
| 180 ++on_read_completed_called_; | 191 ++on_read_completed_called_; |
| 181 if (bytes_read == 0) | 192 if (bytes_read == 0) |
| 182 ++on_read_eof_; | 193 ++on_read_eof_called_; |
| 183 | 194 |
| 184 EXPECT_LE(static_cast<size_t>(bytes_read), buffer_size_); | 195 EXPECT_LE(static_cast<size_t>(bytes_read), buffer_size_); |
| 185 if (body_ptr_) | 196 if (body_ptr_) |
| 186 body_ptr_->append(buffer_->data(), bytes_read); | 197 body_ptr_->append(buffer_->data(), bytes_read); |
| 187 body_.append(buffer_->data(), bytes_read); | 198 body_.append(buffer_->data(), bytes_read); |
| 188 | 199 |
| 189 if (!on_read_completed_result_ || (!on_read_eof_result_ && bytes_read == 0)) { | 200 if (!on_read_completed_result_ || (!on_read_eof_result_ && bytes_read == 0)) { |
| 190 canceled_ = true; | 201 canceled_ = true; |
| 191 controller->Cancel(); | 202 controller->Cancel(); |
| 192 return; | 203 return; |
| 193 } | 204 } |
| 194 | 205 |
| 195 if (defer_on_read_completed_ || (bytes_read == 0 && defer_on_read_eof_)) { | 206 if (defer_on_read_completed_ || (bytes_read == 0 && defer_on_read_eof_)) { |
| 196 defer_on_read_completed_ = false; | 207 defer_on_read_completed_ = false; |
| 197 HoldController(std::move(controller)); | 208 HoldController(std::move(controller)); |
| 198 deferred_run_loop_->Quit(); | 209 deferred_run_loop_->Quit(); |
| 199 return; | 210 return; |
| 200 } | 211 } |
| 201 | 212 |
| 202 controller->Resume(); | 213 controller->Resume(); |
| 203 } | 214 } |
| 204 | 215 |
| 205 void TestResourceHandler::OnResponseCompleted( | 216 void TestResourceHandler::OnResponseCompleted( |
| 206 const net::URLRequestStatus& status, | 217 const net::URLRequestStatus& status, |
| 207 std::unique_ptr<ResourceController> controller) { | 218 std::unique_ptr<ResourceController> controller) { |
| 208 ScopedCallDepthTracker call_depth_tracker(&call_depth_); | 219 ScopedCallDepthTracker call_depth_tracker(&call_depth_); |
| 209 | 220 |
| 221 // These may be non-NULL if there was an out-of-band cancel. |
| 222 parent_read_buffer_ = nullptr; |
| 223 parent_read_buffer_size_ = nullptr; |
| 224 |
| 210 EXPECT_EQ(0, on_response_completed_called_); | 225 EXPECT_EQ(0, on_response_completed_called_); |
| 211 if (status.is_success() && !expect_on_data_downloaded_ && expect_eof_read_) | 226 if (status.is_success() && !expect_on_data_downloaded_ && expect_eof_read_) |
| 212 EXPECT_EQ(1, on_read_eof_); | 227 EXPECT_EQ(1, on_read_eof_called_); |
| 213 | 228 |
| 214 ++on_response_completed_called_; | 229 ++on_response_completed_called_; |
| 215 | 230 |
| 216 if (request_status_ptr_) | 231 if (request_status_ptr_) |
| 217 *request_status_ptr_ = status; | 232 *request_status_ptr_ = status; |
| 218 final_status_ = status; | 233 final_status_ = status; |
| 219 | 234 |
| 220 // Consider response completed. Even if deferring, the TestResourceHandler | 235 // Consider response completed. Even if deferring, the TestResourceHandler |
| 221 // won't be called again. | 236 // won't be called again. |
| 222 response_complete_run_loop_.Quit(); | 237 response_complete_run_loop_.Quit(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 235 EXPECT_TRUE(expect_on_data_downloaded_); | 250 EXPECT_TRUE(expect_on_data_downloaded_); |
| 236 EXPECT_EQ(1, on_will_start_called_); | 251 EXPECT_EQ(1, on_will_start_called_); |
| 237 EXPECT_EQ(1, on_response_started_called_); | 252 EXPECT_EQ(1, on_response_started_called_); |
| 238 EXPECT_EQ(0, on_response_completed_called_); | 253 EXPECT_EQ(0, on_response_completed_called_); |
| 239 | 254 |
| 240 total_bytes_downloaded_ += bytes_downloaded; | 255 total_bytes_downloaded_ += bytes_downloaded; |
| 241 } | 256 } |
| 242 | 257 |
| 243 void TestResourceHandler::Resume() { | 258 void TestResourceHandler::Resume() { |
| 244 ScopedCallDepthTracker call_depth_tracker(&call_depth_); | 259 ScopedCallDepthTracker call_depth_tracker(&call_depth_); |
| 260 |
| 261 if (parent_read_buffer_) { |
| 262 *parent_read_buffer_ = buffer_; |
| 263 *parent_read_buffer_size_ = buffer_size_; |
| 264 parent_read_buffer_ = nullptr; |
| 265 parent_read_buffer_size_ = nullptr; |
| 266 memset(buffer_->data(), '\0', buffer_size_); |
| 267 } |
| 268 |
| 245 ResourceHandler::Resume(); | 269 ResourceHandler::Resume(); |
| 246 } | 270 } |
| 247 | 271 |
| 248 void TestResourceHandler::CancelWithError(net::Error net_error) { | 272 void TestResourceHandler::CancelWithError(net::Error net_error) { |
| 249 ScopedCallDepthTracker call_depth_tracker(&call_depth_); | 273 ScopedCallDepthTracker call_depth_tracker(&call_depth_); |
| 250 canceled_ = true; | 274 canceled_ = true; |
| 275 |
| 276 // Don't want to populate these after a cancel. |
| 277 parent_read_buffer_ = nullptr; |
| 278 parent_read_buffer_size_ = nullptr; |
| 279 |
| 251 ResourceHandler::CancelWithError(net_error); | 280 ResourceHandler::CancelWithError(net_error); |
| 252 } | 281 } |
| 253 | 282 |
| 254 void TestResourceHandler::SetBufferSize(int buffer_size) { | 283 void TestResourceHandler::SetBufferSize(int buffer_size) { |
| 255 buffer_ = new net::IOBuffer(buffer_size); | 284 buffer_ = new net::IOBuffer(buffer_size); |
| 256 buffer_size_ = buffer_size; | 285 buffer_size_ = buffer_size; |
| 257 memset(buffer_->data(), '\0', buffer_size); | 286 memset(buffer_->data(), '\0', buffer_size); |
| 258 } | 287 } |
| 259 | 288 |
| 260 void TestResourceHandler::WaitUntilDeferred() { | 289 void TestResourceHandler::WaitUntilDeferred() { |
| 261 deferred_run_loop_->Run(); | 290 deferred_run_loop_->Run(); |
| 262 deferred_run_loop_.reset(new base::RunLoop()); | 291 deferred_run_loop_.reset(new base::RunLoop()); |
| 263 } | 292 } |
| 264 | 293 |
| 265 void TestResourceHandler::WaitUntilResponseComplete() { | 294 void TestResourceHandler::WaitUntilResponseComplete() { |
| 266 response_complete_run_loop_.Run(); | 295 response_complete_run_loop_.Run(); |
| 267 } | 296 } |
| 268 | 297 |
| 269 base::WeakPtr<TestResourceHandler> TestResourceHandler::GetWeakPtr() { | 298 base::WeakPtr<TestResourceHandler> TestResourceHandler::GetWeakPtr() { |
| 270 return weak_ptr_factory_.GetWeakPtr(); | 299 return weak_ptr_factory_.GetWeakPtr(); |
| 271 } | 300 } |
| 272 | 301 |
| 273 } // namespace content | 302 } // namespace content |
| OLD | NEW |