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 |