OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <stddef.h> | 5 #include <stddef.h> |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
423 response_data, | 423 response_data, |
424 auto_advance) {} | 424 auto_advance) {} |
425 | 425 |
426 protected: | 426 protected: |
427 ~URLRequestTestDelayedCompletionJob() override {} | 427 ~URLRequestTestDelayedCompletionJob() override {} |
428 | 428 |
429 private: | 429 private: |
430 bool NextReadAsync() override { return true; } | 430 bool NextReadAsync() override { return true; } |
431 }; | 431 }; |
432 | 432 |
| 433 // This class is a variation on URLRequestTestJob that ensures that no read is |
| 434 // asked of this job. |
| 435 class URLRequestMustNotReadTestJob : public net::URLRequestTestJob { |
| 436 public: |
| 437 URLRequestMustNotReadTestJob(net::URLRequest* request, |
| 438 net::NetworkDelegate* network_delegate, |
| 439 const std::string& response_headers, |
| 440 const std::string& response_data) |
| 441 : net::URLRequestTestJob(request, |
| 442 network_delegate, |
| 443 response_headers, |
| 444 response_data, |
| 445 false) {} |
| 446 |
| 447 int ReadRawData(net::IOBuffer* buf, int buf_size) override { |
| 448 EXPECT_TRUE(false) << "The job should have been cancelled before trying to " |
| 449 "read the response body."; |
| 450 return 0; |
| 451 } |
| 452 }; |
| 453 |
433 class URLRequestBigJob : public net::URLRequestSimpleJob { | 454 class URLRequestBigJob : public net::URLRequestSimpleJob { |
434 public: | 455 public: |
435 URLRequestBigJob(net::URLRequest* request, | 456 URLRequestBigJob(net::URLRequest* request, |
436 net::NetworkDelegate* network_delegate) | 457 net::NetworkDelegate* network_delegate) |
437 : net::URLRequestSimpleJob(request, network_delegate) { | 458 : net::URLRequestSimpleJob(request, network_delegate) { |
438 } | 459 } |
439 | 460 |
440 // URLRequestSimpleJob implementation: | 461 // URLRequestSimpleJob implementation: |
441 int GetData(std::string* mime_type, | 462 int GetData(std::string* mime_type, |
442 std::string* charset, | 463 std::string* charset, |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 | 539 |
519 class ResourceDispatcherHostTest; | 540 class ResourceDispatcherHostTest; |
520 | 541 |
521 class TestURLRequestJobFactory : public net::URLRequestJobFactory { | 542 class TestURLRequestJobFactory : public net::URLRequestJobFactory { |
522 public: | 543 public: |
523 explicit TestURLRequestJobFactory(ResourceDispatcherHostTest* test_fixture) | 544 explicit TestURLRequestJobFactory(ResourceDispatcherHostTest* test_fixture) |
524 : test_fixture_(test_fixture), | 545 : test_fixture_(test_fixture), |
525 hang_after_start_(false), | 546 hang_after_start_(false), |
526 delay_start_(false), | 547 delay_start_(false), |
527 delay_complete_(false), | 548 delay_complete_(false), |
528 url_request_jobs_created_count_(0) { | 549 must_not_read_(false), |
529 } | 550 url_request_jobs_created_count_(0) {} |
530 | 551 |
531 void HandleScheme(const std::string& scheme) { | 552 void HandleScheme(const std::string& scheme) { |
532 supported_schemes_.insert(scheme); | 553 supported_schemes_.insert(scheme); |
533 } | 554 } |
534 | 555 |
535 int url_request_jobs_created_count() const { | 556 int url_request_jobs_created_count() const { |
536 return url_request_jobs_created_count_; | 557 return url_request_jobs_created_count_; |
537 } | 558 } |
538 | 559 |
539 // When set, jobs will hang eternally once started. | 560 // When set, jobs will hang eternally once started. |
540 void SetHangAfterStartJobGeneration(bool hang_after_start) { | 561 void SetHangAfterStartJobGeneration(bool hang_after_start) { |
541 hang_after_start_ = hang_after_start; | 562 hang_after_start_ = hang_after_start; |
542 } | 563 } |
543 | 564 |
544 void SetDelayedStartJobGeneration(bool delay_job_start) { | 565 void SetDelayedStartJobGeneration(bool delay_job_start) { |
545 delay_start_ = delay_job_start; | 566 delay_start_ = delay_job_start; |
546 } | 567 } |
547 | 568 |
548 void SetDelayedCompleteJobGeneration(bool delay_job_complete) { | 569 void SetDelayedCompleteJobGeneration(bool delay_job_complete) { |
549 delay_complete_ = delay_job_complete; | 570 delay_complete_ = delay_job_complete; |
550 } | 571 } |
551 | 572 |
| 573 void SetMustNotReadJobGeneration(bool must_not_read) { |
| 574 must_not_read_ = must_not_read; |
| 575 } |
| 576 |
552 net::URLRequestJob* MaybeCreateJobWithProtocolHandler( | 577 net::URLRequestJob* MaybeCreateJobWithProtocolHandler( |
553 const std::string& scheme, | 578 const std::string& scheme, |
554 net::URLRequest* request, | 579 net::URLRequest* request, |
555 net::NetworkDelegate* network_delegate) const override; | 580 net::NetworkDelegate* network_delegate) const override; |
556 | 581 |
557 net::URLRequestJob* MaybeInterceptRedirect( | 582 net::URLRequestJob* MaybeInterceptRedirect( |
558 net::URLRequest* request, | 583 net::URLRequest* request, |
559 net::NetworkDelegate* network_delegate, | 584 net::NetworkDelegate* network_delegate, |
560 const GURL& location) const override; | 585 const GURL& location) const override; |
561 | 586 |
(...skipping 11 matching lines...) Expand all Loading... |
573 | 598 |
574 bool IsSafeRedirectTarget(const GURL& location) const override { | 599 bool IsSafeRedirectTarget(const GURL& location) const override { |
575 return false; | 600 return false; |
576 } | 601 } |
577 | 602 |
578 private: | 603 private: |
579 ResourceDispatcherHostTest* test_fixture_; | 604 ResourceDispatcherHostTest* test_fixture_; |
580 bool hang_after_start_; | 605 bool hang_after_start_; |
581 bool delay_start_; | 606 bool delay_start_; |
582 bool delay_complete_; | 607 bool delay_complete_; |
| 608 bool must_not_read_; |
583 mutable int url_request_jobs_created_count_; | 609 mutable int url_request_jobs_created_count_; |
584 std::set<std::string> supported_schemes_; | 610 std::set<std::string> supported_schemes_; |
585 | 611 |
586 DISALLOW_COPY_AND_ASSIGN(TestURLRequestJobFactory); | 612 DISALLOW_COPY_AND_ASSIGN(TestURLRequestJobFactory); |
587 }; | 613 }; |
588 | 614 |
589 // Associated with an URLRequest to determine if the URLRequest gets deleted. | 615 // Associated with an URLRequest to determine if the URLRequest gets deleted. |
590 class TestUserData : public base::SupportsUserData::Data { | 616 class TestUserData : public base::SupportsUserData::Data { |
591 public: | 617 public: |
592 explicit TestUserData(bool* was_deleted) | 618 explicit TestUserData(bool* was_deleted) |
(...skipping 10 matching lines...) Expand all Loading... |
603 : public TestContentBrowserClient { | 629 : public TestContentBrowserClient { |
604 public: | 630 public: |
605 bool ShouldSwapProcessesForRedirect(ResourceContext* resource_context, | 631 bool ShouldSwapProcessesForRedirect(ResourceContext* resource_context, |
606 const GURL& current_url, | 632 const GURL& current_url, |
607 const GURL& new_url) override { | 633 const GURL& new_url) override { |
608 return true; | 634 return true; |
609 } | 635 } |
610 }; | 636 }; |
611 | 637 |
612 enum GenericResourceThrottleFlags { | 638 enum GenericResourceThrottleFlags { |
613 NONE = 0, | 639 NONE = 0, |
614 DEFER_STARTING_REQUEST = 1 << 0, | 640 DEFER_STARTING_REQUEST = 1 << 0, |
615 DEFER_PROCESSING_RESPONSE = 1 << 1, | 641 DEFER_PROCESSING_RESPONSE = 1 << 1, |
616 CANCEL_BEFORE_START = 1 << 2 | 642 CANCEL_BEFORE_START = 1 << 2, |
| 643 CANCEL_PROCESSING_RESPONSE = 1 << 3, |
| 644 MUST_NOT_CACHE_BODY = 1 << 4, |
617 }; | 645 }; |
618 | 646 |
619 // Throttle that tracks the current throttle blocking a request. Only one | 647 // Throttle that tracks the current throttle blocking a request. Only one |
620 // can throttle any request at a time. | 648 // can throttle any request at a time. |
621 class GenericResourceThrottle : public ResourceThrottle { | 649 class GenericResourceThrottle : public ResourceThrottle { |
622 public: | 650 public: |
623 // The value is used to indicate that the throttle should not provide | 651 // The value is used to indicate that the throttle should not provide |
624 // a error code when cancelling a request. net::OK is used, because this | 652 // a error code when cancelling a request. net::OK is used, because this |
625 // is not an error code. | 653 // is not an error code. |
626 static const int USE_DEFAULT_CANCEL_ERROR_CODE = net::OK; | 654 static const int USE_DEFAULT_CANCEL_ERROR_CODE = net::OK; |
(...skipping 24 matching lines...) Expand all Loading... |
651 } | 679 } |
652 } | 680 } |
653 } | 681 } |
654 | 682 |
655 void WillProcessResponse(bool* defer) override { | 683 void WillProcessResponse(bool* defer) override { |
656 ASSERT_EQ(NULL, active_throttle_); | 684 ASSERT_EQ(NULL, active_throttle_); |
657 if (flags_ & DEFER_PROCESSING_RESPONSE) { | 685 if (flags_ & DEFER_PROCESSING_RESPONSE) { |
658 active_throttle_ = this; | 686 active_throttle_ = this; |
659 *defer = true; | 687 *defer = true; |
660 } | 688 } |
| 689 |
| 690 if (flags_ & CANCEL_PROCESSING_RESPONSE) { |
| 691 if (error_code_for_cancellation_ == USE_DEFAULT_CANCEL_ERROR_CODE) { |
| 692 controller()->Cancel(); |
| 693 } else { |
| 694 controller()->CancelWithError(error_code_for_cancellation_); |
| 695 } |
| 696 } |
661 } | 697 } |
662 | 698 |
663 const char* GetNameForLogging() const override { | 699 const char* GetNameForLogging() const override { |
664 return "GenericResourceThrottle"; | 700 return "GenericResourceThrottle"; |
665 } | 701 } |
666 | 702 |
667 void Resume() { | 703 void Resume() { |
668 ASSERT_TRUE(this == active_throttle_); | 704 ASSERT_TRUE(this == active_throttle_); |
669 active_throttle_ = NULL; | 705 active_throttle_ = NULL; |
670 controller()->Resume(); | 706 controller()->Resume(); |
671 } | 707 } |
672 | 708 |
673 static GenericResourceThrottle* active_throttle() { | 709 static GenericResourceThrottle* active_throttle() { |
674 return active_throttle_; | 710 return active_throttle_; |
675 } | 711 } |
676 | 712 |
| 713 bool MustProcessResponseBeforeReadingBody() override { |
| 714 return flags_ & MUST_NOT_CACHE_BODY; |
| 715 } |
| 716 |
677 private: | 717 private: |
678 int flags_; // bit-wise union of GenericResourceThrottleFlags. | 718 int flags_; // bit-wise union of GenericResourceThrottleFlags. |
679 int error_code_for_cancellation_; | 719 int error_code_for_cancellation_; |
680 | 720 |
681 // The currently active throttle, if any. | 721 // The currently active throttle, if any. |
682 static GenericResourceThrottle* active_throttle_; | 722 static GenericResourceThrottle* active_throttle_; |
683 }; | 723 }; |
684 // static | 724 // static |
685 GenericResourceThrottle* GenericResourceThrottle::active_throttle_ = NULL; | 725 GenericResourceThrottle* GenericResourceThrottle::active_throttle_ = NULL; |
686 | 726 |
(...skipping 1811 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2498 SetResponse(raw_headers, response_data); | 2538 SetResponse(raw_headers, response_data); |
2499 job_factory_->SetDelayedCompleteJobGeneration(true); | 2539 job_factory_->SetDelayedCompleteJobGeneration(true); |
2500 HandleScheme("http"); | 2540 HandleScheme("http"); |
2501 | 2541 |
2502 MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id, | 2542 MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id, |
2503 GURL("http://example.com/blah"), | 2543 GURL("http://example.com/blah"), |
2504 RESOURCE_TYPE_MAIN_FRAME); | 2544 RESOURCE_TYPE_MAIN_FRAME); |
2505 // Return some data so that the request is identified as a download | 2545 // Return some data so that the request is identified as a download |
2506 // and the proper resource handlers are created. | 2546 // and the proper resource handlers are created. |
2507 EXPECT_TRUE(net::URLRequestTestJob::ProcessOnePendingMessage()); | 2547 EXPECT_TRUE(net::URLRequestTestJob::ProcessOnePendingMessage()); |
| 2548 base::RunLoop().RunUntilIdle(); |
2508 | 2549 |
2509 // And now simulate a cancellation coming from the renderer. | 2550 // And now simulate a cancellation coming from the renderer. |
2510 ResourceHostMsg_CancelRequest msg(request_id); | 2551 ResourceHostMsg_CancelRequest msg(request_id); |
2511 host_.OnMessageReceived(msg, filter_.get()); | 2552 host_.OnMessageReceived(msg, filter_.get()); |
2512 | 2553 |
2513 // Since the request had already started processing as a download, | 2554 // Since the request had already started processing as a download, |
2514 // the cancellation above should have been ignored and the request | 2555 // the cancellation above should have been ignored and the request |
2515 // should still be alive. | 2556 // should still be alive. |
2516 EXPECT_EQ(1, host_.pending_requests()); | 2557 EXPECT_EQ(1, host_.pending_requests()); |
2517 | 2558 |
2518 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} | 2559 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} |
| 2560 base::RunLoop().RunUntilIdle(); |
2519 } | 2561 } |
2520 | 2562 |
2521 TEST_P(ResourceDispatcherHostTest, CancelRequestsForContext) { | 2563 TEST_P(ResourceDispatcherHostTest, CancelRequestsForContext) { |
2522 EXPECT_EQ(0, host_.pending_requests()); | 2564 EXPECT_EQ(0, host_.pending_requests()); |
2523 | 2565 |
2524 int render_view_id = 0; | 2566 int render_view_id = 0; |
2525 int request_id = 1; | 2567 int request_id = 1; |
2526 | 2568 |
2527 std::string raw_headers("HTTP\n" | 2569 std::string raw_headers("HTTP\n" |
2528 "Content-disposition: attachment; filename=foo\n\n"); | 2570 "Content-disposition: attachment; filename=foo\n\n"); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2569 EXPECT_EQ(0, host_.pending_requests()); | 2611 EXPECT_EQ(0, host_.pending_requests()); |
2570 | 2612 |
2571 base::RunLoop().RunUntilIdle(); | 2613 base::RunLoop().RunUntilIdle(); |
2572 } else { | 2614 } else { |
2573 MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id, | 2615 MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id, |
2574 download_url, RESOURCE_TYPE_MAIN_FRAME); | 2616 download_url, RESOURCE_TYPE_MAIN_FRAME); |
2575 | 2617 |
2576 // Return some data so that the request is identified as a download | 2618 // Return some data so that the request is identified as a download |
2577 // and the proper resource handlers are created. | 2619 // and the proper resource handlers are created. |
2578 EXPECT_TRUE(net::URLRequestTestJob::ProcessOnePendingMessage()); | 2620 EXPECT_TRUE(net::URLRequestTestJob::ProcessOnePendingMessage()); |
| 2621 base::RunLoop().RunUntilIdle(); |
2579 | 2622 |
2580 // And now simulate a cancellation coming from the renderer. | 2623 // And now simulate a cancellation coming from the renderer. |
2581 ResourceHostMsg_CancelRequest msg(request_id); | 2624 ResourceHostMsg_CancelRequest msg(request_id); |
2582 host_.OnMessageReceived(msg, filter_.get()); | 2625 host_.OnMessageReceived(msg, filter_.get()); |
2583 | 2626 |
2584 // Since the request had already started processing as a download, | 2627 // Since the request had already started processing as a download, |
2585 // the cancellation above should have been ignored and the request | 2628 // the cancellation above should have been ignored and the request |
2586 // should still be alive. | 2629 // should still be alive. |
2587 EXPECT_EQ(1, host_.pending_requests()); | 2630 EXPECT_EQ(1, host_.pending_requests()); |
2588 | 2631 |
2589 // Cancelling by other methods shouldn't work either. | 2632 // Cancelling by other methods shouldn't work either. |
2590 host_.CancelRequestsForProcess(render_view_id); | 2633 host_.CancelRequestsForProcess(render_view_id); |
2591 EXPECT_EQ(1, host_.pending_requests()); | 2634 EXPECT_EQ(1, host_.pending_requests()); |
2592 | 2635 |
2593 // Cancelling by context should work. | 2636 // Cancelling by context should work. |
2594 host_.CancelRequestsForContext(filter_->resource_context()); | 2637 host_.CancelRequestsForContext(filter_->resource_context()); |
2595 EXPECT_EQ(0, host_.pending_requests()); | 2638 EXPECT_EQ(0, host_.pending_requests()); |
| 2639 |
| 2640 while (net::URLRequestTestJob::ProcessOnePendingMessage()) { |
| 2641 } |
| 2642 base::RunLoop().RunUntilIdle(); |
2596 } | 2643 } |
2597 } | 2644 } |
2598 | 2645 |
2599 TEST_P(ResourceDispatcherHostTest, CancelRequestsForContextDetached) { | 2646 TEST_P(ResourceDispatcherHostTest, CancelRequestsForContextDetached) { |
2600 EXPECT_EQ(0, host_.pending_requests()); | 2647 EXPECT_EQ(0, host_.pending_requests()); |
2601 | 2648 |
2602 int render_view_id = 0; | 2649 int render_view_id = 0; |
2603 int request_id = 1; | 2650 int request_id = 1; |
2604 | 2651 |
2605 MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id, | 2652 MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id, |
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2957 SetResponse("HTTP/1.1 200 OK\n" | 3004 SetResponse("HTTP/1.1 200 OK\n" |
2958 "Content-Type: text/plain\n\n", | 3005 "Content-Type: text/plain\n\n", |
2959 kResponseBody); | 3006 kResponseBody); |
2960 ResourceHostMsg_FollowRedirect redirect_msg(request_id); | 3007 ResourceHostMsg_FollowRedirect redirect_msg(request_id); |
2961 host_.OnMessageReceived(redirect_msg, filter_.get()); | 3008 host_.OnMessageReceived(redirect_msg, filter_.get()); |
2962 base::RunLoop().RunUntilIdle(); | 3009 base::RunLoop().RunUntilIdle(); |
2963 | 3010 |
2964 // Flush all the pending requests to get the response through the | 3011 // Flush all the pending requests to get the response through the |
2965 // MimeTypeResourceHandler. | 3012 // MimeTypeResourceHandler. |
2966 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} | 3013 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} |
| 3014 base::RunLoop().RunUntilIdle(); |
2967 | 3015 |
2968 // Restore, now that we've set up a transfer. | 3016 // Restore, now that we've set up a transfer. |
2969 SetBrowserClientForTesting(old_client); | 3017 SetBrowserClientForTesting(old_client); |
2970 | 3018 |
2971 // This second filter is used to emulate a second process. | 3019 // This second filter is used to emulate a second process. |
2972 scoped_refptr<ForwardingFilter> second_filter = MakeForwardingFilter(); | 3020 scoped_refptr<ForwardingFilter> second_filter = MakeForwardingFilter(); |
2973 | 3021 |
2974 int new_render_view_id = 1; | 3022 int new_render_view_id = 1; |
2975 int new_request_id = 2; | 3023 int new_request_id = 2; |
2976 | 3024 |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3125 SetResponse("HTTP/1.1 200 OK\n" | 3173 SetResponse("HTTP/1.1 200 OK\n" |
3126 "Content-Type: text/plain\n\n", | 3174 "Content-Type: text/plain\n\n", |
3127 kResponseBody); | 3175 kResponseBody); |
3128 ResourceHostMsg_FollowRedirect redirect_msg2(request_id); | 3176 ResourceHostMsg_FollowRedirect redirect_msg2(request_id); |
3129 host_.OnMessageReceived(redirect_msg2, filter_.get()); | 3177 host_.OnMessageReceived(redirect_msg2, filter_.get()); |
3130 base::RunLoop().RunUntilIdle(); | 3178 base::RunLoop().RunUntilIdle(); |
3131 | 3179 |
3132 // Flush all the pending requests to get the response through the | 3180 // Flush all the pending requests to get the response through the |
3133 // MimeTypeResourceHandler. | 3181 // MimeTypeResourceHandler. |
3134 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} | 3182 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} |
| 3183 base::RunLoop().RunUntilIdle(); |
3135 | 3184 |
3136 // Restore. | 3185 // Restore. |
3137 SetBrowserClientForTesting(old_client); | 3186 SetBrowserClientForTesting(old_client); |
3138 | 3187 |
3139 // This second filter is used to emulate a second process. | 3188 // This second filter is used to emulate a second process. |
3140 scoped_refptr<ForwardingFilter> second_filter = MakeForwardingFilter(); | 3189 scoped_refptr<ForwardingFilter> second_filter = MakeForwardingFilter(); |
3141 | 3190 |
3142 int new_render_view_id = 1; | 3191 int new_render_view_id = 1; |
3143 int new_request_id = 2; | 3192 int new_request_id = 2; |
3144 | 3193 |
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3731 TEST_P(ResourceDispatcherHostTest, TransferRequestRedirectedDownload) { | 3780 TEST_P(ResourceDispatcherHostTest, TransferRequestRedirectedDownload) { |
3732 int initial_count(web_contents_observer_->resource_request_redirect_count()); | 3781 int initial_count(web_contents_observer_->resource_request_redirect_count()); |
3733 | 3782 |
3734 MakeWebContentsAssociatedDownloadRequest( | 3783 MakeWebContentsAssociatedDownloadRequest( |
3735 1, net::URLRequestTestJob::test_url_redirect_to_url_2()); | 3784 1, net::URLRequestTestJob::test_url_redirect_to_url_2()); |
3736 base::RunLoop().RunUntilIdle(); | 3785 base::RunLoop().RunUntilIdle(); |
3737 EXPECT_EQ(initial_count, | 3786 EXPECT_EQ(initial_count, |
3738 web_contents_observer_->resource_request_redirect_count()); | 3787 web_contents_observer_->resource_request_redirect_count()); |
3739 } | 3788 } |
3740 | 3789 |
| 3790 // Tests that a ResourceThrottle that needs to process the response before any |
| 3791 // part of the body is read can do so. |
| 3792 TEST_P(ResourceDispatcherHostTest, ThrottleMustProcessResponseBeforeRead) { |
| 3793 // Ensure all jobs will check that no read operation is called. |
| 3794 job_factory_->SetMustNotReadJobGeneration(true); |
| 3795 HandleScheme("http"); |
| 3796 |
| 3797 // Create a ResourceThrottle that must process the response before any part of |
| 3798 // the body is read. This throttle will also cancel the request in |
| 3799 // WillProcessResponse. |
| 3800 TestResourceDispatcherHostDelegate delegate; |
| 3801 int throttle_flags = CANCEL_PROCESSING_RESPONSE | MUST_NOT_CACHE_BODY; |
| 3802 delegate.set_flags(throttle_flags); |
| 3803 host_.SetDelegate(&delegate); |
| 3804 |
| 3805 // This response should normally result in the MIME type being sniffed, which |
| 3806 // requires reading the body. |
| 3807 std::string raw_headers( |
| 3808 "HTTP/1.1 200 OK\n" |
| 3809 "Content-Type: text/plain; charset=utf-8\n\n"); |
| 3810 std::string response_data("p { text-align: center; }"); |
| 3811 SetResponse(raw_headers, response_data); |
| 3812 |
| 3813 MakeTestRequestWithResourceType(filter_.get(), filter_->child_id(), 1, |
| 3814 GURL("http://example.com/blah"), |
| 3815 RESOURCE_TYPE_STYLESHEET); |
| 3816 |
| 3817 while (net::URLRequestTestJob::ProcessOnePendingMessage()) { |
| 3818 } |
| 3819 base::RunLoop().RunUntilIdle(); |
| 3820 } |
| 3821 |
3741 // A URLRequestTestJob that sets a test certificate on the |ssl_info| | 3822 // A URLRequestTestJob that sets a test certificate on the |ssl_info| |
3742 // field of the response. | 3823 // field of the response. |
3743 class TestHTTPSURLRequestJob : public net::URLRequestTestJob { | 3824 class TestHTTPSURLRequestJob : public net::URLRequestTestJob { |
3744 public: | 3825 public: |
3745 TestHTTPSURLRequestJob(net::URLRequest* request, | 3826 TestHTTPSURLRequestJob(net::URLRequest* request, |
3746 net::NetworkDelegate* network_delegate, | 3827 net::NetworkDelegate* network_delegate, |
3747 const std::string& response_headers, | 3828 const std::string& response_headers, |
3748 const std::string& response_data, | 3829 const std::string& response_data, |
3749 bool auto_advance) | 3830 bool auto_advance) |
3750 : net::URLRequestTestJob(request, | 3831 : net::URLRequestTestJob(request, |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3794 if (delay_start_) { | 3875 if (delay_start_) { |
3795 return new URLRequestTestDelayedStartJob( | 3876 return new URLRequestTestDelayedStartJob( |
3796 request, network_delegate, | 3877 request, network_delegate, |
3797 test_fixture_->response_headers_, test_fixture_->response_data_, | 3878 test_fixture_->response_headers_, test_fixture_->response_data_, |
3798 false); | 3879 false); |
3799 } else if (delay_complete_) { | 3880 } else if (delay_complete_) { |
3800 return new URLRequestTestDelayedCompletionJob( | 3881 return new URLRequestTestDelayedCompletionJob( |
3801 request, network_delegate, | 3882 request, network_delegate, |
3802 test_fixture_->response_headers_, test_fixture_->response_data_, | 3883 test_fixture_->response_headers_, test_fixture_->response_data_, |
3803 false); | 3884 false); |
| 3885 } else if (must_not_read_) { |
| 3886 return new URLRequestMustNotReadTestJob(request, network_delegate, |
| 3887 test_fixture_->response_headers_, |
| 3888 test_fixture_->response_data_); |
3804 } else if (test_fixture_->use_test_ssl_certificate_) { | 3889 } else if (test_fixture_->use_test_ssl_certificate_) { |
3805 return new TestHTTPSURLRequestJob(request, network_delegate, | 3890 return new TestHTTPSURLRequestJob(request, network_delegate, |
3806 test_fixture_->response_headers_, | 3891 test_fixture_->response_headers_, |
3807 test_fixture_->response_data_, false); | 3892 test_fixture_->response_data_, false); |
3808 } else { | 3893 } else { |
3809 return new net::URLRequestTestJob( | 3894 return new net::URLRequestTestJob( |
3810 request, network_delegate, test_fixture_->response_headers_, | 3895 request, network_delegate, test_fixture_->response_headers_, |
3811 test_fixture_->response_data_, test_fixture_->auto_advance_); | 3896 test_fixture_->response_data_, test_fixture_->auto_advance_); |
3812 } | 3897 } |
3813 } | 3898 } |
(...skipping 12 matching lines...) Expand all Loading... |
3826 return nullptr; | 3911 return nullptr; |
3827 } | 3912 } |
3828 | 3913 |
3829 INSTANTIATE_TEST_CASE_P( | 3914 INSTANTIATE_TEST_CASE_P( |
3830 ResourceDispatcherHostTests, | 3915 ResourceDispatcherHostTests, |
3831 ResourceDispatcherHostTest, | 3916 ResourceDispatcherHostTest, |
3832 testing::Values(TestConfig::kDefault, | 3917 testing::Values(TestConfig::kDefault, |
3833 TestConfig::kOptimizeIPCForSmallResourceEnabled)); | 3918 TestConfig::kOptimizeIPCForSmallResourceEnabled)); |
3834 | 3919 |
3835 } // namespace content | 3920 } // namespace content |
OLD | NEW |