OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/mime_sniffing_resource_handler.h" | 5 #include "content/browser/loader/mime_sniffing_resource_handler.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
| 9 #include <algorithm> |
9 #include <memory> | 10 #include <memory> |
10 | 11 |
11 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
12 #include "base/location.h" | 13 #include "base/location.h" |
13 #include "base/logging.h" | 14 #include "base/logging.h" |
14 #include "base/macros.h" | 15 #include "base/macros.h" |
15 #include "base/memory/ptr_util.h" | 16 #include "base/memory/ptr_util.h" |
16 #include "base/single_thread_task_runner.h" | 17 #include "base/single_thread_task_runner.h" |
17 #include "base/threading/thread_task_runner_handle.h" | 18 #include "base/threading/thread_task_runner_handle.h" |
18 #include "content/browser/loader/intercepting_resource_handler.h" | 19 #include "content/browser/loader/intercepting_resource_handler.h" |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 bool must_download, | 185 bool must_download, |
185 ResourceType request_resource_type); | 186 ResourceType request_resource_type); |
186 | 187 |
187 // Tests the operation of the MimeSniffingHandler when it needs to buffer | 188 // Tests the operation of the MimeSniffingHandler when it needs to buffer |
188 // data (example case: the response is text/plain). | 189 // data (example case: the response is text/plain). |
189 void TestHandlerSniffing(bool response_started, | 190 void TestHandlerSniffing(bool response_started, |
190 bool defer_response_started, | 191 bool defer_response_started, |
191 bool will_read, | 192 bool will_read, |
192 bool defer_will_read, | 193 bool defer_will_read, |
193 bool read_completed, | 194 bool read_completed, |
194 bool defer_read_completed); | 195 bool defer_read_completed, |
| 196 int read_chunk_size, |
| 197 int downstream_handler_buffer_size); |
195 | 198 |
196 // Tests the operation of the MimeSniffingHandler when it doesn't buffer | 199 // Tests the operation of the MimeSniffingHandler when it doesn't buffer |
197 // data (example case: the response is text/html). | 200 // data (example case: the response is text/html). |
198 void TestHandlerNoSniffing(bool response_started, | 201 void TestHandlerNoSniffing(bool response_started, |
199 bool defer_response_started, | 202 bool defer_response_started, |
200 bool will_read, | 203 bool will_read, |
201 bool defer_will_read, | 204 bool defer_will_read, |
202 bool read_completed, | 205 bool read_completed, |
203 bool defer_read_completed); | 206 bool defer_read_completed, |
| 207 int read_chunk_size, |
| 208 int downstream_handler_buffer_size); |
204 | 209 |
205 private: | 210 private: |
206 // Whether the URL request should be intercepted as a stream. | 211 // Whether the URL request should be intercepted as a stream. |
207 bool stream_has_handler_; | 212 bool stream_has_handler_; |
208 bool plugin_available_; | 213 bool plugin_available_; |
209 bool plugin_stale_; | 214 bool plugin_stale_; |
210 | 215 |
211 TestBrowserThreadBundle thread_bundle_; | 216 TestBrowserThreadBundle thread_bundle_; |
212 }; | 217 }; |
213 | 218 |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 EXPECT_TRUE(intercepting_handler->new_handler_for_testing()); | 314 EXPECT_TRUE(intercepting_handler->new_handler_for_testing()); |
310 return host.intercepted_as_stream(); | 315 return host.intercepted_as_stream(); |
311 } | 316 } |
312 | 317 |
313 void MimeSniffingResourceHandlerTest::TestHandlerSniffing( | 318 void MimeSniffingResourceHandlerTest::TestHandlerSniffing( |
314 bool response_started, | 319 bool response_started, |
315 bool defer_response_started, | 320 bool defer_response_started, |
316 bool will_read, | 321 bool will_read, |
317 bool defer_will_read, | 322 bool defer_will_read, |
318 bool read_completed, | 323 bool read_completed, |
319 bool defer_read_completed) { | 324 bool defer_read_completed, |
| 325 int read_chunk_size, |
| 326 int downstream_handler_buffer_size) { |
320 net::URLRequestContext context; | 327 net::URLRequestContext context; |
321 std::unique_ptr<net::URLRequest> request(context.CreateRequest( | 328 std::unique_ptr<net::URLRequest> request(context.CreateRequest( |
322 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); | 329 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); |
323 ResourceRequestInfo::AllocateForTesting(request.get(), | 330 ResourceRequestInfo::AllocateForTesting(request.get(), |
324 RESOURCE_TYPE_MAIN_FRAME, | 331 RESOURCE_TYPE_MAIN_FRAME, |
325 nullptr, // context | 332 nullptr, // context |
326 0, // render_process_id | 333 0, // render_process_id |
327 0, // render_view_id | 334 0, // render_view_id |
328 0, // render_frame_id | 335 0, // render_frame_id |
329 true, // is_main_frame | 336 true, // is_main_frame |
(...skipping 12 matching lines...) Expand all Loading... |
342 nullptr)); | 349 nullptr)); |
343 | 350 |
344 std::unique_ptr<TestResourceHandler> scoped_test_handler( | 351 std::unique_ptr<TestResourceHandler> scoped_test_handler( |
345 new TestResourceHandler()); | 352 new TestResourceHandler()); |
346 scoped_test_handler->set_on_response_started_result(response_started); | 353 scoped_test_handler->set_on_response_started_result(response_started); |
347 scoped_test_handler->set_defer_on_response_started(defer_response_started); | 354 scoped_test_handler->set_defer_on_response_started(defer_response_started); |
348 scoped_test_handler->set_on_will_read_result(will_read); | 355 scoped_test_handler->set_on_will_read_result(will_read); |
349 scoped_test_handler->set_defer_on_will_read(defer_will_read); | 356 scoped_test_handler->set_defer_on_will_read(defer_will_read); |
350 scoped_test_handler->set_on_read_completed_result(read_completed); | 357 scoped_test_handler->set_on_read_completed_result(read_completed); |
351 scoped_test_handler->set_defer_on_read_completed(defer_read_completed); | 358 scoped_test_handler->set_defer_on_read_completed(defer_read_completed); |
| 359 scoped_test_handler->SetBufferSize(downstream_handler_buffer_size); |
352 TestResourceHandler* test_handler = scoped_test_handler.get(); | 360 TestResourceHandler* test_handler = scoped_test_handler.get(); |
353 MimeSniffingResourceHandler mime_sniffing_handler( | 361 MimeSniffingResourceHandler mime_sniffing_handler( |
354 std::move(scoped_test_handler), &host, &plugin_service, | 362 std::move(scoped_test_handler), &host, &plugin_service, |
355 intercepting_handler.get(), request.get(), | 363 intercepting_handler.get(), request.get(), |
356 REQUEST_CONTEXT_TYPE_UNSPECIFIED); | 364 REQUEST_CONTEXT_TYPE_UNSPECIFIED); |
357 | 365 |
358 MockResourceLoader mock_loader(&mime_sniffing_handler); | 366 MockResourceLoader mock_loader(&mime_sniffing_handler); |
359 | 367 |
360 ASSERT_EQ(MockResourceLoader::Status::IDLE, | 368 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
361 mock_loader.OnWillStart(request->url())); | 369 mock_loader.OnWillStart(request->url())); |
362 | 370 |
363 // The response should be sniffed. | 371 // The response should be sniffed. |
364 scoped_refptr<ResourceResponse> response(new ResourceResponse); | 372 scoped_refptr<ResourceResponse> response(new ResourceResponse); |
365 response->head.mime_type.assign("text/plain"); | 373 response->head.mime_type.assign("text/plain"); |
366 | 374 |
367 // Simulate the response starting. The MimeSniffingHandler should start | 375 // Simulate the response starting. The MimeSniffingHandler should start |
368 // buffering, so the return value should always be true. | 376 // buffering, so the return value should always be true. |
369 ASSERT_EQ(MockResourceLoader::Status::IDLE, | 377 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
370 mock_loader.OnResponseStarted(std::move(response))); | 378 mock_loader.OnResponseStarted(std::move(response))); |
371 | 379 |
372 // Read some data to sniff the mime type. This will ask the next | 380 // Read some data to sniff the mime type. |
373 // ResourceHandler for a buffer. | 381 // Simulate an HTML page. The mime sniffer will identify the MimeType and |
374 mock_loader.OnWillRead(); | 382 // proceed with replay. |
| 383 const char kData[] = "!DOCTYPE html\n<head>\n<title>Foo</title>\n</head>"; |
| 384 size_t string_pos = 0u; |
| 385 do { |
| 386 mock_loader.OnWillRead(); |
375 | 387 |
376 if (!will_read) { | 388 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); |
| 389 |
| 390 size_t amount_to_write = std::min(sizeof(kData) - string_pos, |
| 391 static_cast<size_t>(read_chunk_size)); |
| 392 |
| 393 // Construct StringPiece manually, as the terminal null needs to be |
| 394 // included, so it's sniffed as binary (Not important that it's sniffed |
| 395 // as binary, but this gaurantees it's sniffed as something, without |
| 396 // waiting for more data). |
| 397 mock_loader.OnReadCompleted( |
| 398 base::StringPiece(kData + string_pos, amount_to_write)); |
| 399 string_pos += amount_to_write; |
| 400 } while (string_pos != sizeof(kData)); |
| 401 |
| 402 // If the next handler cancels the response start, the caller of |
| 403 // MimeSniffingHandler::OnReadCompleted should be notified immediately. |
| 404 if (!response_started) { |
377 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); | 405 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); |
378 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); | 406 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); |
379 | 407 |
380 EXPECT_EQ(1, test_handler->on_will_start_called()); | 408 EXPECT_EQ(1, test_handler->on_will_start_called()); |
381 EXPECT_EQ(0, test_handler->on_request_redirected_called()); | 409 EXPECT_EQ(0, test_handler->on_request_redirected_called()); |
382 EXPECT_EQ(0, test_handler->on_response_started_called()); | 410 EXPECT_EQ(1, test_handler->on_response_started_called()); |
383 EXPECT_EQ(1, test_handler->on_will_read_called()); | 411 EXPECT_EQ(0, test_handler->on_will_read_called()); |
384 EXPECT_EQ(0, test_handler->on_read_completed_called()); | 412 EXPECT_EQ(0, test_handler->on_read_completed_called()); |
385 | 413 |
386 // Process all messages to ensure proper test teardown. | 414 // Process all messages to ensure proper test teardown. |
387 content::RunAllPendingInMessageLoop(); | 415 content::RunAllPendingInMessageLoop(); |
388 return; | 416 return; |
389 } | 417 } |
390 | 418 |
391 if (defer_will_read) { | 419 if (defer_response_started) { |
392 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, | 420 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
393 mock_loader.status()); | 421 mock_loader.status()); |
394 EXPECT_EQ(MimeSniffingResourceHandler::STATE_WAITING_FOR_BUFFER, | 422 EXPECT_EQ(MimeSniffingResourceHandler::STATE_REPLAYING_RESPONSE_RECEIVED, |
395 mime_sniffing_handler.state_); | 423 mime_sniffing_handler.state_); |
396 test_handler->Resume(); | 424 test_handler->Resume(); |
397 // MimeSniffingResourceHandler may not synchronously resume the request. | 425 // MimeSniffingResourceHandler may not synchronously resume the request. |
398 base::RunLoop().RunUntilIdle(); | 426 base::RunLoop().RunUntilIdle(); |
399 } | 427 } |
400 | 428 |
401 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); | 429 // This is the point at which the replay will happen, which will allocate |
402 | 430 // a buffer and give the downstream handler a chance to cancel. |
403 // Simulate an HTML page. The mime sniffer will identify the MimeType and | 431 if (!will_read) { |
404 // proceed with replay. | |
405 const char kData[] = "!DOCTYPE html\n<head>\n<title>Foo</title>\n</head>"; | |
406 // Construct StringPiece manually, as the terminal null needs to be included, | |
407 // so it's sniffed as binary (Not important that it's sniffed as binary, but | |
408 // this gaurantees it's sniffed as something, without waiting for more data). | |
409 mock_loader.OnReadCompleted(base::StringPiece(kData, sizeof(kData))); | |
410 | |
411 // If the next handler cancels the response start, the caller of | |
412 // MimeSniffingHandler::OnReadCompleted should be notified immediately. | |
413 if (!response_started) { | |
414 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); | 432 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); |
415 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); | 433 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); |
416 | 434 |
417 EXPECT_EQ(1, test_handler->on_will_start_called()); | 435 EXPECT_EQ(1, test_handler->on_will_start_called()); |
418 EXPECT_EQ(0, test_handler->on_request_redirected_called()); | 436 EXPECT_EQ(0, test_handler->on_request_redirected_called()); |
419 EXPECT_EQ(1, test_handler->on_response_started_called()); | 437 EXPECT_EQ(1, test_handler->on_response_started_called()); |
420 EXPECT_EQ(1, test_handler->on_will_read_called()); | 438 EXPECT_EQ(1, test_handler->on_will_read_called()); |
421 EXPECT_EQ(0, test_handler->on_read_completed_called()); | 439 EXPECT_EQ(0, test_handler->on_read_completed_called()); |
422 | 440 |
423 // Process all messages to ensure proper test teardown. | 441 // Process all messages to ensure proper test teardown. |
424 content::RunAllPendingInMessageLoop(); | 442 content::RunAllPendingInMessageLoop(); |
425 return; | 443 return; |
426 } | 444 } |
427 | 445 |
428 if (defer_response_started) { | 446 if (defer_will_read) { |
429 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, | 447 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
430 mock_loader.status()); | 448 mock_loader.status()); |
431 EXPECT_EQ(MimeSniffingResourceHandler::STATE_REPLAYING_RESPONSE_RECEIVED, | 449 EXPECT_EQ(MimeSniffingResourceHandler::STATE_REPLAYING_WAIT_FOR_WILL_READ, |
432 mime_sniffing_handler.state_); | 450 mime_sniffing_handler.state_); |
433 test_handler->Resume(); | 451 test_handler->Resume(); |
434 // MimeSniffingResourceHandler may not synchronously resume the request. | 452 // MimeSniffingResourceHandler may not synchronously resume the request. |
435 base::RunLoop().RunUntilIdle(); | 453 base::RunLoop().RunUntilIdle(); |
436 } | 454 } |
437 | 455 |
438 // The body that was sniffed should be transmitted to the next handler. This | 456 // The body that was sniffed should be transmitted to the next handler. This |
439 // may cancel the request. | 457 // may cancel the request. |
440 if (!read_completed) { | 458 if (!read_completed) { |
441 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); | 459 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); |
442 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); | 460 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); |
443 | 461 |
444 // Process all messages to ensure proper test teardown. | 462 // Process all messages to ensure proper test teardown. |
445 content::RunAllPendingInMessageLoop(); | 463 content::RunAllPendingInMessageLoop(); |
446 return; | 464 return; |
447 } | 465 } |
448 | 466 |
449 EXPECT_EQ(MimeSniffingResourceHandler::STATE_STREAMING, | |
450 mime_sniffing_handler.state_); | |
451 | |
452 // The request may be deferred by the next handler once the read is done. | 467 // The request may be deferred by the next handler once the read is done. |
453 if (defer_read_completed) { | 468 if (defer_read_completed) { |
| 469 // The replay isn't considered complete until the downstream handler |
| 470 // finishes the read completed.... |
| 471 EXPECT_EQ(MimeSniffingResourceHandler::STATE_REPLAYING_RESPONSE_RECEIVED, |
| 472 mime_sniffing_handler.state_); |
454 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, | 473 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
455 mock_loader.status()); | 474 mock_loader.status()); |
456 test_handler->Resume(); | 475 test_handler->Resume(); |
457 // MimeSniffingResourceHandler may not synchronously resume the request. | 476 |
| 477 // (MimeSniffingResourceHandler may not synchronously resume the request.) |
458 base::RunLoop().RunUntilIdle(); | 478 base::RunLoop().RunUntilIdle(); |
| 479 |
| 480 // ... which should be now. |
| 481 EXPECT_EQ(MimeSniffingResourceHandler::STATE_STREAMING, |
| 482 mime_sniffing_handler.state_); |
| 483 } else { |
| 484 EXPECT_EQ(MimeSniffingResourceHandler::STATE_STREAMING, |
| 485 mime_sniffing_handler.state_); |
459 } | 486 } |
460 | 487 |
461 EXPECT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); | 488 EXPECT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); |
462 EXPECT_EQ(MimeSniffingResourceHandler::STATE_STREAMING, | 489 EXPECT_EQ(MimeSniffingResourceHandler::STATE_STREAMING, |
463 mime_sniffing_handler.state_); | 490 mime_sniffing_handler.state_); |
464 | 491 |
465 EXPECT_EQ(1, test_handler->on_will_start_called()); | 492 EXPECT_EQ(1, test_handler->on_will_start_called()); |
466 EXPECT_EQ(0, test_handler->on_request_redirected_called()); | 493 EXPECT_EQ(0, test_handler->on_request_redirected_called()); |
467 EXPECT_EQ(1, test_handler->on_response_started_called()); | 494 EXPECT_EQ(1, test_handler->on_response_started_called()); |
468 EXPECT_EQ(1, test_handler->on_will_read_called()); | 495 EXPECT_LE(1, test_handler->on_will_read_called()); |
469 EXPECT_EQ(1, test_handler->on_read_completed_called()); | 496 EXPECT_LE(1, test_handler->on_read_completed_called()); |
| 497 // Include trailing null in expected value. |
| 498 EXPECT_EQ(std::string(kData, strlen(kData) + 1), test_handler->body()); |
470 | 499 |
471 // Process all messages to ensure proper test teardown. | 500 // Process all messages to ensure proper test teardown. |
472 content::RunAllPendingInMessageLoop(); | 501 content::RunAllPendingInMessageLoop(); |
473 } | 502 } |
474 | 503 |
475 void MimeSniffingResourceHandlerTest::TestHandlerNoSniffing( | 504 void MimeSniffingResourceHandlerTest::TestHandlerNoSniffing( |
476 bool response_started, | 505 bool response_started, |
477 bool defer_response_started, | 506 bool defer_response_started, |
478 bool will_read, | 507 bool will_read, |
479 bool defer_will_read, | 508 bool defer_will_read, |
480 bool read_completed, | 509 bool read_completed, |
481 bool defer_read_completed) { | 510 bool defer_read_completed, |
| 511 int read_chunk_size, |
| 512 int downstream_handler_buffer_size) { |
482 net::URLRequestContext context; | 513 net::URLRequestContext context; |
483 std::unique_ptr<net::URLRequest> request(context.CreateRequest( | 514 std::unique_ptr<net::URLRequest> request(context.CreateRequest( |
484 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); | 515 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); |
485 ResourceRequestInfo::AllocateForTesting(request.get(), | 516 ResourceRequestInfo::AllocateForTesting(request.get(), |
486 RESOURCE_TYPE_MAIN_FRAME, | 517 RESOURCE_TYPE_MAIN_FRAME, |
487 nullptr, // context | 518 nullptr, // context |
488 0, // render_process_id | 519 0, // render_process_id |
489 0, // render_view_id | 520 0, // render_view_id |
490 0, // render_frame_id | 521 0, // render_frame_id |
491 true, // is_main_frame | 522 true, // is_main_frame |
(...skipping 12 matching lines...) Expand all Loading... |
504 nullptr)); | 535 nullptr)); |
505 | 536 |
506 std::unique_ptr<TestResourceHandler> scoped_test_handler( | 537 std::unique_ptr<TestResourceHandler> scoped_test_handler( |
507 new TestResourceHandler()); | 538 new TestResourceHandler()); |
508 scoped_test_handler->set_on_response_started_result(response_started); | 539 scoped_test_handler->set_on_response_started_result(response_started); |
509 scoped_test_handler->set_defer_on_response_started(defer_response_started); | 540 scoped_test_handler->set_defer_on_response_started(defer_response_started); |
510 scoped_test_handler->set_on_will_read_result(will_read); | 541 scoped_test_handler->set_on_will_read_result(will_read); |
511 scoped_test_handler->set_defer_on_will_read(defer_will_read); | 542 scoped_test_handler->set_defer_on_will_read(defer_will_read); |
512 scoped_test_handler->set_on_read_completed_result(read_completed); | 543 scoped_test_handler->set_on_read_completed_result(read_completed); |
513 scoped_test_handler->set_defer_on_read_completed(defer_read_completed); | 544 scoped_test_handler->set_defer_on_read_completed(defer_read_completed); |
| 545 scoped_test_handler->SetBufferSize(downstream_handler_buffer_size); |
514 TestResourceHandler* test_handler = scoped_test_handler.get(); | 546 TestResourceHandler* test_handler = scoped_test_handler.get(); |
515 MimeSniffingResourceHandler mime_sniffing_handler( | 547 MimeSniffingResourceHandler mime_sniffing_handler( |
516 std::move(scoped_test_handler), &host, &plugin_service, | 548 std::move(scoped_test_handler), &host, &plugin_service, |
517 intercepting_handler.get(), request.get(), | 549 intercepting_handler.get(), request.get(), |
518 REQUEST_CONTEXT_TYPE_UNSPECIFIED); | 550 REQUEST_CONTEXT_TYPE_UNSPECIFIED); |
519 | 551 |
520 MockResourceLoader mock_loader(&mime_sniffing_handler); | 552 MockResourceLoader mock_loader(&mime_sniffing_handler); |
521 | 553 |
522 ASSERT_EQ(MockResourceLoader::Status::IDLE, | 554 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
523 mock_loader.OnWillStart(request->url())); | 555 mock_loader.OnWillStart(request->url())); |
(...skipping 24 matching lines...) Expand all Loading... |
548 if (defer_response_started) { | 580 if (defer_response_started) { |
549 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, | 581 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
550 mock_loader.status()); | 582 mock_loader.status()); |
551 EXPECT_EQ(MimeSniffingResourceHandler::STATE_REPLAYING_RESPONSE_RECEIVED, | 583 EXPECT_EQ(MimeSniffingResourceHandler::STATE_REPLAYING_RESPONSE_RECEIVED, |
552 mime_sniffing_handler.state_); | 584 mime_sniffing_handler.state_); |
553 test_handler->Resume(); | 585 test_handler->Resume(); |
554 // MimeSniffingResourceHandler may not synchronously resume the request. | 586 // MimeSniffingResourceHandler may not synchronously resume the request. |
555 base::RunLoop().RunUntilIdle(); | 587 base::RunLoop().RunUntilIdle(); |
556 } | 588 } |
557 | 589 |
558 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); | 590 const std::string input(std::string(2000, 'a')); |
| 591 const char* to_read = input.c_str(); |
| 592 int read_cycles = 1; |
| 593 do { |
| 594 // The MimeSniffingResourceHandler should be acting as a pass-through |
| 595 // ResourceHandler. |
| 596 mock_loader.OnWillRead(); |
559 | 597 |
560 // The MimeSniffingResourceHandler should be acting as a pass-through | 598 // Only relevant the first time through the loop. |
561 // ResourceHandler. | 599 if (!will_read) { |
562 mock_loader.OnWillRead(); | 600 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); |
| 601 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); |
563 | 602 |
564 if (!will_read) { | 603 EXPECT_EQ(1, test_handler->on_will_start_called()); |
565 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); | 604 EXPECT_EQ(0, test_handler->on_request_redirected_called()); |
566 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); | 605 EXPECT_EQ(1, test_handler->on_response_started_called()); |
| 606 EXPECT_EQ(1, test_handler->on_will_read_called()); |
| 607 EXPECT_EQ(0, test_handler->on_read_completed_called()); |
| 608 |
| 609 // Process all messages to ensure proper test teardown. |
| 610 content::RunAllPendingInMessageLoop(); |
| 611 return; |
| 612 } |
| 613 |
| 614 if (defer_will_read) { |
| 615 defer_will_read = false; // Only a single will read is deferred. |
| 616 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
| 617 mock_loader.status()); |
| 618 EXPECT_EQ(MimeSniffingResourceHandler::STATE_STREAMING, |
| 619 mime_sniffing_handler.state_); |
| 620 test_handler->Resume(); |
| 621 // MimeSniffingResourceHandler may not synchronously resume the request. |
| 622 base::RunLoop().RunUntilIdle(); |
| 623 } |
| 624 |
| 625 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); |
| 626 |
| 627 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); |
| 628 int amount_to_read = |
| 629 std::min(static_cast<int>(strlen(to_read)), |
| 630 std::min(mock_loader.io_buffer_size(), read_chunk_size)); |
| 631 |
| 632 mock_loader.OnReadCompleted(std::string(to_read, amount_to_read)); |
| 633 to_read += amount_to_read; |
567 | 634 |
568 EXPECT_EQ(1, test_handler->on_will_start_called()); | 635 EXPECT_EQ(1, test_handler->on_will_start_called()); |
569 EXPECT_EQ(0, test_handler->on_request_redirected_called()); | 636 EXPECT_EQ(0, test_handler->on_request_redirected_called()); |
570 EXPECT_EQ(1, test_handler->on_response_started_called()); | 637 EXPECT_EQ(1, test_handler->on_response_started_called()); |
571 EXPECT_EQ(1, test_handler->on_will_read_called()); | 638 EXPECT_EQ(read_cycles, test_handler->on_will_read_called()); |
572 EXPECT_EQ(0, test_handler->on_read_completed_called()); | 639 EXPECT_EQ(read_cycles, test_handler->on_read_completed_called()); |
573 | 640 |
574 // Process all messages to ensure proper test teardown. | 641 // Only relevant first time through. |
575 content::RunAllPendingInMessageLoop(); | 642 if (!read_completed) { |
576 return; | 643 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); |
577 } | 644 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); |
578 | 645 |
579 if (defer_will_read) { | 646 // Process all messages to ensure proper test teardown. |
580 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, | 647 content::RunAllPendingInMessageLoop(); |
581 mock_loader.status()); | 648 return; |
582 EXPECT_EQ(MimeSniffingResourceHandler::STATE_STREAMING, | 649 } |
583 mime_sniffing_handler.state_); | |
584 test_handler->Resume(); | |
585 // MimeSniffingResourceHandler may not synchronously resume the request. | |
586 base::RunLoop().RunUntilIdle(); | |
587 } | |
588 | 650 |
589 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); | 651 if (mock_loader.status() == MockResourceLoader::Status::CALLBACK_PENDING) { |
| 652 test_handler->Resume(); |
| 653 // MimeSniffingResourceHandler may not synchronously resume the request. |
| 654 base::RunLoop().RunUntilIdle(); |
| 655 } |
590 | 656 |
591 mock_loader.OnReadCompleted(std::string(2000, 'a')); | 657 ++read_cycles; |
592 | 658 } while (strlen(to_read) > 0); |
593 EXPECT_EQ(1, test_handler->on_will_start_called()); | |
594 EXPECT_EQ(0, test_handler->on_request_redirected_called()); | |
595 EXPECT_EQ(1, test_handler->on_response_started_called()); | |
596 EXPECT_EQ(1, test_handler->on_will_read_called()); | |
597 EXPECT_EQ(1, test_handler->on_read_completed_called()); | |
598 | |
599 if (!read_completed) { | |
600 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); | |
601 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); | |
602 | |
603 // Process all messages to ensure proper test teardown. | |
604 content::RunAllPendingInMessageLoop(); | |
605 return; | |
606 } | |
607 | 659 |
608 if (mock_loader.status() == MockResourceLoader::Status::CALLBACK_PENDING) { | 660 if (mock_loader.status() == MockResourceLoader::Status::CALLBACK_PENDING) { |
609 test_handler->Resume(); | 661 test_handler->Resume(); |
610 // MimeSniffingResourceHandler may not synchronously resume the request. | 662 // MimeSniffingResourceHandler may not synchronously resume the request. |
611 base::RunLoop().RunUntilIdle(); | 663 base::RunLoop().RunUntilIdle(); |
612 } | 664 } |
613 | 665 |
614 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); | 666 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); |
615 | 667 |
616 // Process all messages to ensure proper test teardown. | 668 // Process all messages to ensure proper test teardown. |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 #endif | 799 #endif |
748 | 800 |
749 // Test that the MimeSniffingHandler operates properly when it doesn't sniff | 801 // Test that the MimeSniffingHandler operates properly when it doesn't sniff |
750 // resources. | 802 // resources. |
751 // TODO(mmenke): None of these test async cancellation. Should they? | 803 // TODO(mmenke): None of these test async cancellation. Should they? |
752 TEST_F(MimeSniffingResourceHandlerTest, NoSniffing) { | 804 TEST_F(MimeSniffingResourceHandlerTest, NoSniffing) { |
753 // Test simple case. | 805 // Test simple case. |
754 TestHandlerNoSniffing( | 806 TestHandlerNoSniffing( |
755 true /* response_started_succeeds */, false /* defer_response_started */, | 807 true /* response_started_succeeds */, false /* defer_response_started */, |
756 true /* will_read_succeeds */, false /* defer_will_read */, | 808 true /* will_read_succeeds */, false /* defer_will_read */, |
757 true /* read_completed_succeeds */, false /* defer_read_completed */); | 809 true /* read_completed_succeeds */, false /* defer_read_completed */, |
| 810 2048, 2048); |
758 | 811 |
759 // Test deferral. | 812 // Test deferral. |
760 TestHandlerNoSniffing( | 813 TestHandlerNoSniffing( |
761 true /* response_started_succeeds */, true /* defer_response_started */, | 814 true /* response_started_succeeds */, true /* defer_response_started */, |
762 true /* will_read_succeeds */, false /* defer_will_read */, | 815 true /* will_read_succeeds */, false /* defer_will_read */, |
763 true /* read_completed_succeeds */, false /* defer_read_completed */); | 816 true /* read_completed_succeeds */, false /* defer_read_completed */, |
| 817 2048, 2048); |
764 TestHandlerNoSniffing( | 818 TestHandlerNoSniffing( |
765 true /* response_started_succeeds */, false /* defer_response_started */, | 819 true /* response_started_succeeds */, false /* defer_response_started */, |
766 true /* will_read_succeeds */, true /* defer_will_read */, | 820 true /* will_read_succeeds */, true /* defer_will_read */, |
767 true /* read_completed_succeeds */, false /* defer_read_completed */); | 821 true /* read_completed_succeeds */, false /* defer_read_completed */, |
| 822 2048, 2048); |
768 TestHandlerNoSniffing( | 823 TestHandlerNoSniffing( |
769 true /* response_started_succeeds */, false /* defer_response_started */, | 824 true /* response_started_succeeds */, false /* defer_response_started */, |
770 true /* will_read_succeeds */, false /* defer_will_read */, | 825 true /* will_read_succeeds */, false /* defer_will_read */, |
771 true /* read_completed_succeeds */, true /* defer_read_completed */); | 826 true /* read_completed_succeeds */, true /* defer_read_completed */, 2048, |
| 827 2048); |
772 TestHandlerNoSniffing( | 828 TestHandlerNoSniffing( |
773 true /* response_started_succeeds */, true /* defer_response_started */, | 829 true /* response_started_succeeds */, true /* defer_response_started */, |
774 true /* will_read_succeeds */, true /* defer_will_read */, | 830 true /* will_read_succeeds */, true /* defer_will_read */, |
775 true /* read_completed_succeeds */, true /* defer_read_completed */); | 831 true /* read_completed_succeeds */, true /* defer_read_completed */, 2048, |
| 832 2048); |
776 | 833 |
777 // Test cancel in OnResponseStarted, OnWillRead, OnReadCompleted. | 834 // Test cancel in OnResponseStarted, OnWillRead, OnReadCompleted. |
778 TestHandlerNoSniffing( | 835 TestHandlerNoSniffing( |
779 false /* response_started_succeeds */, false /* defer_response_started */, | 836 false /* response_started_succeeds */, false /* defer_response_started */, |
780 false /* will_read_succeeds */, false /* defer_will_read */, | 837 false /* will_read_succeeds */, false /* defer_will_read */, |
781 false /* read_completed_succeeds */, false /* defer_read_completed */); | 838 false /* read_completed_succeeds */, false /* defer_read_completed */, |
| 839 2048, 2048); |
782 TestHandlerNoSniffing( | 840 TestHandlerNoSniffing( |
783 true /* response_started_succeeds */, false /* defer_response_started */, | 841 true /* response_started_succeeds */, false /* defer_response_started */, |
784 false /* will_read_succeeds */, false /* defer_will_read */, | 842 false /* will_read_succeeds */, false /* defer_will_read */, |
785 false /* read_completed_succeeds */, false /* defer_read_completed */); | 843 false /* read_completed_succeeds */, false /* defer_read_completed */, |
| 844 2048, 2048); |
786 TestHandlerNoSniffing( | 845 TestHandlerNoSniffing( |
787 true /* response_started_succeeds */, false /* defer_response_started */, | 846 true /* response_started_succeeds */, false /* defer_response_started */, |
788 true /* will_read_succeeds */, false /* defer_will_read */, | 847 true /* will_read_succeeds */, false /* defer_will_read */, |
789 false /* read_completed_succeeds */, false /* defer_read_completed */); | 848 false /* read_completed_succeeds */, false /* defer_read_completed */, |
| 849 2048, 2048); |
790 | 850 |
791 // Test cancel after deferral. | 851 // Test cancel after deferral. |
792 TestHandlerNoSniffing( | 852 TestHandlerNoSniffing( |
793 true /* response_started_succeeds */, true /* defer_response_started */, | 853 true /* response_started_succeeds */, true /* defer_response_started */, |
794 false /* will_read_succeeds */, false /* defer_will_read */, | 854 false /* will_read_succeeds */, false /* defer_will_read */, |
795 false /* read_completed_succeeds */, false /* defer_read_completed */); | 855 false /* read_completed_succeeds */, false /* defer_read_completed */, |
| 856 2048, 2048); |
796 TestHandlerNoSniffing( | 857 TestHandlerNoSniffing( |
797 true /* response_started_succeeds */, true /* defer_response_started */, | 858 true /* response_started_succeeds */, true /* defer_response_started */, |
798 true /* defer_will_read */, true /* will_read_succeeds */, | 859 true /* defer_will_read */, true /* will_read_succeeds */, |
799 false /* read_completed_succeeds */, false /* defer_read_completed */); | 860 false /* read_completed_succeeds */, false /* defer_read_completed */, |
| 861 2048, 2048); |
800 | 862 |
801 content::RunAllPendingInMessageLoop(); | 863 content::RunAllPendingInMessageLoop(); |
802 } | 864 } |
803 | 865 |
804 // Test that the MimeSniffingHandler operates properly when it sniffs | 866 // Test that the MimeSniffingHandler operates properly when it sniffs |
805 // resources. | 867 // resources. |
806 // TODO(mmenke): None of these test async cancellation. Should they? | 868 // TODO(mmenke): None of these test async cancellation. Should they? |
807 TEST_F(MimeSniffingResourceHandlerTest, Sniffing) { | 869 TEST_F(MimeSniffingResourceHandlerTest, Sniffing) { |
808 // Test simple case. | 870 // Test simple case. |
809 TestHandlerSniffing( | 871 TestHandlerSniffing( |
810 true /* response_started_succeeds */, false /* defer_response_started */, | 872 true /* response_started_succeeds */, false /* defer_response_started */, |
811 true /* will_read_succeeds */, false /* defer_will_read */, | 873 true /* will_read_succeeds */, false /* defer_will_read */, |
812 true /* read_completed_succeeds */, false /* defer_read_completed */); | 874 true /* read_completed_succeeds */, false /* defer_read_completed */, |
| 875 2048, 2048); |
813 | 876 |
814 // Test deferral. | 877 // Test deferral. |
815 TestHandlerSniffing( | 878 TestHandlerSniffing( |
816 true /* response_started_succeeds */, true /* defer_response_started */, | 879 true /* response_started_succeeds */, true /* defer_response_started */, |
817 true /* will_read_succeeds */, false /* defer_will_read */, | 880 true /* will_read_succeeds */, false /* defer_will_read */, |
818 true /* read_completed_succeeds */, false /* defer_read_completed */); | 881 true /* read_completed_succeeds */, false /* defer_read_completed */, |
819 TestHandlerSniffing( | 882 2048, 2048); |
820 true /* response_started_succeeds */, false /* defer_response_started */, | 883 TestHandlerSniffing(true /* response_started_succeeds */, |
821 true /* will_read_succeeds */, true /* defer_will_read */, | 884 false /* defer_response_started */, |
822 true /* read_completed_succeeds */, false /* defer_read_completed */); | 885 true /* will_read_succeeds */, true /* defer_will_read */, |
| 886 true /* read_completed_succeeds */, |
| 887 false /* defer_read_completed */, 2048, 2048); |
823 TestHandlerSniffing( | 888 TestHandlerSniffing( |
824 true /* response_started_succeeds */, false /* defer_response_started */, | 889 true /* response_started_succeeds */, false /* defer_response_started */, |
825 true /* will_read_succeeds */, false /* defer_will_read */, | 890 true /* will_read_succeeds */, false /* defer_will_read */, |
826 true /* read_completed_succeeds */, true /* defer_read_completed */); | 891 true /* read_completed_succeeds */, true /* defer_read_completed */, 2048, |
827 TestHandlerSniffing( | 892 2048); |
828 true /* response_started_succeeds */, true /* defer_response_started */, | 893 TestHandlerSniffing(true /* response_started_succeeds */, |
829 true /* will_read_succeeds */, true /* defer_will_read */, | 894 true /* defer_response_started */, |
830 true /* read_completed_succeeds */, true /* defer_read_completed */); | 895 true /* will_read_succeeds */, true /* defer_will_read */, |
| 896 true /* read_completed_succeeds */, |
| 897 true /* defer_read_completed */, 2048, 2048); |
831 | 898 |
832 // Test cancel in OnResponseStarted, OnWillRead, OnReadCompleted. | 899 // Test cancel in OnResponseStarted, OnWillRead, OnReadCompleted. |
833 TestHandlerSniffing( | 900 TestHandlerSniffing( |
834 false /* response_started_succeeds */, false /* defer_response_started */, | 901 false /* response_started_succeeds */, false /* defer_response_started */, |
835 false /* will_read_succeeds */, false /* defer_will_read */, | 902 false /* will_read_succeeds */, false /* defer_will_read */, |
836 false /* read_completed_succeeds */, false /* defer_read_completed */); | 903 false /* read_completed_succeeds */, false /* defer_read_completed */, |
| 904 2048, 2048); |
837 TestHandlerSniffing( | 905 TestHandlerSniffing( |
838 true /* response_started_succeeds */, false /* defer_response_started */, | 906 true /* response_started_succeeds */, false /* defer_response_started */, |
839 false /* will_read_succeeds */, false /* defer_will_read */, | 907 false /* will_read_succeeds */, false /* defer_will_read */, |
840 false /* read_completed_succeeds */, false /* defer_read_completed */); | 908 false /* read_completed_succeeds */, false /* defer_read_completed */, |
| 909 2048, 2048); |
841 TestHandlerSniffing( | 910 TestHandlerSniffing( |
842 true /* response_started_succeeds */, false /* defer_response_started */, | 911 true /* response_started_succeeds */, false /* defer_response_started */, |
843 true /* will_read_succeeds */, false /* defer_will_read */, | 912 true /* will_read_succeeds */, false /* defer_will_read */, |
844 false /* read_completed_succeeds */, false /* defer_read_completed */); | 913 false /* read_completed_succeeds */, false /* defer_read_completed */, |
| 914 2048, 2048); |
845 | 915 |
846 // Test cancel after deferral. | 916 // Test cancel after deferral. |
847 TestHandlerSniffing( | 917 TestHandlerSniffing( |
848 true /* response_started_succeeds */, true /* defer_response_started */, | 918 true /* response_started_succeeds */, true /* defer_response_started */, |
849 false /* will_read_succeeds */, false /* defer_will_read */, | 919 false /* will_read_succeeds */, false /* defer_will_read */, |
850 false /* read_completed_succeeds */, false /* defer_read_completed */); | 920 false /* read_completed_succeeds */, false /* defer_read_completed */, |
851 TestHandlerSniffing( | 921 2048, 2048); |
852 true /* response_started_succeeds */, true /* defer_response_started */, | 922 TestHandlerSniffing(true /* response_started_succeeds */, |
853 true /* will_read_succeeds */, true /* defer_will_read */, | 923 true /* defer_response_started */, |
854 false /* read_completed_succeeds */, false /* defer_read_completed */); | 924 true /* will_read_succeeds */, true /* defer_will_read */, |
| 925 false /* read_completed_succeeds */, |
| 926 false /* defer_read_completed */, 2048, 2048); |
855 | 927 |
856 content::RunAllPendingInMessageLoop(); | 928 content::RunAllPendingInMessageLoop(); |
857 } | 929 } |
858 | 930 |
859 // Tests that 304s do not trigger a change in handlers. | 931 // Tests that 304s do not trigger a change in handlers. |
860 TEST_F(MimeSniffingResourceHandlerTest, 304Handling) { | 932 TEST_F(MimeSniffingResourceHandlerTest, 304Handling) { |
861 net::URLRequestContext context; | 933 net::URLRequestContext context; |
862 std::unique_ptr<net::URLRequest> request(context.CreateRequest( | 934 std::unique_ptr<net::URLRequest> request(context.CreateRequest( |
863 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); | 935 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); |
864 ResourceRequestInfo::AllocateForTesting(request.get(), | 936 ResourceRequestInfo::AllocateForTesting(request.get(), |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
951 // mime sniffing is disabled and the wrapped resource handler returns false | 1023 // mime sniffing is disabled and the wrapped resource handler returns false |
952 // on OnResponseStarted. | 1024 // on OnResponseStarted. |
953 EXPECT_EQ(MockResourceLoader::Status::CANCELED, | 1025 EXPECT_EQ(MockResourceLoader::Status::CANCELED, |
954 mock_loader.OnResponseStarted(std::move(response))); | 1026 mock_loader.OnResponseStarted(std::move(response))); |
955 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); | 1027 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); |
956 | 1028 |
957 // Process all messages to ensure proper test teardown. | 1029 // Process all messages to ensure proper test teardown. |
958 content::RunAllPendingInMessageLoop(); | 1030 content::RunAllPendingInMessageLoop(); |
959 } | 1031 } |
960 | 1032 |
| 1033 TEST_F(MimeSniffingResourceHandlerTest, SmallReturnedBuffer) { |
| 1034 TestHandlerSniffing(true /* response_started_succeeds */, |
| 1035 true /* defer_response_started */, |
| 1036 true /* will_read_succeeds */, true /* defer_will_read */, |
| 1037 true /* read_completed_succeeds */, |
| 1038 true /* defer_read_completed */, 1, 1); |
| 1039 |
| 1040 TestHandlerNoSniffing( |
| 1041 true /* response_started_succeeds */, true /* defer_response_started */, |
| 1042 true /* will_read_succeeds */, true /* defer_will_read */, |
| 1043 true /* read_completed_succeeds */, true /* defer_read_completed */, 1, |
| 1044 1); |
| 1045 } |
| 1046 |
961 } // namespace content | 1047 } // namespace content |
OLD | NEW |