Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(146)

Side by Side Diff: content/browser/loader/resource_dispatcher_host_unittest.cc

Issue 25772002: Allows prefetch requests to live beyond the renderer by delaying (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 <vector> 5 #include <vector>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/files/file_path.h" 8 #include "base/files/file_path.h"
9 #include "base/memory/scoped_vector.h" 9 #include "base/memory/scoped_vector.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
11 #include "base/pickle.h" 11 #include "base/pickle.h"
12 #include "base/run_loop.h" 12 #include "base/run_loop.h"
13 #include "base/strings/string_number_conversions.h" 13 #include "base/strings/string_number_conversions.h"
14 #include "base/strings/string_split.h" 14 #include "base/strings/string_split.h"
15 #include "content/browser/browser_thread_impl.h" 15 #include "content/browser/browser_thread_impl.h"
16 #include "content/browser/child_process_security_policy_impl.h" 16 #include "content/browser/child_process_security_policy_impl.h"
17 #include "content/browser/loader/resource_dispatcher_host_impl.h" 17 #include "content/browser/loader/resource_dispatcher_host_impl.h"
18 #include "content/browser/loader/resource_loader.h"
18 #include "content/browser/loader/resource_message_filter.h" 19 #include "content/browser/loader/resource_message_filter.h"
19 #include "content/browser/loader/resource_request_info_impl.h" 20 #include "content/browser/loader/resource_request_info_impl.h"
20 #include "content/browser/worker_host/worker_service_impl.h" 21 #include "content/browser/worker_host/worker_service_impl.h"
21 #include "content/common/child_process_host_impl.h" 22 #include "content/common/child_process_host_impl.h"
22 #include "content/common/resource_messages.h" 23 #include "content/common/resource_messages.h"
23 #include "content/common/view_messages.h" 24 #include "content/common/view_messages.h"
24 #include "content/public/browser/global_request_id.h" 25 #include "content/public/browser/global_request_id.h"
25 #include "content/public/browser/resource_context.h" 26 #include "content/public/browser/resource_context.h"
26 #include "content/public/browser/resource_dispatcher_host_delegate.h" 27 #include "content/public/browser/resource_dispatcher_host_delegate.h"
27 #include "content/public/browser/resource_request_info.h" 28 #include "content/public/browser/resource_request_info.h"
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 517
517 class ResourceDispatcherHostTest : public testing::Test, 518 class ResourceDispatcherHostTest : public testing::Test,
518 public IPC::Sender { 519 public IPC::Sender {
519 public: 520 public:
520 ResourceDispatcherHostTest() 521 ResourceDispatcherHostTest()
521 : ui_thread_(BrowserThread::UI, &message_loop_), 522 : ui_thread_(BrowserThread::UI, &message_loop_),
522 file_thread_(BrowserThread::FILE_USER_BLOCKING, &message_loop_), 523 file_thread_(BrowserThread::FILE_USER_BLOCKING, &message_loop_),
523 cache_thread_(BrowserThread::CACHE, &message_loop_), 524 cache_thread_(BrowserThread::CACHE, &message_loop_),
524 io_thread_(BrowserThread::IO, &message_loop_), 525 io_thread_(BrowserThread::IO, &message_loop_),
525 old_factory_(NULL), 526 old_factory_(NULL),
526 resource_type_(ResourceType::SUB_RESOURCE),
527 send_data_received_acks_(false) { 527 send_data_received_acks_(false) {
528 browser_context_.reset(new TestBrowserContext()); 528 browser_context_.reset(new TestBrowserContext());
529 BrowserContext::EnsureResourceContextInitialized(browser_context_.get()); 529 BrowserContext::EnsureResourceContextInitialized(browser_context_.get());
530 message_loop_.RunUntilIdle(); 530 message_loop_.RunUntilIdle();
531 filter_ = new ForwardingFilter( 531 filter_ = new ForwardingFilter(
532 this, browser_context_->GetResourceContext()); 532 this, browser_context_->GetResourceContext());
533 } 533 }
534 534
535 virtual ~ResourceDispatcherHostTest() { 535 virtual ~ResourceDispatcherHostTest() {
536 for (std::set<int>::iterator it = child_ids_.begin(); 536 for (std::set<int>::iterator it = child_ids_.begin();
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 if (ResourceDispatcherHostImpl::Get()) 587 if (ResourceDispatcherHostImpl::Get())
588 ResourceDispatcherHostImpl::Get()->CancelRequestsForContext( 588 ResourceDispatcherHostImpl::Get()->CancelRequestsForContext(
589 browser_context_->GetResourceContext()); 589 browser_context_->GetResourceContext());
590 590
591 WorkerServiceImpl::GetInstance()->PerformTeardownForTesting(); 591 WorkerServiceImpl::GetInstance()->PerformTeardownForTesting();
592 592
593 browser_context_.reset(); 593 browser_context_.reset();
594 message_loop_.RunUntilIdle(); 594 message_loop_.RunUntilIdle();
595 } 595 }
596 596
597 // Creates a request using the current test object as the filter. 597 // Creates a request using the current test object as the filter and
598 // SubResource as the resource type.
598 void MakeTestRequest(int render_view_id, 599 void MakeTestRequest(int render_view_id,
599 int request_id, 600 int request_id,
600 const GURL& url); 601 const GURL& url);
601 602
602 // Generates a request using the given filter. This will probably be a 603 // Generates a request using the given filter and resource type.
603 // ForwardingFilter. 604 void MakeTestRequestWithResourceType(ResourceMessageFilter* filter,
604 void MakeTestRequest(ResourceMessageFilter* filter, 605 int render_view_id, int request_id,
605 int render_view_id, 606 const GURL& url,
606 int request_id, 607 ResourceType::Type type);
607 const GURL& url);
608 608
609 void CancelRequest(int request_id); 609 void CancelRequest(int request_id);
610 610
611 void CompleteStartRequest(int request_id); 611 void CompleteStartRequest(int request_id);
612 void CompleteStartRequest(ResourceMessageFilter* filter, int request_id); 612 void CompleteStartRequest(ResourceMessageFilter* filter, int request_id);
613 613
614 void EnsureSchemeIsAllowed(const std::string& scheme) { 614 void EnsureSchemeIsAllowed(const std::string& scheme) {
615 ChildProcessSecurityPolicyImpl* policy = 615 ChildProcessSecurityPolicyImpl* policy =
616 ChildProcessSecurityPolicyImpl::GetInstance(); 616 ChildProcessSecurityPolicyImpl::GetInstance();
617 if (!policy->IsWebSafeScheme(scheme)) 617 if (!policy->IsWebSafeScheme(scheme))
618 policy->RegisterWebSafeScheme(scheme); 618 policy->RegisterWebSafeScheme(scheme);
619 } 619 }
620 620
621 void EnsureTestSchemeIsAllowed() { 621 void EnsureTestSchemeIsAllowed() {
622 EnsureSchemeIsAllowed("test"); 622 EnsureSchemeIsAllowed("test");
623 } 623 }
624 624
625 // Sets a particular response for any request from now on. To switch back to 625 // Sets a particular response for any request from now on. To switch back to
626 // the default bahavior, pass an empty |headers|. |headers| should be raw- 626 // the default bahavior, pass an empty |headers|. |headers| should be raw-
627 // formatted (NULLs instead of EOLs). 627 // formatted (NULLs instead of EOLs).
628 void SetResponse(const std::string& headers, const std::string& data) { 628 void SetResponse(const std::string& headers, const std::string& data) {
629 response_headers_ = net::HttpUtil::AssembleRawHeaders(headers.data(), 629 response_headers_ = net::HttpUtil::AssembleRawHeaders(headers.data(),
630 headers.size()); 630 headers.size());
631 response_data_ = data; 631 response_data_ = data;
632 } 632 }
633 void SetResponse(const std::string& headers) { 633 void SetResponse(const std::string& headers) {
634 SetResponse(headers, std::string()); 634 SetResponse(headers, std::string());
635 } 635 }
636 636
637 // Sets a particular resource type for any request from now on.
638 void SetResourceType(ResourceType::Type type) {
639 resource_type_ = type;
640 }
641
642 void SendDataReceivedACKs(bool send_acks) { 637 void SendDataReceivedACKs(bool send_acks) {
643 send_data_received_acks_ = send_acks; 638 send_data_received_acks_ = send_acks;
644 } 639 }
645 640
646 // Intercepts requests for the given protocol. 641 // Intercepts requests for the given protocol.
647 void HandleScheme(const std::string& scheme) { 642 void HandleScheme(const std::string& scheme) {
648 DCHECK(scheme_.empty()); 643 DCHECK(scheme_.empty());
649 DCHECK(!old_factory_); 644 DCHECK(!old_factory_);
650 scheme_ = scheme; 645 scheme_ = scheme;
651 old_factory_ = net::URLRequest::Deprecated::RegisterProtocolFactory( 646 old_factory_ = net::URLRequest::Deprecated::RegisterProtocolFactory(
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
717 BrowserThreadImpl cache_thread_; 712 BrowserThreadImpl cache_thread_;
718 BrowserThreadImpl io_thread_; 713 BrowserThreadImpl io_thread_;
719 scoped_ptr<TestBrowserContext> browser_context_; 714 scoped_ptr<TestBrowserContext> browser_context_;
720 scoped_refptr<ForwardingFilter> filter_; 715 scoped_refptr<ForwardingFilter> filter_;
721 ResourceDispatcherHostImpl host_; 716 ResourceDispatcherHostImpl host_;
722 ResourceIPCAccumulator accum_; 717 ResourceIPCAccumulator accum_;
723 std::string response_headers_; 718 std::string response_headers_;
724 std::string response_data_; 719 std::string response_data_;
725 std::string scheme_; 720 std::string scheme_;
726 net::URLRequest::ProtocolFactory* old_factory_; 721 net::URLRequest::ProtocolFactory* old_factory_;
727 ResourceType::Type resource_type_;
728 bool send_data_received_acks_; 722 bool send_data_received_acks_;
729 std::set<int> child_ids_; 723 std::set<int> child_ids_;
730 static ResourceDispatcherHostTest* test_fixture_; 724 static ResourceDispatcherHostTest* test_fixture_;
731 static bool delay_start_; 725 static bool delay_start_;
732 static bool delay_complete_; 726 static bool delay_complete_;
733 static int url_request_jobs_created_count_; 727 static int url_request_jobs_created_count_;
734 }; 728 };
735 // Static. 729 // Static.
736 ResourceDispatcherHostTest* ResourceDispatcherHostTest::test_fixture_ = NULL; 730 ResourceDispatcherHostTest* ResourceDispatcherHostTest::test_fixture_ = NULL;
737 bool ResourceDispatcherHostTest::delay_start_ = false; 731 bool ResourceDispatcherHostTest::delay_start_ = false;
738 bool ResourceDispatcherHostTest::delay_complete_ = false; 732 bool ResourceDispatcherHostTest::delay_complete_ = false;
739 int ResourceDispatcherHostTest::url_request_jobs_created_count_ = 0; 733 int ResourceDispatcherHostTest::url_request_jobs_created_count_ = 0;
740 734
741 void ResourceDispatcherHostTest::MakeTestRequest(int render_view_id, 735 void ResourceDispatcherHostTest::MakeTestRequest(int render_view_id,
742 int request_id, 736 int request_id,
743 const GURL& url) { 737 const GURL& url) {
744 MakeTestRequest(filter_.get(), render_view_id, request_id, url); 738 MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id,
739 url, ResourceType::SUB_RESOURCE);
745 } 740 }
746 741
747 void ResourceDispatcherHostTest::MakeTestRequest( 742 void ResourceDispatcherHostTest::MakeTestRequestWithResourceType(
748 ResourceMessageFilter* filter, 743 ResourceMessageFilter* filter,
749 int render_view_id, 744 int render_view_id,
750 int request_id, 745 int request_id,
751 const GURL& url) { 746 const GURL& url,
747 ResourceType::Type type) {
752 // If it's already there, this'll be dropped on the floor, which is fine. 748 // If it's already there, this'll be dropped on the floor, which is fine.
753 child_ids_.insert(filter->child_id()); 749 child_ids_.insert(filter->child_id());
754 750
755 ResourceHostMsg_Request request = 751 ResourceHostMsg_Request request =
756 CreateResourceRequest("GET", resource_type_, url); 752 CreateResourceRequest("GET", type, url);
757 ResourceHostMsg_RequestResource msg(render_view_id, request_id, request); 753 ResourceHostMsg_RequestResource msg(render_view_id, request_id, request);
758 bool msg_was_ok; 754 bool msg_was_ok;
759 host_.OnMessageReceived(msg, filter, &msg_was_ok); 755 host_.OnMessageReceived(msg, filter, &msg_was_ok);
760 KickOffRequest(); 756 KickOffRequest();
761 } 757 }
762 758
763 void ResourceDispatcherHostTest::CancelRequest(int request_id) { 759 void ResourceDispatcherHostTest::CancelRequest(int request_id) {
764 host_.CancelRequest(filter_->child_id(), request_id, false); 760 host_.CancelRequest(filter_->child_id(), request_id, false);
765 } 761 }
766 762
767 void ResourceDispatcherHostTest::CompleteStartRequest(int request_id) { 763 void ResourceDispatcherHostTest::CompleteStartRequest(int request_id) {
768 CompleteStartRequest(filter_.get(), request_id); 764 CompleteStartRequest(filter_.get(), request_id);
769 } 765 }
770 766
771 void ResourceDispatcherHostTest::CompleteStartRequest( 767 void ResourceDispatcherHostTest::CompleteStartRequest(
772 ResourceMessageFilter* filter, 768 ResourceMessageFilter* filter,
773 int request_id) { 769 int request_id) {
774 GlobalRequestID gid(filter->child_id(), request_id); 770 GlobalRequestID gid(filter->child_id(), request_id);
775 net::URLRequest* req = host_.GetURLRequest(gid); 771 net::URLRequest* req = host_.GetURLRequest(gid);
776 EXPECT_TRUE(req); 772 EXPECT_TRUE(req);
777 if (req) 773 if (req)
778 URLRequestTestDelayedStartJob::CompleteStart(req); 774 URLRequestTestDelayedStartJob::CompleteStart(req);
779 } 775 }
780 776
777 void CheckRequestCompleteErrorCode(const IPC::Message& message,
778 int expected_error_code) {
779 // Verify that there was no error.
780 int request_id;
781 int error_code;
782
783 ASSERT_EQ(ResourceMsg_RequestComplete::ID, message.type());
784
785 PickleIterator iter(message);
786 ASSERT_TRUE(IPC::ReadParam(&message, &iter, &request_id));
787 ASSERT_TRUE(IPC::ReadParam(&message, &iter, &error_code));
788 ASSERT_EQ(error_code, expected_error_code);
789 }
790
791 void ExtractDataOffsetAndLength(const IPC::Message& message, int* data_offset,
792 int* data_length) {
793 PickleIterator iter(message);
794 int request_id;
795 ASSERT_TRUE(IPC::ReadParam(&message, &iter, &request_id));
796 ASSERT_TRUE(IPC::ReadParam(&message, &iter, data_offset));
797 ASSERT_TRUE(IPC::ReadParam(&message, &iter, data_length));
798 }
799
781 void CheckSuccessfulRequest(const std::vector<IPC::Message>& messages, 800 void CheckSuccessfulRequest(const std::vector<IPC::Message>& messages,
782 const std::string& reference_data) { 801 const std::string& reference_data) {
783 // A successful request will have received 4 messages: 802 // A successful request will have received 4 messages:
784 // ReceivedResponse (indicates headers received) 803 // ReceivedResponse (indicates headers received)
785 // SetDataBuffer (contains shared memory handle) 804 // SetDataBuffer (contains shared memory handle)
786 // DataReceived (data offset and length into shared memory) 805 // DataReceived (data offset and length into shared memory)
787 // RequestComplete (request is done) 806 // RequestComplete (request is done)
788 // 807 //
789 // This function verifies that we received 4 messages and that they 808 // This function verifies that we received 4 messages and that they
790 // are appropriate. 809 // are appropriate.
791 ASSERT_EQ(4U, messages.size()); 810 ASSERT_EQ(4U, messages.size());
792 811
793 // The first messages should be received response 812 // The first messages should be received response
794 ASSERT_EQ(ResourceMsg_ReceivedResponse::ID, messages[0].type()); 813 ASSERT_EQ(ResourceMsg_ReceivedResponse::ID, messages[0].type());
795 814
796 ASSERT_EQ(ResourceMsg_SetDataBuffer::ID, messages[1].type()); 815 ASSERT_EQ(ResourceMsg_SetDataBuffer::ID, messages[1].type());
797 816
798 PickleIterator iter(messages[1]); 817 PickleIterator iter(messages[1]);
799 int request_id; 818 int request_id;
800 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &request_id)); 819 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &request_id));
801 base::SharedMemoryHandle shm_handle; 820 base::SharedMemoryHandle shm_handle;
802 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &shm_handle)); 821 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &shm_handle));
803 int shm_size; 822 int shm_size;
804 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &shm_size)); 823 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &shm_size));
805 824
806 // Followed by the data, currently we only do the data in one chunk, but 825 // Followed by the data, currently we only do the data in one chunk, but
807 // should probably test multiple chunks later 826 // should probably test multiple chunks later
808 ASSERT_EQ(ResourceMsg_DataReceived::ID, messages[2].type()); 827 ASSERT_EQ(ResourceMsg_DataReceived::ID, messages[2].type());
809 828
810 PickleIterator iter2(messages[2]);
811 ASSERT_TRUE(IPC::ReadParam(&messages[2], &iter2, &request_id));
812 int data_offset; 829 int data_offset;
813 ASSERT_TRUE(IPC::ReadParam(&messages[2], &iter2, &data_offset));
814 int data_length; 830 int data_length;
815 ASSERT_TRUE(IPC::ReadParam(&messages[2], &iter2, &data_length)); 831 ExtractDataOffsetAndLength(messages[2], &data_offset, &data_length);
816 832
817 ASSERT_EQ(reference_data.size(), static_cast<size_t>(data_length)); 833 ASSERT_EQ(reference_data.size(), static_cast<size_t>(data_length));
818 ASSERT_GE(shm_size, data_length); 834 ASSERT_GE(shm_size, data_length);
819 835
820 base::SharedMemory shared_mem(shm_handle, true); // read only 836 base::SharedMemory shared_mem(shm_handle, true); // read only
821 shared_mem.Map(data_length); 837 shared_mem.Map(data_length);
822 const char* data = static_cast<char*>(shared_mem.memory()) + data_offset; 838 const char* data = static_cast<char*>(shared_mem.memory()) + data_offset;
823 ASSERT_EQ(0, memcmp(reference_data.c_str(), data, data_length)); 839 ASSERT_EQ(0, memcmp(reference_data.c_str(), data, data_length));
824 840
825 // The last message should be all data received. 841 // The last message should be all data received.
826 ASSERT_EQ(ResourceMsg_RequestComplete::ID, messages[3].type()); 842 CheckRequestCompleteErrorCode(messages[3], net::OK);
843 }
844
845 void CheckSuccessfulRedirect(const std::vector<IPC::Message>& messages,
846 const std::string& reference_data) {
847 ASSERT_EQ(5U, messages.size());
848 ASSERT_EQ(ResourceMsg_ReceivedRedirect::ID, messages[0].type());
849
850 const std::vector<IPC::Message> second_req_msgs =
851 std::vector<IPC::Message>(messages.begin() + 1, messages.end());
852 CheckSuccessfulRequest(second_req_msgs, reference_data);
853 }
854
855 void CheckSuccessfulDetachedRequest(
856 const std::vector<IPC::Message>& messages) {
857 // A successful request will have received 2 messages:
858 // ReceivedResponse (indicates headers received)
859 // RequestComplete (request is done)
860 //
861 // This function verifies that we received 2 messages and that they
862 // are appropriate.
863 ASSERT_EQ(2U, messages.size());
864
865 // The first messages should be received response
866 ASSERT_EQ(ResourceMsg_ReceivedResponse::ID, messages[0].type());
867
868 // The last message should be all data received.
869 CheckRequestCompleteErrorCode(messages[1], net::OK);
827 } 870 }
828 871
829 void CheckFailedRequest(const std::vector<IPC::Message>& messages, 872 void CheckFailedRequest(const std::vector<IPC::Message>& messages,
830 const std::string& reference_data, 873 const std::string& reference_data,
831 int expected_error) { 874 int expected_error) {
832 ASSERT_LT(0U, messages.size()); 875 ASSERT_LT(0U, messages.size());
833 ASSERT_GE(2U, messages.size()); 876 ASSERT_GE(2U, messages.size());
834 size_t failure_index = messages.size() - 1; 877 size_t failure_index = messages.size() - 1;
835 878
836 if (messages.size() == 2) { 879 if (messages.size() == 2) {
837 EXPECT_EQ(ResourceMsg_ReceivedResponse::ID, messages[0].type()); 880 EXPECT_EQ(ResourceMsg_ReceivedResponse::ID, messages[0].type());
838 } 881 }
839 EXPECT_EQ(ResourceMsg_RequestComplete::ID, messages[failure_index].type());
840 882
841 int request_id; 883 CheckRequestCompleteErrorCode(messages[failure_index], expected_error);
842 int error_code;
843
844 PickleIterator iter(messages[failure_index]);
845 EXPECT_TRUE(IPC::ReadParam(&messages[failure_index], &iter, &request_id));
846 EXPECT_TRUE(IPC::ReadParam(&messages[failure_index], &iter, &error_code));
847 EXPECT_EQ(expected_error, error_code);
848 } 884 }
849 885
850 // Tests whether many messages get dispatched properly. 886 // Tests whether many messages get dispatched properly.
851 TEST_F(ResourceDispatcherHostTest, TestMany) { 887 TEST_F(ResourceDispatcherHostTest, TestMany) {
852 MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_1()); 888 MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_1());
853 MakeTestRequest(0, 2, net::URLRequestTestJob::test_url_2()); 889 MakeTestRequest(0, 2, net::URLRequestTestJob::test_url_2());
854 MakeTestRequest(0, 3, net::URLRequestTestJob::test_url_3()); 890 MakeTestRequest(0, 3, net::URLRequestTestJob::test_url_3());
891 MakeTestRequest(0, 4, net::URLRequestTestJob::test_url_4());
892 MakeTestRequest(0, 5, net::URLRequestTestJob::test_url_redirect_to_url_2());
893
894 // Finish the redirection
895 ResourceHostMsg_FollowRedirect redirect_msg(5, false, GURL());
896 bool msg_was_ok;
897 host_.OnMessageReceived(redirect_msg, filter_.get(), &msg_was_ok);
898 base::MessageLoop::current()->RunUntilIdle();
855 899
856 // flush all the pending requests 900 // flush all the pending requests
857 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} 901 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
858 902
859 // sorts out all the messages we saw by request 903 // sorts out all the messages we saw by request
860 ResourceIPCAccumulator::ClassifiedMessages msgs; 904 ResourceIPCAccumulator::ClassifiedMessages msgs;
861 accum_.GetClassifiedMessages(&msgs); 905 accum_.GetClassifiedMessages(&msgs);
862 906
863 // there are three requests, so we should have gotten them classified as such 907 // there are five requests, so we should have gotten them classified as such
864 ASSERT_EQ(3U, msgs.size()); 908 ASSERT_EQ(5U, msgs.size());
865 909
866 CheckSuccessfulRequest(msgs[0], net::URLRequestTestJob::test_data_1()); 910 CheckSuccessfulRequest(msgs[0], net::URLRequestTestJob::test_data_1());
867 CheckSuccessfulRequest(msgs[1], net::URLRequestTestJob::test_data_2()); 911 CheckSuccessfulRequest(msgs[1], net::URLRequestTestJob::test_data_2());
868 CheckSuccessfulRequest(msgs[2], net::URLRequestTestJob::test_data_3()); 912 CheckSuccessfulRequest(msgs[2], net::URLRequestTestJob::test_data_3());
913 CheckSuccessfulRequest(msgs[3], net::URLRequestTestJob::test_data_4());
914 CheckSuccessfulRedirect(msgs[4], net::URLRequestTestJob::test_data_2());
869 } 915 }
870 916
871 void CheckCancelledRequestCompleteMessage(const IPC::Message& message) { 917 // Tests whether messages get canceled properly. We issue four requests,
872 ASSERT_EQ(ResourceMsg_RequestComplete::ID, message.type()); 918 // cancel two of them, and make sure that each sent the proper notifications.
873
874 int request_id;
875 int error_code;
876
877 PickleIterator iter(message);
878 ASSERT_TRUE(IPC::ReadParam(&message, &iter, &request_id));
879 ASSERT_TRUE(IPC::ReadParam(&message, &iter, &error_code));
880
881 EXPECT_EQ(net::ERR_ABORTED, error_code);
882 }
883
884 // Tests whether messages get canceled properly. We issue three requests,
885 // cancel one of them, and make sure that each sent the proper notifications.
886 TEST_F(ResourceDispatcherHostTest, Cancel) { 919 TEST_F(ResourceDispatcherHostTest, Cancel) {
887 MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_1()); 920 MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_1());
888 MakeTestRequest(0, 2, net::URLRequestTestJob::test_url_2()); 921 MakeTestRequest(0, 2, net::URLRequestTestJob::test_url_2());
889 MakeTestRequest(0, 3, net::URLRequestTestJob::test_url_3()); 922 MakeTestRequest(0, 3, net::URLRequestTestJob::test_url_3());
923 MakeTestRequestWithResourceType(filter_.get(), 0, 4,
924 net::URLRequestTestJob::test_url_4(),
925 ResourceType::PREFETCH); // detachable type
926
890 CancelRequest(2); 927 CancelRequest(2);
891 928
929 // Cancel request must come from the renderer for a detachable resource to
930 // delay.
931 host_.CancelRequest(filter_->child_id(), 4, true);
932
892 // flush all the pending requests 933 // flush all the pending requests
893 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} 934 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
894 base::MessageLoop::current()->RunUntilIdle(); 935 base::MessageLoop::current()->RunUntilIdle();
895 936
896 ResourceIPCAccumulator::ClassifiedMessages msgs; 937 ResourceIPCAccumulator::ClassifiedMessages msgs;
897 accum_.GetClassifiedMessages(&msgs); 938 accum_.GetClassifiedMessages(&msgs);
898 939
899 // there are three requests, so we should have gotten them classified as such 940 // there are four requests, so we should have gotten them classified as such
900 ASSERT_EQ(3U, msgs.size()); 941 ASSERT_EQ(4U, msgs.size());
901 942
902 CheckSuccessfulRequest(msgs[0], net::URLRequestTestJob::test_data_1()); 943 CheckSuccessfulRequest(msgs[0], net::URLRequestTestJob::test_data_1());
903 CheckSuccessfulRequest(msgs[2], net::URLRequestTestJob::test_data_3()); 944 CheckSuccessfulRequest(msgs[2], net::URLRequestTestJob::test_data_3());
945 // The detachable resource should have delayed its cancellation and completed.
946 CheckSuccessfulDetachedRequest(msgs[3]);
904 947
905 // Check that request 2 got canceled. 948 // Check that request 2 got canceled.
906 ASSERT_EQ(2U, msgs[1].size()); 949 ASSERT_EQ(2U, msgs[1].size());
907 ASSERT_EQ(ResourceMsg_ReceivedResponse::ID, msgs[1][0].type()); 950 ASSERT_EQ(ResourceMsg_ReceivedResponse::ID, msgs[1][0].type());
908 CheckCancelledRequestCompleteMessage(msgs[1][1]); 951 CheckRequestCompleteErrorCode(msgs[1][1], net::ERR_ABORTED);
952 }
953
954 // Shows that detachable requests will timeout if the request takes too long to
955 // complete.
956 TEST_F(ResourceDispatcherHostTest, DetachableResourceTimesOut) {
957 MakeTestRequestWithResourceType(filter_.get(), 0, 1,
958 net::URLRequestTestJob::test_url_2(),
959 ResourceType::PREFETCH); // detachable type
960 ResourceLoader* loader = host_.GetLoader(filter_->child_id(), 1);
961 ASSERT_TRUE(loader);
962 loader->set_detachable_delay_ms(200);
963 base::MessageLoop::current()->RunUntilIdle();
964 host_.CancelRequest(filter_->child_id(), 1, true);
965
966 EXPECT_EQ(1, host_.pending_requests());
967
968 // Wait until after the delay timer times out before we start processing any
969 // messages.
970 base::OneShotTimer<base::MessageLoop> timer;
971 timer.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(210),
972 base::MessageLoop::current(), &base::MessageLoop::QuitWhenIdle);
973 base::MessageLoop::current()->Run();
974
975 // We should have cancelled the prefetch by now.
976 EXPECT_EQ(0, host_.pending_requests());
977
978 // In case any messages are still to be processed.
979 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
980 base::MessageLoop::current()->RunUntilIdle();
981
982 ResourceIPCAccumulator::ClassifiedMessages msgs;
983 accum_.GetClassifiedMessages(&msgs);
984
985 ASSERT_EQ(1U, msgs.size());
986
987 // The request should have cancelled.
988 ASSERT_EQ(2U, msgs[0].size());
989 ASSERT_EQ(ResourceMsg_ReceivedResponse::ID, msgs[0][0].type());
990 CheckRequestCompleteErrorCode(msgs[0][1], net::ERR_ABORTED);
991 }
992
993 // If the filter has disappeared then detachable resources should continue to
994 // load.
995 TEST_F(ResourceDispatcherHostTest, DeletedFilterDetachable) {
996 ResourceHostMsg_Request request = CreateResourceRequest(
997 "GET", ResourceType::PREFETCH, net::URLRequestTestJob::test_url_4());
998
999 ResourceHostMsg_RequestResource msg(0, 1, request);
1000 bool msg_was_ok;
1001 host_.OnMessageReceived(msg, filter_, &msg_was_ok);
1002
1003 // Remove the filter before processing the request by simulating channel
1004 // closure.
1005 GlobalRequestID global_request_id(filter_->child_id(), 1);
1006 ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(
1007 host_.GetURLRequest(global_request_id));
1008 info->filter_->OnChannelClosing();
1009 info->filter_.reset();
1010
1011 EXPECT_EQ(1, host_.pending_requests());
1012
1013 KickOffRequest();
1014
1015 // Make sure the request wasn't canceled early.
1016 EXPECT_EQ(1, host_.pending_requests());
1017
1018 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
1019 base::MessageLoop::current()->RunUntilIdle();
1020
1021 EXPECT_EQ(0, host_.pending_requests());
1022
1023 // Because the filter was gone, no messages should have been sent.
1024 // TODO(jkarlin): It would be nice to verify that we successfully completed
1025 // the request, but we have no messages to verify with.
1026 ResourceIPCAccumulator::ClassifiedMessages msgs;
1027 accum_.GetClassifiedMessages(&msgs);
1028 ASSERT_EQ(0U, msgs.size());
1029 }
1030
1031 // If the filter has disappeared (original process dies) then detachable
1032 // resources should continue to load, even when redirected.
1033 TEST_F(ResourceDispatcherHostTest, DeletedFilterDetachableRedirect) {
1034 ResourceHostMsg_Request request = CreateResourceRequest(
1035 "GET", ResourceType::PREFETCH,
1036 net::URLRequestTestJob::test_url_redirect_to_url_2());
1037
1038 ResourceHostMsg_RequestResource msg(0, 1, request);
1039 bool msg_was_ok;
1040 host_.OnMessageReceived(msg, filter_, &msg_was_ok);
1041
1042 // Remove the filter before processing the request by simulating channel
1043 // closure.
1044 GlobalRequestID global_request_id(filter_->child_id(), 1);
1045 ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(
1046 host_.GetURLRequest(global_request_id));
1047 info->filter_->OnChannelClosing();
1048 info->filter_.reset();
1049
1050 EXPECT_EQ(1, host_.pending_requests());
1051 // Verify no redirects before resetting the filter.
1052 net::URLRequest* url_request = host_.GetURLRequest(global_request_id);
1053 EXPECT_EQ(1u, url_request->url_chain().size());
1054 KickOffRequest();
1055
1056 // Verify that a redirect was followed.
1057 EXPECT_EQ(2u, url_request->url_chain().size());
1058
1059 // Make sure the request wasn't canceled early.
1060 EXPECT_EQ(1, host_.pending_requests());
1061
1062 // Finish up the request.
1063 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
1064 base::MessageLoop::current()->RunUntilIdle();
1065
1066 EXPECT_EQ(0, host_.pending_requests());
1067
1068 // Because the filter was deleted, no messages should have been sent.
1069 // TODO(jkarlin): It would be nice to verify that we successfully completed
1070 // the request, but we have no messages to verify with.
1071 ResourceIPCAccumulator::ClassifiedMessages msgs;
1072 accum_.GetClassifiedMessages(&msgs);
1073 ASSERT_EQ(0U, msgs.size());
909 } 1074 }
910 1075
911 TEST_F(ResourceDispatcherHostTest, CancelWhileStartIsDeferred) { 1076 TEST_F(ResourceDispatcherHostTest, CancelWhileStartIsDeferred) {
912 bool was_deleted = false; 1077 bool was_deleted = false;
913 1078
914 // Arrange to have requests deferred before starting. 1079 // Arrange to have requests deferred before starting.
915 TestResourceDispatcherHostDelegate delegate; 1080 TestResourceDispatcherHostDelegate delegate;
916 delegate.set_flags(DEFER_STARTING_REQUEST); 1081 delegate.set_flags(DEFER_STARTING_REQUEST);
917 delegate.set_url_request_user_data(new TestUserData(&was_deleted)); 1082 delegate.set_url_request_user_data(new TestUserData(&was_deleted));
918 host_.SetDelegate(&delegate); 1083 host_.SetDelegate(&delegate);
(...skipping 24 matching lines...) Expand all
943 1108
944 // flush all the pending requests 1109 // flush all the pending requests
945 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} 1110 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
946 base::MessageLoop::current()->RunUntilIdle(); 1111 base::MessageLoop::current()->RunUntilIdle();
947 1112
948 ResourceIPCAccumulator::ClassifiedMessages msgs; 1113 ResourceIPCAccumulator::ClassifiedMessages msgs;
949 accum_.GetClassifiedMessages(&msgs); 1114 accum_.GetClassifiedMessages(&msgs);
950 1115
951 // Check that request got canceled. 1116 // Check that request got canceled.
952 ASSERT_EQ(1U, msgs[0].size()); 1117 ASSERT_EQ(1U, msgs[0].size());
953 CheckCancelledRequestCompleteMessage(msgs[0][0]); 1118 CheckRequestCompleteErrorCode(msgs[0][0], net::ERR_ABORTED);
954 1119
955 // Make sure URLRequest is never started. 1120 // Make sure URLRequest is never started.
956 EXPECT_EQ(0, url_request_jobs_created_count_); 1121 EXPECT_EQ(0, url_request_jobs_created_count_);
957 } 1122 }
958 1123
959 TEST_F(ResourceDispatcherHostTest, PausedStartError) { 1124 TEST_F(ResourceDispatcherHostTest, PausedStartError) {
960 // Arrange to have requests deferred before processing response headers. 1125 // Arrange to have requests deferred before processing response headers.
961 TestResourceDispatcherHostDelegate delegate; 1126 TestResourceDispatcherHostDelegate delegate;
962 delegate.set_flags(DEFER_PROCESSING_RESPONSE); 1127 delegate.set_flags(DEFER_PROCESSING_RESPONSE);
963 host_.SetDelegate(&delegate); 1128 host_.SetDelegate(&delegate);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1023 // flush all the pending requests 1188 // flush all the pending requests
1024 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} 1189 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
1025 base::MessageLoop::current()->RunUntilIdle(); 1190 base::MessageLoop::current()->RunUntilIdle();
1026 1191
1027 ResourceIPCAccumulator::ClassifiedMessages msgs; 1192 ResourceIPCAccumulator::ClassifiedMessages msgs;
1028 accum_.GetClassifiedMessages(&msgs); 1193 accum_.GetClassifiedMessages(&msgs);
1029 1194
1030 // Check the cancellation 1195 // Check the cancellation
1031 ASSERT_EQ(1U, msgs.size()); 1196 ASSERT_EQ(1U, msgs.size());
1032 ASSERT_EQ(1U, msgs[0].size()); 1197 ASSERT_EQ(1U, msgs[0].size());
1033 ASSERT_EQ(ResourceMsg_RequestComplete::ID, msgs[0][0].type());
1034 1198
1035 int request_id; 1199 CheckRequestCompleteErrorCode(msgs[0][0], net::ERR_ACCESS_DENIED);
1036 int error_code;
1037
1038 PickleIterator iter(msgs[0][0]);
1039 ASSERT_TRUE(IPC::ReadParam(&msgs[0][0], &iter, &request_id));
1040 ASSERT_TRUE(IPC::ReadParam(&msgs[0][0], &iter, &error_code));
1041
1042 EXPECT_EQ(net::ERR_ACCESS_DENIED, error_code);
1043 } 1200 }
1044 1201
1045 // The host delegate acts as a second one so we can have some requests 1202 // The host delegate acts as a second one so we can have some requests
1046 // pending and some canceled. 1203 // pending and some canceled.
1047 class TestFilter : public ForwardingFilter { 1204 class TestFilter : public ForwardingFilter {
1048 public: 1205 public:
1049 explicit TestFilter(ResourceContext* resource_context) 1206 explicit TestFilter(ResourceContext* resource_context)
1050 : ForwardingFilter(NULL, resource_context), 1207 : ForwardingFilter(NULL, resource_context),
1051 has_canceled_(false), 1208 has_canceled_(false),
1052 received_after_canceled_(0) { 1209 received_after_canceled_(0) {
(...skipping 17 matching lines...) Expand all
1070 1227
1071 // Tests CancelRequestsForProcess 1228 // Tests CancelRequestsForProcess
1072 TEST_F(ResourceDispatcherHostTest, TestProcessCancel) { 1229 TEST_F(ResourceDispatcherHostTest, TestProcessCancel) {
1073 scoped_refptr<TestFilter> test_filter = new TestFilter( 1230 scoped_refptr<TestFilter> test_filter = new TestFilter(
1074 browser_context_->GetResourceContext()); 1231 browser_context_->GetResourceContext());
1075 1232
1076 // request 1 goes to the test delegate 1233 // request 1 goes to the test delegate
1077 ResourceHostMsg_Request request = CreateResourceRequest( 1234 ResourceHostMsg_Request request = CreateResourceRequest(
1078 "GET", ResourceType::SUB_RESOURCE, net::URLRequestTestJob::test_url_1()); 1235 "GET", ResourceType::SUB_RESOURCE, net::URLRequestTestJob::test_url_1());
1079 1236
1080 MakeTestRequest(test_filter.get(), 0, 1, 1237 MakeTestRequestWithResourceType(test_filter.get(), 0, 1,
1081 net::URLRequestTestJob::test_url_1()); 1238 net::URLRequestTestJob::test_url_1(),
1239 ResourceType::SUB_RESOURCE);
1082 1240
1083 // request 2 goes to us 1241 // request 2 goes to us
1084 MakeTestRequest(0, 2, net::URLRequestTestJob::test_url_2()); 1242 MakeTestRequest(0, 2, net::URLRequestTestJob::test_url_2());
1085 1243
1086 // request 3 goes to the test delegate 1244 // request 3 goes to the test delegate
1087 MakeTestRequest(test_filter.get(), 0, 3, 1245 MakeTestRequestWithResourceType(test_filter.get(), 0, 3,
1088 net::URLRequestTestJob::test_url_3()); 1246 net::URLRequestTestJob::test_url_3(),
1247 ResourceType::SUB_RESOURCE);
1248
1249 // request 4 goes to us
1250 MakeTestRequestWithResourceType(filter_.get(), 0, 4,
1251 net::URLRequestTestJob::test_url_4(),
1252 ResourceType::PREFETCH); // detachable type
1253
1089 1254
1090 // Make sure all requests have finished stage one. test_url_1 will have 1255 // Make sure all requests have finished stage one. test_url_1 will have
1091 // finished. 1256 // finished.
1092 base::MessageLoop::current()->RunUntilIdle(); 1257 base::MessageLoop::current()->RunUntilIdle();
1093 1258
1094 // TODO(mbelshe): 1259 // TODO(mbelshe):
1095 // Now that the async IO path is in place, the IO always completes on the 1260 // Now that the async IO path is in place, the IO always completes on the
1096 // initial call; so the requests have already completed. This basically 1261 // initial call; so the requests have already completed. This basically
1097 // breaks the whole test. 1262 // breaks the whole test.
1098 //EXPECT_EQ(3, host_.pending_requests()); 1263 //EXPECT_EQ(3, host_.pending_requests());
1099 1264
1100 // Process each request for one level so one callback is called. 1265 // Process test_url_2 and test_url_3 for one level so one callback is called.
1266 // We'll cancel test_url_4 (detachable) before processing it to verify that it
1267 // delays the cancel.
1101 for (int i = 0; i < 2; i++) 1268 for (int i = 0; i < 2; i++)
1102 EXPECT_TRUE(net::URLRequestTestJob::ProcessOnePendingMessage()); 1269 EXPECT_TRUE(net::URLRequestTestJob::ProcessOnePendingMessage());
1103 1270
1104 // Cancel the requests to the test process. 1271 // Cancel the requests to the test process.
1105 host_.CancelRequestsForProcess(filter_->child_id()); 1272 host_.CancelRequestsForProcess(filter_->child_id());
1106 test_filter->has_canceled_ = true; 1273 test_filter->has_canceled_ = true;
1107 1274
1108 // Flush all the pending requests. 1275 // Flush all the pending requests.
1109 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} 1276 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
1110 1277
1111 EXPECT_EQ(0, host_.pending_requests()); 1278 EXPECT_EQ(0, host_.pending_requests());
1112 1279
1113 // The test delegate should not have gotten any messages after being canceled. 1280 // The test delegate should not have gotten any messages after being canceled.
1114 ASSERT_EQ(0, test_filter->received_after_canceled_); 1281 ASSERT_EQ(0, test_filter->received_after_canceled_);
1115 1282
1116 // We should have gotten exactly one result. 1283 // We should have gotten two results.
1117 ResourceIPCAccumulator::ClassifiedMessages msgs; 1284 ResourceIPCAccumulator::ClassifiedMessages msgs;
1118 accum_.GetClassifiedMessages(&msgs); 1285 accum_.GetClassifiedMessages(&msgs);
1286 ASSERT_EQ(2U, msgs.size());
1287 CheckSuccessfulRequest(msgs[0], net::URLRequestTestJob::test_data_2());
1288 // We cancelled the detachable request before it finished, and it should have
1289 // delayed and completed regardless.
1290 CheckSuccessfulDetachedRequest(msgs[1]);
1291 }
1292
1293 TEST_F(ResourceDispatcherHostTest, TestProcessCancelDetachableTimesOut) {
1294 MakeTestRequestWithResourceType(filter_.get(), 0, 1,
1295 net::URLRequestTestJob::test_url_4(),
1296 ResourceType::PREFETCH); // detachable type
1297 ResourceLoader* loader = host_.GetLoader(filter_->child_id(), 1);
1298 EXPECT_TRUE(loader);
1299 loader->set_detachable_delay_ms(200);
1300 base::MessageLoop::current()->RunUntilIdle();
1301
1302 // Cancel the requests to the test process.
1303 host_.CancelRequestsForProcess(filter_->child_id());
1304 EXPECT_EQ(1, host_.pending_requests());
1305
1306 // Wait until after the delay timer times out before we start processing any
1307 // messages.
1308 base::OneShotTimer<base::MessageLoop> timer;
1309 timer.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(210),
1310 base::MessageLoop::current(), &base::MessageLoop::QuitWhenIdle);
1311 base::MessageLoop::current()->Run();
1312
1313 // We should have cancelled the prefetch by now.
1314 EXPECT_EQ(0, host_.pending_requests());
1315
1316 // In case any messages are still to be processed.
1317 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
1318 base::MessageLoop::current()->RunUntilIdle();
1319
1320 ResourceIPCAccumulator::ClassifiedMessages msgs;
1321 accum_.GetClassifiedMessages(&msgs);
1322
1119 ASSERT_EQ(1U, msgs.size()); 1323 ASSERT_EQ(1U, msgs.size());
1120 CheckSuccessfulRequest(msgs[0], net::URLRequestTestJob::test_data_2()); 1324
1325 // The request should have cancelled.
1326 ASSERT_EQ(2U, msgs[0].size());
1327 ASSERT_EQ(ResourceMsg_ReceivedResponse::ID, msgs[0][0].type());
1328 CheckRequestCompleteErrorCode(msgs[0][1], net::ERR_ABORTED);
1121 } 1329 }
1122 1330
1123 // Tests blocking and resuming requests. 1331 // Tests blocking and resuming requests.
1124 TEST_F(ResourceDispatcherHostTest, TestBlockingResumingRequests) { 1332 TEST_F(ResourceDispatcherHostTest, TestBlockingResumingRequests) {
1125 host_.BlockRequestsForRoute(filter_->child_id(), 1); 1333 host_.BlockRequestsForRoute(filter_->child_id(), 1);
1126 host_.BlockRequestsForRoute(filter_->child_id(), 2); 1334 host_.BlockRequestsForRoute(filter_->child_id(), 2);
1127 host_.BlockRequestsForRoute(filter_->child_id(), 3); 1335 host_.BlockRequestsForRoute(filter_->child_id(), 3);
1128 1336
1129 MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_1()); 1337 MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_1());
1130 MakeTestRequest(1, 2, net::URLRequestTestJob::test_url_2()); 1338 MakeTestRequest(1, 2, net::URLRequestTestJob::test_url_2());
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1179 } 1387 }
1180 1388
1181 // Tests blocking and canceling requests. 1389 // Tests blocking and canceling requests.
1182 TEST_F(ResourceDispatcherHostTest, TestBlockingCancelingRequests) { 1390 TEST_F(ResourceDispatcherHostTest, TestBlockingCancelingRequests) {
1183 host_.BlockRequestsForRoute(filter_->child_id(), 1); 1391 host_.BlockRequestsForRoute(filter_->child_id(), 1);
1184 1392
1185 MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_1()); 1393 MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_1());
1186 MakeTestRequest(1, 2, net::URLRequestTestJob::test_url_2()); 1394 MakeTestRequest(1, 2, net::URLRequestTestJob::test_url_2());
1187 MakeTestRequest(0, 3, net::URLRequestTestJob::test_url_3()); 1395 MakeTestRequest(0, 3, net::URLRequestTestJob::test_url_3());
1188 MakeTestRequest(1, 4, net::URLRequestTestJob::test_url_1()); 1396 MakeTestRequest(1, 4, net::URLRequestTestJob::test_url_1());
1397 // Blocked detachable resources should not delay cancellation.
1398 MakeTestRequestWithResourceType(filter_.get(), 1, 5,
1399 net::URLRequestTestJob::test_url_4(),
1400 ResourceType::PREFETCH); // detachable type
1189 1401
1190 // Flush all the pending requests. 1402 // Flush all the pending requests.
1191 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} 1403 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
1192 1404
1193 // Sort out all the messages we saw by request. 1405 // Sort out all the messages we saw by request.
1194 ResourceIPCAccumulator::ClassifiedMessages msgs; 1406 ResourceIPCAccumulator::ClassifiedMessages msgs;
1195 accum_.GetClassifiedMessages(&msgs); 1407 accum_.GetClassifiedMessages(&msgs);
1196 1408
1197 // The 2 requests for the RVH 0 should have been processed. 1409 // The 2 requests for the RVH 0 should have been processed.
1198 ASSERT_EQ(2U, msgs.size()); 1410 ASSERT_EQ(2U, msgs.size());
(...skipping 12 matching lines...) Expand all
1211 } 1423 }
1212 1424
1213 // Tests that blocked requests are canceled if their associated process dies. 1425 // Tests that blocked requests are canceled if their associated process dies.
1214 TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsProcessDies) { 1426 TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsProcessDies) {
1215 // This second filter is used to emulate a second process. 1427 // This second filter is used to emulate a second process.
1216 scoped_refptr<ForwardingFilter> second_filter = new ForwardingFilter( 1428 scoped_refptr<ForwardingFilter> second_filter = new ForwardingFilter(
1217 this, browser_context_->GetResourceContext()); 1429 this, browser_context_->GetResourceContext());
1218 1430
1219 host_.BlockRequestsForRoute(second_filter->child_id(), 0); 1431 host_.BlockRequestsForRoute(second_filter->child_id(), 0);
1220 1432
1221 MakeTestRequest(filter_.get(), 0, 1, net::URLRequestTestJob::test_url_1()); 1433 MakeTestRequestWithResourceType(filter_.get(), 0, 1,
1222 MakeTestRequest(second_filter.get(), 0, 2, 1434 net::URLRequestTestJob::test_url_1(),
1223 net::URLRequestTestJob::test_url_2()); 1435 ResourceType::SUB_RESOURCE);
1224 MakeTestRequest(filter_.get(), 0, 3, net::URLRequestTestJob::test_url_3()); 1436 MakeTestRequestWithResourceType(second_filter.get(), 0, 2,
1225 MakeTestRequest(second_filter.get(), 0, 4, 1437 net::URLRequestTestJob::test_url_2(),
1226 net::URLRequestTestJob::test_url_1()); 1438 ResourceType::SUB_RESOURCE);
1439 MakeTestRequestWithResourceType(filter_.get(), 0, 3,
1440 net::URLRequestTestJob::test_url_3(),
1441 ResourceType::SUB_RESOURCE);
1442 MakeTestRequestWithResourceType(second_filter.get(), 0, 4,
1443 net::URLRequestTestJob::test_url_1(),
1444 ResourceType::SUB_RESOURCE);
1445 MakeTestRequestWithResourceType(second_filter.get(), 0, 5,
1446 net::URLRequestTestJob::test_url_4(),
1447 ResourceType::PREFETCH); // detachable type
1227 1448
1228 // Simulate process death. 1449 // Simulate process death.
1229 host_.CancelRequestsForProcess(second_filter->child_id()); 1450 host_.CancelRequestsForProcess(second_filter->child_id());
1230 1451
1231 // Flush all the pending requests. 1452 // Flush all the pending requests.
1232 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} 1453 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
1233 1454
1234 // Sort out all the messages we saw by request. 1455 // Sort out all the messages we saw by request.
1235 ResourceIPCAccumulator::ClassifiedMessages msgs; 1456 ResourceIPCAccumulator::ClassifiedMessages msgs;
1236 accum_.GetClassifiedMessages(&msgs); 1457 accum_.GetClassifiedMessages(&msgs);
1237 1458
1238 // The 2 requests for the RVH 0 should have been processed. 1459 // The 2 requests for the RVH 0 should have been processed. Note that
1460 // blocked detachable requests are canceled without delay.
1239 ASSERT_EQ(2U, msgs.size()); 1461 ASSERT_EQ(2U, msgs.size());
1240 1462
1241 CheckSuccessfulRequest(msgs[0], net::URLRequestTestJob::test_data_1()); 1463 CheckSuccessfulRequest(msgs[0], net::URLRequestTestJob::test_data_1());
1242 CheckSuccessfulRequest(msgs[1], net::URLRequestTestJob::test_data_3()); 1464 CheckSuccessfulRequest(msgs[1], net::URLRequestTestJob::test_data_3());
1243 1465
1244 EXPECT_TRUE(host_.blocked_loaders_map_.empty()); 1466 EXPECT_TRUE(host_.blocked_loaders_map_.empty());
1245 } 1467 }
1246 1468
1247 // Tests that blocked requests don't leak when the ResourceDispatcherHost goes 1469 // Tests that blocked requests don't leak when the ResourceDispatcherHost goes
1248 // away. Note that we rely on Purify for finding the leaks if any. 1470 // away. Note that we rely on Purify for finding the leaks if any.
1249 // If this test turns the Purify bot red, check the ResourceDispatcherHost 1471 // If this test turns the Purify bot red, check the ResourceDispatcherHost
1250 // destructor to make sure the blocked requests are deleted. 1472 // destructor to make sure the blocked requests are deleted.
1251 TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsDontLeak) { 1473 TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsDontLeak) {
1252 // This second filter is used to emulate a second process. 1474 // This second filter is used to emulate a second process.
1253 scoped_refptr<ForwardingFilter> second_filter = new ForwardingFilter( 1475 scoped_refptr<ForwardingFilter> second_filter = new ForwardingFilter(
1254 this, browser_context_->GetResourceContext()); 1476 this, browser_context_->GetResourceContext());
1255 1477
1256 host_.BlockRequestsForRoute(filter_->child_id(), 1); 1478 host_.BlockRequestsForRoute(filter_->child_id(), 1);
1257 host_.BlockRequestsForRoute(filter_->child_id(), 2); 1479 host_.BlockRequestsForRoute(filter_->child_id(), 2);
1258 host_.BlockRequestsForRoute(second_filter->child_id(), 1); 1480 host_.BlockRequestsForRoute(second_filter->child_id(), 1);
1259 1481
1260 MakeTestRequest(filter_.get(), 0, 1, net::URLRequestTestJob::test_url_1()); 1482 MakeTestRequestWithResourceType(filter_.get(), 0, 1,
1261 MakeTestRequest(filter_.get(), 1, 2, net::URLRequestTestJob::test_url_2()); 1483 net::URLRequestTestJob::test_url_1(),
1262 MakeTestRequest(filter_.get(), 0, 3, net::URLRequestTestJob::test_url_3()); 1484 ResourceType::SUB_RESOURCE);
1263 MakeTestRequest(second_filter.get(), 1, 4, 1485 MakeTestRequestWithResourceType(filter_.get(), 1, 2,
1264 net::URLRequestTestJob::test_url_1()); 1486 net::URLRequestTestJob::test_url_2(),
1265 MakeTestRequest(filter_.get(), 2, 5, net::URLRequestTestJob::test_url_2()); 1487 ResourceType::SUB_RESOURCE);
1266 MakeTestRequest(filter_.get(), 2, 6, net::URLRequestTestJob::test_url_3()); 1488 MakeTestRequestWithResourceType(filter_.get(), 0, 3,
1489 net::URLRequestTestJob::test_url_3(),
1490 ResourceType::SUB_RESOURCE);
1491 MakeTestRequestWithResourceType(second_filter.get(), 1, 4,
1492 net::URLRequestTestJob::test_url_1(),
1493 ResourceType::SUB_RESOURCE);
1494 MakeTestRequestWithResourceType(filter_.get(), 2, 5,
1495 net::URLRequestTestJob::test_url_2(),
1496 ResourceType::SUB_RESOURCE);
1497 MakeTestRequestWithResourceType(filter_.get(), 2, 6,
1498 net::URLRequestTestJob::test_url_3(),
1499 ResourceType::SUB_RESOURCE);
1500 MakeTestRequestWithResourceType(filter_.get(), 0, 7,
1501 net::URLRequestTestJob::test_url_4(),
1502 ResourceType::PREFETCH); // detachable type
1503 MakeTestRequestWithResourceType(second_filter.get(), 1, 8,
1504 net::URLRequestTestJob::test_url_4(),
1505 ResourceType::PREFETCH); // detachable type
1267 1506
1268 host_.CancelRequestsForProcess(filter_->child_id()); 1507 host_.CancelRequestsForProcess(filter_->child_id());
1269 host_.CancelRequestsForProcess(second_filter->child_id()); 1508 host_.CancelRequestsForProcess(second_filter->child_id());
1270 1509
1271 // Flush all the pending requests. 1510 // Flush all the pending requests.
1272 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} 1511 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
1273 } 1512 }
1274 1513
1275 // Test the private helper method "CalculateApproximateMemoryCost()". 1514 // Test the private helper method "CalculateApproximateMemoryCost()".
1276 TEST_F(ResourceDispatcherHostTest, CalculateApproximateMemoryCost) { 1515 TEST_F(ResourceDispatcherHostTest, CalculateApproximateMemoryCost) {
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1315 // Determine how many instance of test_url_2() we can request before 1554 // Determine how many instance of test_url_2() we can request before
1316 // throttling kicks in. 1555 // throttling kicks in.
1317 size_t kMaxRequests = kMaxCostPerProcess / kMemoryCostOfTest2Req; 1556 size_t kMaxRequests = kMaxCostPerProcess / kMemoryCostOfTest2Req;
1318 1557
1319 // This second filter is used to emulate a second process. 1558 // This second filter is used to emulate a second process.
1320 scoped_refptr<ForwardingFilter> second_filter = new ForwardingFilter( 1559 scoped_refptr<ForwardingFilter> second_filter = new ForwardingFilter(
1321 this, browser_context_->GetResourceContext()); 1560 this, browser_context_->GetResourceContext());
1322 1561
1323 // Saturate the number of outstanding requests for our process. 1562 // Saturate the number of outstanding requests for our process.
1324 for (size_t i = 0; i < kMaxRequests; ++i) { 1563 for (size_t i = 0; i < kMaxRequests; ++i) {
1325 MakeTestRequest(filter_.get(), 0, i + 1, 1564 MakeTestRequestWithResourceType(filter_.get(), 0, i + 1,
1326 net::URLRequestTestJob::test_url_2()); 1565 net::URLRequestTestJob::test_url_2(),
1566 ResourceType::SUB_RESOURCE);
1327 } 1567 }
1328 1568
1329 // Issue two more requests for our process -- these should fail immediately. 1569 // Issue two more requests for our process -- these should fail immediately.
1330 MakeTestRequest(filter_.get(), 0, kMaxRequests + 1, 1570 MakeTestRequestWithResourceType(filter_.get(), 0, kMaxRequests + 1,
1331 net::URLRequestTestJob::test_url_2()); 1571 net::URLRequestTestJob::test_url_2(),
1332 MakeTestRequest(filter_.get(), 0, kMaxRequests + 2, 1572 ResourceType::SUB_RESOURCE);
1333 net::URLRequestTestJob::test_url_2()); 1573 MakeTestRequestWithResourceType(filter_.get(), 0, kMaxRequests + 2,
1574 net::URLRequestTestJob::test_url_2(),
1575 ResourceType::SUB_RESOURCE);
1334 1576
1335 // Issue two requests for the second process -- these should succeed since 1577 // Issue two requests for the second process -- these should succeed since
1336 // it is just process 0 that is saturated. 1578 // it is just process 0 that is saturated.
1337 MakeTestRequest(second_filter.get(), 0, kMaxRequests + 3, 1579 MakeTestRequestWithResourceType(second_filter.get(), 0, kMaxRequests + 3,
1338 net::URLRequestTestJob::test_url_2()); 1580 net::URLRequestTestJob::test_url_2(),
1339 MakeTestRequest(second_filter.get(), 0, kMaxRequests + 4, 1581 ResourceType::SUB_RESOURCE);
1340 net::URLRequestTestJob::test_url_2()); 1582 MakeTestRequestWithResourceType(second_filter.get(), 0, kMaxRequests + 4,
1583 net::URLRequestTestJob::test_url_2(),
1584 ResourceType::SUB_RESOURCE);
1341 1585
1342 // Flush all the pending requests. 1586 // Flush all the pending requests.
1343 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} 1587 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
1344 base::MessageLoop::current()->RunUntilIdle(); 1588 base::MessageLoop::current()->RunUntilIdle();
1345 1589
1346 // Sorts out all the messages we saw by request. 1590 // Sorts out all the messages we saw by request.
1347 ResourceIPCAccumulator::ClassifiedMessages msgs; 1591 ResourceIPCAccumulator::ClassifiedMessages msgs;
1348 accum_.GetClassifiedMessages(&msgs); 1592 accum_.GetClassifiedMessages(&msgs);
1349 1593
1350 // We issued (kMaxRequests + 4) total requests. 1594 // We issued (kMaxRequests + 4) total requests.
(...skipping 30 matching lines...) Expand all
1381 host_.set_max_num_in_flight_requests(kMaxRequests); 1625 host_.set_max_num_in_flight_requests(kMaxRequests);
1382 1626
1383 // Needed to emulate additional processes. 1627 // Needed to emulate additional processes.
1384 scoped_refptr<ForwardingFilter> second_filter = new ForwardingFilter( 1628 scoped_refptr<ForwardingFilter> second_filter = new ForwardingFilter(
1385 this, browser_context_->GetResourceContext()); 1629 this, browser_context_->GetResourceContext());
1386 scoped_refptr<ForwardingFilter> third_filter = new ForwardingFilter( 1630 scoped_refptr<ForwardingFilter> third_filter = new ForwardingFilter(
1387 this, browser_context_->GetResourceContext()); 1631 this, browser_context_->GetResourceContext());
1388 1632
1389 // Saturate the number of outstanding requests for our process. 1633 // Saturate the number of outstanding requests for our process.
1390 for (size_t i = 0; i < kMaxRequestsPerProcess; ++i) { 1634 for (size_t i = 0; i < kMaxRequestsPerProcess; ++i) {
1391 MakeTestRequest(filter_.get(), 0, i + 1, 1635 MakeTestRequestWithResourceType(filter_.get(), 0, i + 1,
1392 net::URLRequestTestJob::test_url_2()); 1636 net::URLRequestTestJob::test_url_2(),
1637 ResourceType::SUB_RESOURCE);
1393 } 1638 }
1394 1639
1395 // Issue another request for our process -- this should fail immediately. 1640 // Issue another request for our process -- this should fail immediately.
1396 MakeTestRequest(filter_.get(), 0, kMaxRequestsPerProcess + 1, 1641 MakeTestRequestWithResourceType(filter_.get(), 0, kMaxRequestsPerProcess + 1,
1397 net::URLRequestTestJob::test_url_2()); 1642 net::URLRequestTestJob::test_url_2(),
1643 ResourceType::SUB_RESOURCE);
1398 1644
1399 // Issue a request for the second process -- this should succeed, because it 1645 // Issue a request for the second process -- this should succeed, because it
1400 // is just process 0 that is saturated. 1646 // is just process 0 that is saturated.
1401 MakeTestRequest(second_filter.get(), 0, kMaxRequestsPerProcess + 2, 1647 MakeTestRequestWithResourceType(
1402 net::URLRequestTestJob::test_url_2()); 1648 second_filter.get(), 0, kMaxRequestsPerProcess + 2,
1649 net::URLRequestTestJob::test_url_2(), ResourceType::SUB_RESOURCE);
1403 1650
1404 // Issue a request for the third process -- this should fail, because the 1651 // Issue a request for the third process -- this should fail, because the
1405 // global limit has been reached. 1652 // global limit has been reached.
1406 MakeTestRequest(third_filter.get(), 0, kMaxRequestsPerProcess + 3, 1653 MakeTestRequestWithResourceType(
1407 net::URLRequestTestJob::test_url_2()); 1654 third_filter.get(), 0, kMaxRequestsPerProcess + 3,
1655 net::URLRequestTestJob::test_url_2(), ResourceType::SUB_RESOURCE);
1408 1656
1409 // Flush all the pending requests. 1657 // Flush all the pending requests.
1410 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} 1658 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
1411 base::MessageLoop::current()->RunUntilIdle(); 1659 base::MessageLoop::current()->RunUntilIdle();
1412 1660
1413 // Sorts out all the messages we saw by request. 1661 // Sorts out all the messages we saw by request.
1414 ResourceIPCAccumulator::ClassifiedMessages msgs; 1662 ResourceIPCAccumulator::ClassifiedMessages msgs;
1415 accum_.GetClassifiedMessages(&msgs); 1663 accum_.GetClassifiedMessages(&msgs);
1416 1664
1417 // The processes issued the following requests: 1665 // The processes issued the following requests:
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1537 } 1785 }
1538 1786
1539 // Tests for crbug.com/31266 (Non-2xx + application/octet-stream). 1787 // Tests for crbug.com/31266 (Non-2xx + application/octet-stream).
1540 TEST_F(ResourceDispatcherHostTest, ForbiddenDownload) { 1788 TEST_F(ResourceDispatcherHostTest, ForbiddenDownload) {
1541 std::string raw_headers("HTTP/1.1 403 Forbidden\n" 1789 std::string raw_headers("HTTP/1.1 403 Forbidden\n"
1542 "Content-disposition: attachment; filename=blah\n" 1790 "Content-disposition: attachment; filename=blah\n"
1543 "Content-type: application/octet-stream\n\n"); 1791 "Content-type: application/octet-stream\n\n");
1544 std::string response_data("<html><title>Test One</title></html>"); 1792 std::string response_data("<html><title>Test One</title></html>");
1545 SetResponse(raw_headers, response_data); 1793 SetResponse(raw_headers, response_data);
1546 1794
1795 HandleScheme("http");
1796
1547 // Only MAIN_FRAMEs can trigger a download. 1797 // Only MAIN_FRAMEs can trigger a download.
1548 SetResourceType(ResourceType::MAIN_FRAME); 1798 MakeTestRequestWithResourceType(filter_.get(), 0, 1, GURL("http:bla"),
1549 1799 ResourceType::MAIN_FRAME);
1550 HandleScheme("http");
1551 MakeTestRequest(0, 1, GURL("http:bla"));
1552 1800
1553 // Flush all pending requests. 1801 // Flush all pending requests.
1554 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} 1802 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
1555 1803
1556 // Sorts out all the messages we saw by request. 1804 // Sorts out all the messages we saw by request.
1557 ResourceIPCAccumulator::ClassifiedMessages msgs; 1805 ResourceIPCAccumulator::ClassifiedMessages msgs;
1558 accum_.GetClassifiedMessages(&msgs); 1806 accum_.GetClassifiedMessages(&msgs);
1559 1807
1560 // We should have gotten one RequestComplete message. 1808 // We should have gotten one RequestComplete message.
1561 ASSERT_EQ(1U, msgs[0].size()); 1809 ASSERT_EQ(1U, msgs[0].size());
1562 EXPECT_EQ(ResourceMsg_RequestComplete::ID, msgs[0][0].type()); 1810 EXPECT_EQ(ResourceMsg_RequestComplete::ID, msgs[0][0].type());
1563 1811
1564 // The RequestComplete message should have had the error code of 1812 // The RequestComplete message should have had the error code of
1565 // ERR_FILE_NOT_FOUND. 1813 // ERR_FILE_NOT_FOUND.
1566 int request_id; 1814 CheckRequestCompleteErrorCode(msgs[0][0], net::ERR_FILE_NOT_FOUND);
1567 int error_code;
1568
1569 PickleIterator iter(msgs[0][0]);
1570 EXPECT_TRUE(IPC::ReadParam(&msgs[0][0], &iter, &request_id));
1571 EXPECT_TRUE(IPC::ReadParam(&msgs[0][0], &iter, &error_code));
1572
1573 EXPECT_EQ(1, request_id);
1574 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, error_code);
1575 } 1815 }
1576 1816
1577 // Test for http://crbug.com/76202 . We don't want to destroy a 1817 // Test for http://crbug.com/76202 . We don't want to destroy a
1578 // download request prematurely when processing a cancellation from 1818 // download request prematurely when processing a cancellation from
1579 // the renderer. 1819 // the renderer.
1580 TEST_F(ResourceDispatcherHostTest, IgnoreCancelForDownloads) { 1820 TEST_F(ResourceDispatcherHostTest, IgnoreCancelForDownloads) {
1581 EXPECT_EQ(0, host_.pending_requests()); 1821 EXPECT_EQ(0, host_.pending_requests());
1582 1822
1583 int render_view_id = 0; 1823 int render_view_id = 0;
1584 int request_id = 1; 1824 int request_id = 1;
1585 1825
1586 std::string raw_headers("HTTP\n" 1826 std::string raw_headers("HTTP\n"
1587 "Content-disposition: attachment; filename=foo\n\n"); 1827 "Content-disposition: attachment; filename=foo\n\n");
1588 std::string response_data("01234567890123456789\x01foobar"); 1828 std::string response_data("01234567890123456789\x01foobar");
1589 1829
1590 // Get past sniffing metrics in the BufferedResourceHandler. Note that 1830 // Get past sniffing metrics in the BufferedResourceHandler. Note that
1591 // if we don't get past the sniffing metrics, the result will be that 1831 // if we don't get past the sniffing metrics, the result will be that
1592 // the BufferedResourceHandler won't have figured out that it's a download, 1832 // the BufferedResourceHandler won't have figured out that it's a download,
1593 // won't have constructed a DownloadResourceHandler, and and the request 1833 // won't have constructed a DownloadResourceHandler, and and the request
1594 // will be successfully canceled below, failing the test. 1834 // will be successfully canceled below, failing the test.
1595 response_data.resize(1025, ' '); 1835 response_data.resize(1025, ' ');
1596 1836
1597 SetResponse(raw_headers, response_data); 1837 SetResponse(raw_headers, response_data);
1598 SetResourceType(ResourceType::MAIN_FRAME);
1599 SetDelayedCompleteJobGeneration(true); 1838 SetDelayedCompleteJobGeneration(true);
1600 HandleScheme("http"); 1839 HandleScheme("http");
1601 1840
1602 MakeTestRequest(render_view_id, request_id, GURL("http://example.com/blah")); 1841 MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id,
1842 GURL("http://example.com/blah"),
1843 ResourceType::MAIN_FRAME);
1603 // Return some data so that the request is identified as a download 1844 // Return some data so that the request is identified as a download
1604 // and the proper resource handlers are created. 1845 // and the proper resource handlers are created.
1605 EXPECT_TRUE(net::URLRequestTestJob::ProcessOnePendingMessage()); 1846 EXPECT_TRUE(net::URLRequestTestJob::ProcessOnePendingMessage());
1606 1847
1607 // And now simulate a cancellation coming from the renderer. 1848 // And now simulate a cancellation coming from the renderer.
1608 ResourceHostMsg_CancelRequest msg(request_id); 1849 ResourceHostMsg_CancelRequest msg(request_id);
1609 bool msg_was_ok; 1850 bool msg_was_ok;
1610 host_.OnMessageReceived(msg, filter_.get(), &msg_was_ok); 1851 host_.OnMessageReceived(msg, filter_.get(), &msg_was_ok);
1611 1852
1612 // Since the request had already started processing as a download, 1853 // Since the request had already started processing as a download,
(...skipping 10 matching lines...) Expand all
1623 int render_view_id = 0; 1864 int render_view_id = 0;
1624 int request_id = 1; 1865 int request_id = 1;
1625 1866
1626 std::string raw_headers("HTTP\n" 1867 std::string raw_headers("HTTP\n"
1627 "Content-disposition: attachment; filename=foo\n\n"); 1868 "Content-disposition: attachment; filename=foo\n\n");
1628 std::string response_data("01234567890123456789\x01foobar"); 1869 std::string response_data("01234567890123456789\x01foobar");
1629 // Get past sniffing metrics. 1870 // Get past sniffing metrics.
1630 response_data.resize(1025, ' '); 1871 response_data.resize(1025, ' ');
1631 1872
1632 SetResponse(raw_headers, response_data); 1873 SetResponse(raw_headers, response_data);
1633 SetResourceType(ResourceType::MAIN_FRAME);
1634 SetDelayedCompleteJobGeneration(true); 1874 SetDelayedCompleteJobGeneration(true);
1635 HandleScheme("http"); 1875 HandleScheme("http");
1636 1876
1637 MakeTestRequest(render_view_id, request_id, GURL("http://example.com/blah")); 1877 MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id,
1878 GURL("http://example.com/blah"),
1879 ResourceType::MAIN_FRAME);
1638 // Return some data so that the request is identified as a download 1880 // Return some data so that the request is identified as a download
1639 // and the proper resource handlers are created. 1881 // and the proper resource handlers are created.
1640 EXPECT_TRUE(net::URLRequestTestJob::ProcessOnePendingMessage()); 1882 EXPECT_TRUE(net::URLRequestTestJob::ProcessOnePendingMessage());
1641 1883
1642 // And now simulate a cancellation coming from the renderer. 1884 // And now simulate a cancellation coming from the renderer.
1643 ResourceHostMsg_CancelRequest msg(request_id); 1885 ResourceHostMsg_CancelRequest msg(request_id);
1644 bool msg_was_ok; 1886 bool msg_was_ok;
1645 host_.OnMessageReceived(msg, filter_.get(), &msg_was_ok); 1887 host_.OnMessageReceived(msg, filter_.get(), &msg_was_ok);
1646 1888
1647 // Since the request had already started processing as a download, 1889 // Since the request had already started processing as a download,
1648 // the cancellation above should have been ignored and the request 1890 // the cancellation above should have been ignored and the request
1649 // should still be alive. 1891 // should still be alive.
1650 EXPECT_EQ(1, host_.pending_requests()); 1892 EXPECT_EQ(1, host_.pending_requests());
1651 1893
1652 // Cancelling by other methods shouldn't work either. 1894 // Cancelling by other methods shouldn't work either.
1653 host_.CancelRequestsForProcess(render_view_id); 1895 host_.CancelRequestsForProcess(render_view_id);
1654 EXPECT_EQ(1, host_.pending_requests()); 1896 EXPECT_EQ(1, host_.pending_requests());
1655 1897
1656 // Cancelling by context should work. 1898 // Cancelling by context should work.
1657 host_.CancelRequestsForContext(filter_->resource_context()); 1899 host_.CancelRequestsForContext(filter_->resource_context());
1658 EXPECT_EQ(0, host_.pending_requests()); 1900 EXPECT_EQ(0, host_.pending_requests());
1659 } 1901 }
1660 1902
1903 TEST_F(ResourceDispatcherHostTest, CancelRequestsForContextDetachable) {
1904 EXPECT_EQ(0, host_.pending_requests());
1905
1906 int render_view_id = 0;
1907 int request_id = 1;
1908
1909 MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id,
1910 net::URLRequestTestJob::test_url_4(),
1911 ResourceType::PREFETCH); // detachable type
1912
1913 // Simulate a cancel coming from the renderer.
1914 host_.CancelRequest(filter_->child_id(), request_id, true);
1915
1916 // Since the request had already started processing as detachable,
1917 // the cancellation above should have been ignored and the request
1918 // should still be alive.
1919 EXPECT_EQ(1, host_.pending_requests());
1920
1921 // Cancelling by other methods should also be delayed.
1922 host_.CancelRequestsForProcess(render_view_id);
1923 EXPECT_EQ(1, host_.pending_requests());
1924
1925 // Cancelling by context should work.
1926 host_.CancelRequestsForContext(filter_->resource_context());
1927 EXPECT_EQ(0, host_.pending_requests());
1928 }
1929
1661 // Test the cancelling of requests that are being transferred to a new renderer 1930 // Test the cancelling of requests that are being transferred to a new renderer
1662 // due to a redirection. 1931 // due to a redirection.
1663 TEST_F(ResourceDispatcherHostTest, CancelRequestsForContextTransferred) { 1932 TEST_F(ResourceDispatcherHostTest, CancelRequestsForContextTransferred) {
1664 EXPECT_EQ(0, host_.pending_requests()); 1933 EXPECT_EQ(0, host_.pending_requests());
1665 1934
1666 int render_view_id = 0; 1935 int render_view_id = 0;
1667 int request_id = 1; 1936 int request_id = 1;
1668 1937
1669 std::string raw_headers("HTTP/1.1 200 OK\n" 1938 std::string raw_headers("HTTP/1.1 200 OK\n"
1670 "Content-Type: text/html; charset=utf-8\n\n"); 1939 "Content-Type: text/html; charset=utf-8\n\n");
1671 std::string response_data("<html>foobar</html>"); 1940 std::string response_data("<html>foobar</html>");
1672 1941
1673 SetResponse(raw_headers, response_data); 1942 SetResponse(raw_headers, response_data);
1674 SetResourceType(ResourceType::MAIN_FRAME);
1675 HandleScheme("http"); 1943 HandleScheme("http");
1676 1944
1677 MakeTestRequest(render_view_id, request_id, GURL("http://example.com/blah")); 1945 MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id,
1946 GURL("http://example.com/blah"),
1947 ResourceType::MAIN_FRAME);
1948
1678 1949
1679 GlobalRequestID global_request_id(filter_->child_id(), request_id); 1950 GlobalRequestID global_request_id(filter_->child_id(), request_id);
1680 host_.MarkAsTransferredNavigation(global_request_id, 1951 host_.MarkAsTransferredNavigation(global_request_id,
1681 GURL("http://example.com/blah")); 1952 GURL("http://example.com/blah"));
1682 1953
1683 // And now simulate a cancellation coming from the renderer. 1954 // And now simulate a cancellation coming from the renderer.
1684 ResourceHostMsg_CancelRequest msg(request_id); 1955 ResourceHostMsg_CancelRequest msg(request_id);
1685 bool msg_was_ok; 1956 bool msg_was_ok;
1686 host_.OnMessageReceived(msg, filter_.get(), &msg_was_ok); 1957 host_.OnMessageReceived(msg, filter_.get(), &msg_was_ok);
1687 1958
(...skipping 16 matching lines...) Expand all
1704 TEST_F(ResourceDispatcherHostTest, TransferNavigationHtml) { 1975 TEST_F(ResourceDispatcherHostTest, TransferNavigationHtml) {
1705 EXPECT_EQ(0, host_.pending_requests()); 1976 EXPECT_EQ(0, host_.pending_requests());
1706 1977
1707 int render_view_id = 0; 1978 int render_view_id = 0;
1708 int request_id = 1; 1979 int request_id = 1;
1709 1980
1710 // Configure initial request. 1981 // Configure initial request.
1711 SetResponse("HTTP/1.1 302 Found\n" 1982 SetResponse("HTTP/1.1 302 Found\n"
1712 "Location: http://other.com/blech\n\n"); 1983 "Location: http://other.com/blech\n\n");
1713 1984
1714 SetResourceType(ResourceType::MAIN_FRAME);
1715 HandleScheme("http"); 1985 HandleScheme("http");
1716 1986
1717 // Temporarily replace ContentBrowserClient with one that will trigger the 1987 // Temporarily replace ContentBrowserClient with one that will trigger the
1718 // transfer navigation code paths. 1988 // transfer navigation code paths.
1719 TransfersAllNavigationsContentBrowserClient new_client; 1989 TransfersAllNavigationsContentBrowserClient new_client;
1720 ContentBrowserClient* old_client = SetBrowserClientForTesting(&new_client); 1990 ContentBrowserClient* old_client = SetBrowserClientForTesting(&new_client);
1721 1991
1722 MakeTestRequest(render_view_id, request_id, GURL("http://example.com/blah")); 1992 MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id,
1993 GURL("http://example.com/blah"), ResourceType::MAIN_FRAME);
1723 1994
1724 // Now that we're blocked on the redirect, update the response and unblock by 1995 // Now that we're blocked on the redirect, update the response and unblock by
1725 // telling the AsyncResourceHandler to follow the redirect. 1996 // telling the AsyncResourceHandler to follow the redirect.
1726 const std::string kResponseBody = "hello world"; 1997 const std::string kResponseBody = "hello world";
1727 SetResponse("HTTP/1.1 200 OK\n" 1998 SetResponse("HTTP/1.1 200 OK\n"
1728 "Content-Type: text/html\n\n", 1999 "Content-Type: text/html\n\n",
1729 kResponseBody); 2000 kResponseBody);
1730 ResourceHostMsg_FollowRedirect redirect_msg(request_id, false, GURL()); 2001 ResourceHostMsg_FollowRedirect redirect_msg(request_id, false, GURL());
1731 bool msg_was_ok; 2002 bool msg_was_ok;
1732 host_.OnMessageReceived(redirect_msg, filter_.get(), &msg_was_ok); 2003 host_.OnMessageReceived(redirect_msg, filter_.get(), &msg_was_ok);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1775 TEST_F(ResourceDispatcherHostTest, TransferNavigationText) { 2046 TEST_F(ResourceDispatcherHostTest, TransferNavigationText) {
1776 EXPECT_EQ(0, host_.pending_requests()); 2047 EXPECT_EQ(0, host_.pending_requests());
1777 2048
1778 int render_view_id = 0; 2049 int render_view_id = 0;
1779 int request_id = 1; 2050 int request_id = 1;
1780 2051
1781 // Configure initial request. 2052 // Configure initial request.
1782 SetResponse("HTTP/1.1 302 Found\n" 2053 SetResponse("HTTP/1.1 302 Found\n"
1783 "Location: http://other.com/blech\n\n"); 2054 "Location: http://other.com/blech\n\n");
1784 2055
1785 SetResourceType(ResourceType::MAIN_FRAME);
1786 HandleScheme("http"); 2056 HandleScheme("http");
1787 2057
1788 // Temporarily replace ContentBrowserClient with one that will trigger the 2058 // Temporarily replace ContentBrowserClient with one that will trigger the
1789 // transfer navigation code paths. 2059 // transfer navigation code paths.
1790 TransfersAllNavigationsContentBrowserClient new_client; 2060 TransfersAllNavigationsContentBrowserClient new_client;
1791 ContentBrowserClient* old_client = SetBrowserClientForTesting(&new_client); 2061 ContentBrowserClient* old_client = SetBrowserClientForTesting(&new_client);
1792 2062
1793 MakeTestRequest(render_view_id, request_id, GURL("http://example.com/blah")); 2063 MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id,
2064 GURL("http://example.com/blah"),
2065 ResourceType::MAIN_FRAME);
1794 2066
1795 // Now that we're blocked on the redirect, update the response and unblock by 2067 // Now that we're blocked on the redirect, update the response and unblock by
1796 // telling the AsyncResourceHandler to follow the redirect. Use a text/plain 2068 // telling the AsyncResourceHandler to follow the redirect. Use a text/plain
1797 // MIME type, which causes BufferedResourceHandler to buffer it before the 2069 // MIME type, which causes BufferedResourceHandler to buffer it before the
1798 // transfer occurs. 2070 // transfer occurs.
1799 const std::string kResponseBody = "hello world"; 2071 const std::string kResponseBody = "hello world";
1800 SetResponse("HTTP/1.1 200 OK\n" 2072 SetResponse("HTTP/1.1 200 OK\n"
1801 "Content-Type: text/plain\n\n", 2073 "Content-Type: text/plain\n\n",
1802 kResponseBody); 2074 kResponseBody);
1803 ResourceHostMsg_FollowRedirect redirect_msg(request_id, false, GURL()); 2075 ResourceHostMsg_FollowRedirect redirect_msg(request_id, false, GURL());
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1847 2119
1848 int render_view_id = 0; 2120 int render_view_id = 0;
1849 int request_id = 1; 2121 int request_id = 1;
1850 int first_child_id = -1; 2122 int first_child_id = -1;
1851 2123
1852 // Configure initial request. 2124 // Configure initial request.
1853 SetResponse("HTTP/1.1 302 Found\n" 2125 SetResponse("HTTP/1.1 302 Found\n"
1854 "Location: http://other.com/blech\n\n"); 2126 "Location: http://other.com/blech\n\n");
1855 const std::string kResponseBody = "hello world"; 2127 const std::string kResponseBody = "hello world";
1856 2128
1857 SetResourceType(ResourceType::MAIN_FRAME);
1858 HandleScheme("http"); 2129 HandleScheme("http");
1859 2130
1860 // Temporarily replace ContentBrowserClient with one that will trigger the 2131 // Temporarily replace ContentBrowserClient with one that will trigger the
1861 // transfer navigation code paths. 2132 // transfer navigation code paths.
1862 TransfersAllNavigationsContentBrowserClient new_client; 2133 TransfersAllNavigationsContentBrowserClient new_client;
1863 ContentBrowserClient* old_client = SetBrowserClientForTesting(&new_client); 2134 ContentBrowserClient* old_client = SetBrowserClientForTesting(&new_client);
1864 2135
1865 // Create a first filter that can be deleted before the second one starts. 2136 // Create a first filter that can be deleted before the second one starts.
1866 { 2137 {
1867 scoped_refptr<ForwardingFilter> first_filter = new ForwardingFilter( 2138 scoped_refptr<ForwardingFilter> first_filter = new ForwardingFilter(
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1936 TEST_F(ResourceDispatcherHostTest, TransferNavigationWithTwoRedirects) { 2207 TEST_F(ResourceDispatcherHostTest, TransferNavigationWithTwoRedirects) {
1937 EXPECT_EQ(0, host_.pending_requests()); 2208 EXPECT_EQ(0, host_.pending_requests());
1938 2209
1939 int render_view_id = 0; 2210 int render_view_id = 0;
1940 int request_id = 1; 2211 int request_id = 1;
1941 2212
1942 // Configure initial request. 2213 // Configure initial request.
1943 SetResponse("HTTP/1.1 302 Found\n" 2214 SetResponse("HTTP/1.1 302 Found\n"
1944 "Location: http://other.com/blech\n\n"); 2215 "Location: http://other.com/blech\n\n");
1945 2216
1946 SetResourceType(ResourceType::MAIN_FRAME);
1947 HandleScheme("http"); 2217 HandleScheme("http");
1948 2218
1949 // Temporarily replace ContentBrowserClient with one that will trigger the 2219 // Temporarily replace ContentBrowserClient with one that will trigger the
1950 // transfer navigation code paths. 2220 // transfer navigation code paths.
1951 TransfersAllNavigationsContentBrowserClient new_client; 2221 TransfersAllNavigationsContentBrowserClient new_client;
1952 ContentBrowserClient* old_client = SetBrowserClientForTesting(&new_client); 2222 ContentBrowserClient* old_client = SetBrowserClientForTesting(&new_client);
1953 2223
1954 MakeTestRequest(render_view_id, request_id, GURL("http://example.com/blah")); 2224 MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id,
2225 GURL("http://example.com/blah"),
2226 ResourceType::MAIN_FRAME);
1955 2227
1956 // Now that we're blocked on the redirect, simulate hitting another redirect. 2228 // Now that we're blocked on the redirect, simulate hitting another redirect.
1957 SetResponse("HTTP/1.1 302 Found\n" 2229 SetResponse("HTTP/1.1 302 Found\n"
1958 "Location: http://other.com/blerg\n\n"); 2230 "Location: http://other.com/blerg\n\n");
1959 ResourceHostMsg_FollowRedirect redirect_msg(request_id, false, GURL()); 2231 ResourceHostMsg_FollowRedirect redirect_msg(request_id, false, GURL());
1960 bool msg_was_ok; 2232 bool msg_was_ok;
1961 host_.OnMessageReceived(redirect_msg, filter_.get(), &msg_was_ok); 2233 host_.OnMessageReceived(redirect_msg, filter_.get(), &msg_was_ok);
1962 base::MessageLoop::current()->RunUntilIdle(); 2234 base::MessageLoop::current()->RunUntilIdle();
1963 2235
1964 // Now that we're blocked on the second redirect, update the response and 2236 // Now that we're blocked on the second redirect, update the response and
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
2017 accum_.GetClassifiedMessages(&msgs); 2289 accum_.GetClassifiedMessages(&msgs);
2018 2290
2019 ASSERT_EQ(2U, msgs.size()); 2291 ASSERT_EQ(2U, msgs.size());
2020 EXPECT_EQ(ResourceMsg_ReceivedRedirect::ID, msgs[0][0].type()); 2292 EXPECT_EQ(ResourceMsg_ReceivedRedirect::ID, msgs[0][0].type());
2021 CheckSuccessfulRequest(msgs[1], kResponseBody); 2293 CheckSuccessfulRequest(msgs[1], kResponseBody);
2022 } 2294 }
2023 2295
2024 TEST_F(ResourceDispatcherHostTest, UnknownURLScheme) { 2296 TEST_F(ResourceDispatcherHostTest, UnknownURLScheme) {
2025 EXPECT_EQ(0, host_.pending_requests()); 2297 EXPECT_EQ(0, host_.pending_requests());
2026 2298
2027 SetResourceType(ResourceType::MAIN_FRAME);
2028 HandleScheme("http"); 2299 HandleScheme("http");
2029 2300
2030 MakeTestRequest(0, 1, GURL("foo://bar")); 2301 MakeTestRequestWithResourceType(filter_.get(), 0, 1, GURL("foo://bar"),
2302 ResourceType::MAIN_FRAME);
2031 2303
2032 // Flush all pending requests. 2304 // Flush all pending requests.
2033 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} 2305 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
2034 2306
2035 // Sort all the messages we saw by request. 2307 // Sort all the messages we saw by request.
2036 ResourceIPCAccumulator::ClassifiedMessages msgs; 2308 ResourceIPCAccumulator::ClassifiedMessages msgs;
2037 accum_.GetClassifiedMessages(&msgs); 2309 accum_.GetClassifiedMessages(&msgs);
2038 2310
2039 // We should have gotten one RequestComplete message. 2311 // We should have gotten one RequestComplete message.
2040 ASSERT_EQ(1U, msgs[0].size()); 2312 ASSERT_EQ(1U, msgs[0].size());
2041 EXPECT_EQ(ResourceMsg_RequestComplete::ID, msgs[0][0].type()); 2313 EXPECT_EQ(ResourceMsg_RequestComplete::ID, msgs[0][0].type());
2042 2314
2043 // The RequestComplete message should have the error code of 2315 // The RequestComplete message should have the error code of
2044 // ERR_UNKNOWN_URL_SCHEME. 2316 // ERR_UNKNOWN_URL_SCHEME.
2045 int request_id; 2317 CheckRequestCompleteErrorCode(msgs[0][0], net::ERR_UNKNOWN_URL_SCHEME);
2046 int error_code;
2047
2048 PickleIterator iter(msgs[0][0]);
2049 EXPECT_TRUE(IPC::ReadParam(&msgs[0][0], &iter, &request_id));
2050 EXPECT_TRUE(IPC::ReadParam(&msgs[0][0], &iter, &error_code));
2051
2052 EXPECT_EQ(1, request_id);
2053 EXPECT_EQ(net::ERR_UNKNOWN_URL_SCHEME, error_code);
2054 } 2318 }
2055 2319
2056 TEST_F(ResourceDispatcherHostTest, DataReceivedACKs) { 2320 TEST_F(ResourceDispatcherHostTest, DataReceivedACKs) {
2057 EXPECT_EQ(0, host_.pending_requests()); 2321 EXPECT_EQ(0, host_.pending_requests());
2058 2322
2059 SendDataReceivedACKs(true); 2323 SendDataReceivedACKs(true);
2060 2324
2061 HandleScheme("big-job"); 2325 HandleScheme("big-job");
2062 MakeTestRequest(0, 1, GURL("big-job:0123456789,1000000")); 2326 MakeTestRequest(0, 1, GURL("big-job:0123456789,1000000"));
2063 2327
2064 // Sort all the messages we saw by request. 2328 // Sort all the messages we saw by request.
2065 ResourceIPCAccumulator::ClassifiedMessages msgs; 2329 ResourceIPCAccumulator::ClassifiedMessages msgs;
2066 accum_.GetClassifiedMessages(&msgs); 2330 accum_.GetClassifiedMessages(&msgs);
2067 2331
2068 size_t size = msgs[0].size(); 2332 size_t size = msgs[0].size();
2069 2333
2070 EXPECT_EQ(ResourceMsg_ReceivedResponse::ID, msgs[0][0].type()); 2334 EXPECT_EQ(ResourceMsg_ReceivedResponse::ID, msgs[0][0].type());
2071 EXPECT_EQ(ResourceMsg_SetDataBuffer::ID, msgs[0][1].type()); 2335 EXPECT_EQ(ResourceMsg_SetDataBuffer::ID, msgs[0][1].type());
2072 for (size_t i = 2; i < size - 1; ++i) 2336 for (size_t i = 2; i < size - 1; ++i)
2073 EXPECT_EQ(ResourceMsg_DataReceived::ID, msgs[0][i].type()); 2337 EXPECT_EQ(ResourceMsg_DataReceived::ID, msgs[0][i].type());
2074 EXPECT_EQ(ResourceMsg_RequestComplete::ID, msgs[0][size - 1].type()); 2338 EXPECT_EQ(ResourceMsg_RequestComplete::ID, msgs[0][size - 1].type());
2075 } 2339 }
2076 2340
2341 // Request a very large detachable resource and cancel part way. Some of the
2342 // data should have been sent to the renderer, but not all.
2343 TEST_F(ResourceDispatcherHostTest, DataSentBeforeDetach) {
2344 EXPECT_EQ(0, host_.pending_requests());
2345
2346 int render_view_id = 0;
2347 int request_id = 1;
2348
2349 std::string raw_headers("HTTP\n"
2350 "Content-type: image/jpeg\n\n");
2351 std::string response_data("01234567890123456789\x01foobar");
2352
2353 // Create a response larger than kMaxAllocationSize (currently 32K). Note
2354 // that if this increase beyond 512K we'll need to make the response longer.
2355 const int kAllocSize = 1024*512;
2356 response_data.resize(kAllocSize, ' ');
2357
2358 SetResponse(raw_headers, response_data);
2359 SetDelayedCompleteJobGeneration(true);
2360 HandleScheme("http");
2361
2362 MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id,
2363 GURL("http://example.com/blah"),
2364 ResourceType::PREFETCH);
2365
2366 // Get a bit of data before cancelling.
2367 EXPECT_TRUE(net::URLRequestTestJob::ProcessOnePendingMessage());
2368
2369 // Simulate a cancellation coming from the renderer.
2370 ResourceHostMsg_CancelRequest msg(request_id);
2371 bool msg_was_ok;
2372 host_.OnMessageReceived(msg, filter_.get(), &msg_was_ok);
2373
2374 EXPECT_EQ(1, host_.pending_requests());
2375
2376 while (net::URLRequestTestJob::ProcessOnePendingMessage()) {}
2377
2378 // Sort all the messages we saw by request.
2379 ResourceIPCAccumulator::ClassifiedMessages msgs;
2380 accum_.GetClassifiedMessages(&msgs);
2381
2382 EXPECT_EQ(4U, msgs[0].size());
2383
2384 // Figure out how many bytes were received by the renderer.
2385 int data_offset;
2386 int data_length;
2387 ExtractDataOffsetAndLength(msgs[0][2], &data_offset, &data_length);
2388 EXPECT_LT(0, data_length);
2389 EXPECT_GT(kAllocSize, data_length);
2390
2391 // Verify the data that was received before cancellation. Also verify that the
2392 // response completed.
2393 CheckSuccessfulRequest(
2394 msgs[0],
2395 std::string(response_data.begin(), response_data.begin() + data_length));
2396 }
2397
2077 TEST_F(ResourceDispatcherHostTest, DelayedDataReceivedACKs) { 2398 TEST_F(ResourceDispatcherHostTest, DelayedDataReceivedACKs) {
2078 EXPECT_EQ(0, host_.pending_requests()); 2399 EXPECT_EQ(0, host_.pending_requests());
2079 2400
2080 HandleScheme("big-job"); 2401 HandleScheme("big-job");
2081 MakeTestRequest(0, 1, GURL("big-job:0123456789,1000000")); 2402 MakeTestRequest(0, 1, GURL("big-job:0123456789,1000000"));
2082 2403
2083 // Sort all the messages we saw by request. 2404 // Sort all the messages we saw by request.
2084 ResourceIPCAccumulator::ClassifiedMessages msgs; 2405 ResourceIPCAccumulator::ClassifiedMessages msgs;
2085 accum_.GetClassifiedMessages(&msgs); 2406 accum_.GetClassifiedMessages(&msgs);
2086 2407
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
2168 } 2489 }
2169 2490
2170 base::MessageLoop::current()->RunUntilIdle(); 2491 base::MessageLoop::current()->RunUntilIdle();
2171 2492
2172 msgs.clear(); 2493 msgs.clear();
2173 accum_.GetClassifiedMessages(&msgs); 2494 accum_.GetClassifiedMessages(&msgs);
2174 } 2495 }
2175 } 2496 }
2176 2497
2177 } // namespace content 2498 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/loader/resource_dispatcher_host_impl.cc ('k') | content/browser/loader/resource_loader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698