| 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 |