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/mojo_async_resource_handler.h" | 5 #include "content/browser/loader/mojo_async_resource_handler.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 request()->has_upload()) { | 222 request()->has_upload()) { |
223 upload_progress_tracker_ = CreateUploadProgressTracker( | 223 upload_progress_tracker_ = CreateUploadProgressTracker( |
224 FROM_HERE, | 224 FROM_HERE, |
225 base::BindRepeating(&MojoAsyncResourceHandler::SendUploadProgress, | 225 base::BindRepeating(&MojoAsyncResourceHandler::SendUploadProgress, |
226 base::Unretained(this))); | 226 base::Unretained(this))); |
227 } | 227 } |
228 | 228 |
229 controller->Resume(); | 229 controller->Resume(); |
230 } | 230 } |
231 | 231 |
232 bool MojoAsyncResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, | 232 void MojoAsyncResourceHandler::OnWillRead( |
233 int* buf_size) { | 233 scoped_refptr<net::IOBuffer>* buf, |
234 // TODO(mmenke): Cancel with net::ERR_INSUFFICIENT_RESOURCES instead. | 234 int* buf_size, |
235 if (!CheckForSufficientResource()) | 235 std::unique_ptr<ResourceController> controller) { |
236 return false; | 236 if (!CheckForSufficientResource()) { |
| 237 controller->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES); |
| 238 return; |
| 239 } |
237 | 240 |
238 if (!shared_writer_) { | 241 if (!shared_writer_) { |
239 MojoCreateDataPipeOptions options; | 242 MojoCreateDataPipeOptions options; |
240 options.struct_size = sizeof(MojoCreateDataPipeOptions); | 243 options.struct_size = sizeof(MojoCreateDataPipeOptions); |
241 options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE; | 244 options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE; |
242 options.element_num_bytes = 1; | 245 options.element_num_bytes = 1; |
243 options.capacity_num_bytes = g_allocation_size; | 246 options.capacity_num_bytes = g_allocation_size; |
244 mojo::DataPipe data_pipe(options); | 247 mojo::DataPipe data_pipe(options); |
245 | 248 |
246 DCHECK(data_pipe.producer_handle.is_valid()); | 249 DCHECK(data_pipe.producer_handle.is_valid()); |
247 DCHECK(data_pipe.consumer_handle.is_valid()); | 250 DCHECK(data_pipe.consumer_handle.is_valid()); |
248 | 251 |
249 response_body_consumer_handle_ = std::move(data_pipe.consumer_handle); | 252 response_body_consumer_handle_ = std::move(data_pipe.consumer_handle); |
250 shared_writer_ = new SharedWriter(std::move(data_pipe.producer_handle)); | 253 shared_writer_ = new SharedWriter(std::move(data_pipe.producer_handle)); |
251 handle_watcher_.Start(shared_writer_->writer(), MOJO_HANDLE_SIGNAL_WRITABLE, | 254 handle_watcher_.Start(shared_writer_->writer(), MOJO_HANDLE_SIGNAL_WRITABLE, |
252 base::Bind(&MojoAsyncResourceHandler::OnWritable, | 255 base::Bind(&MojoAsyncResourceHandler::OnWritable, |
253 base::Unretained(this))); | 256 base::Unretained(this))); |
254 | 257 |
255 bool defer = false; | 258 bool defer = false; |
256 scoped_refptr<net::IOBufferWithSize> buffer; | 259 scoped_refptr<net::IOBufferWithSize> buffer; |
257 if (!AllocateWriterIOBuffer(&buffer, &defer)) | 260 if (!AllocateWriterIOBuffer(&buffer, &defer)) { |
258 return false; | 261 controller->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES); |
| 262 return; |
| 263 } |
259 if (!defer) { | 264 if (!defer) { |
260 if (static_cast<size_t>(buffer->size()) >= kMinAllocationSize) { | 265 if (static_cast<size_t>(buffer->size()) >= kMinAllocationSize) { |
261 *buf = buffer_ = buffer; | 266 *buf = buffer_ = buffer; |
262 *buf_size = buffer_->size(); | 267 *buf_size = buffer_->size(); |
263 return true; | 268 controller->Resume(); |
| 269 return; |
264 } | 270 } |
265 | 271 |
266 // The allocated buffer is too small. | 272 // The allocated buffer is too small. |
267 if (EndWrite(0) != MOJO_RESULT_OK) | 273 if (EndWrite(0) != MOJO_RESULT_OK) { |
268 return false; | 274 controller->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES); |
| 275 return; |
| 276 } |
269 } | 277 } |
270 DCHECK(!is_using_io_buffer_not_from_writer_); | 278 DCHECK(!is_using_io_buffer_not_from_writer_); |
271 is_using_io_buffer_not_from_writer_ = true; | 279 is_using_io_buffer_not_from_writer_ = true; |
272 buffer_ = new net::IOBufferWithSize(kMinAllocationSize); | 280 buffer_ = new net::IOBufferWithSize(kMinAllocationSize); |
273 } | 281 } |
274 | 282 |
275 DCHECK_EQ(0u, buffer_offset_); | 283 DCHECK_EQ(0u, buffer_offset_); |
276 *buf = buffer_; | 284 *buf = buffer_; |
277 *buf_size = buffer_->size(); | 285 *buf_size = buffer_->size(); |
278 return true; | 286 controller->Resume(); |
279 } | 287 } |
280 | 288 |
281 void MojoAsyncResourceHandler::OnReadCompleted( | 289 void MojoAsyncResourceHandler::OnReadCompleted( |
282 int bytes_read, | 290 int bytes_read, |
283 std::unique_ptr<ResourceController> controller) { | 291 std::unique_ptr<ResourceController> controller) { |
284 DCHECK(!has_controller()); | 292 DCHECK(!has_controller()); |
285 DCHECK_GE(bytes_read, 0); | 293 DCHECK_GE(bytes_read, 0); |
286 DCHECK(buffer_); | 294 DCHECK(buffer_); |
287 | 295 |
288 if (!bytes_read) { | 296 if (!bytes_read) { |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
576 base::Bind(&MojoAsyncResourceHandler::OnUploadProgressACK, | 584 base::Bind(&MojoAsyncResourceHandler::OnUploadProgressACK, |
577 weak_factory_.GetWeakPtr())); | 585 weak_factory_.GetWeakPtr())); |
578 } | 586 } |
579 | 587 |
580 void MojoAsyncResourceHandler::OnUploadProgressACK() { | 588 void MojoAsyncResourceHandler::OnUploadProgressACK() { |
581 if (upload_progress_tracker_) | 589 if (upload_progress_tracker_) |
582 upload_progress_tracker_->OnAckReceived(); | 590 upload_progress_tracker_->OnAckReceived(); |
583 } | 591 } |
584 | 592 |
585 } // namespace content | 593 } // namespace content |
OLD | NEW |