| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/loader/resource_loader.h" | 5 #include "content/browser/loader/resource_loader.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #include "base/threading/thread_task_runner_handle.h" | 21 #include "base/threading/thread_task_runner_handle.h" |
| 22 #include "content/browser/browser_thread_impl.h" | 22 #include "content/browser/browser_thread_impl.h" |
| 23 #include "content/browser/loader/redirect_to_file_resource_handler.h" | 23 #include "content/browser/loader/redirect_to_file_resource_handler.h" |
| 24 #include "content/browser/loader/resource_loader_delegate.h" | 24 #include "content/browser/loader/resource_loader_delegate.h" |
| 25 #include "content/common/ssl_status_serialization.h" | 25 #include "content/common/ssl_status_serialization.h" |
| 26 #include "content/public/browser/cert_store.h" | 26 #include "content/public/browser/cert_store.h" |
| 27 #include "content/public/browser/client_certificate_delegate.h" | 27 #include "content/public/browser/client_certificate_delegate.h" |
| 28 #include "content/public/browser/resource_request_info.h" | 28 #include "content/public/browser/resource_request_info.h" |
| 29 #include "content/public/common/content_paths.h" | 29 #include "content/public/common/content_paths.h" |
| 30 #include "content/public/common/resource_response.h" | 30 #include "content/public/common/resource_response.h" |
| 31 #include "content/public/common/resource_type.h" |
| 31 #include "content/public/test/mock_resource_context.h" | 32 #include "content/public/test/mock_resource_context.h" |
| 32 #include "content/public/test/test_browser_context.h" | 33 #include "content/public/test/test_browser_context.h" |
| 33 #include "content/public/test/test_browser_thread_bundle.h" | 34 #include "content/public/test/test_browser_thread_bundle.h" |
| 34 #include "content/public/test/test_renderer_host.h" | 35 #include "content/public/test/test_renderer_host.h" |
| 35 #include "content/test/test_content_browser_client.h" | 36 #include "content/test/test_content_browser_client.h" |
| 36 #include "content/test/test_web_contents.h" | 37 #include "content/test/test_web_contents.h" |
| 37 #include "ipc/ipc_message.h" | 38 #include "ipc/ipc_message.h" |
| 38 #include "net/base/chunked_upload_data_stream.h" | 39 #include "net/base/chunked_upload_data_stream.h" |
| 39 #include "net/base/io_buffer.h" | 40 #include "net/base/io_buffer.h" |
| 40 #include "net/base/mock_file_stream.h" | 41 #include "net/base/mock_file_stream.h" |
| (...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 582 } | 583 } |
| 583 | 584 |
| 584 virtual std::unique_ptr<ResourceHandler> WrapResourceHandler( | 585 virtual std::unique_ptr<ResourceHandler> WrapResourceHandler( |
| 585 std::unique_ptr<ResourceHandlerStub> leaf_handler, | 586 std::unique_ptr<ResourceHandlerStub> leaf_handler, |
| 586 net::URLRequest* request) { | 587 net::URLRequest* request) { |
| 587 return std::move(leaf_handler); | 588 return std::move(leaf_handler); |
| 588 } | 589 } |
| 589 | 590 |
| 590 // Replaces loader_ with a new one for |request|. | 591 // Replaces loader_ with a new one for |request|. |
| 591 void SetUpResourceLoader(std::unique_ptr<net::URLRequest> request, | 592 void SetUpResourceLoader(std::unique_ptr<net::URLRequest> request, |
| 592 bool is_main_frame) { | 593 ResourceType resource_type, |
| 594 bool belongs_to_main_frame) { |
| 593 raw_ptr_to_request_ = request.get(); | 595 raw_ptr_to_request_ = request.get(); |
| 594 | 596 |
| 595 ResourceType resource_type = | 597 // A request marked as a main frame request must also belong to a main |
| 596 is_main_frame ? RESOURCE_TYPE_MAIN_FRAME : RESOURCE_TYPE_SUB_FRAME; | 598 // frame. |
| 599 ASSERT_TRUE((resource_type != RESOURCE_TYPE_MAIN_FRAME) || |
| 600 belongs_to_main_frame); |
| 597 | 601 |
| 598 RenderFrameHost* rfh = web_contents_->GetMainFrame(); | 602 RenderFrameHost* rfh = web_contents_->GetMainFrame(); |
| 599 ResourceRequestInfo::AllocateForTesting( | 603 ResourceRequestInfo::AllocateForTesting( |
| 600 request.get(), resource_type, &resource_context_, | 604 request.get(), resource_type, &resource_context_, |
| 601 rfh->GetProcess()->GetID(), rfh->GetRenderViewHost()->GetRoutingID(), | 605 rfh->GetProcess()->GetID(), rfh->GetRenderViewHost()->GetRoutingID(), |
| 602 rfh->GetRoutingID(), is_main_frame, false /* parent_is_main_frame */, | 606 rfh->GetRoutingID(), belongs_to_main_frame, |
| 603 true /* allow_download */, false /* is_async */, | 607 false /* parent_is_main_frame */, true /* allow_download */, |
| 604 false /* is_using_lofi_ */); | 608 false /* is_async */, false /* is_using_lofi_ */); |
| 605 std::unique_ptr<ResourceHandlerStub> resource_handler( | 609 std::unique_ptr<ResourceHandlerStub> resource_handler( |
| 606 new ResourceHandlerStub(request.get())); | 610 new ResourceHandlerStub(request.get())); |
| 607 raw_ptr_resource_handler_ = resource_handler.get(); | 611 raw_ptr_resource_handler_ = resource_handler.get(); |
| 608 loader_.reset(new ResourceLoader( | 612 loader_.reset(new ResourceLoader( |
| 609 std::move(request), | 613 std::move(request), |
| 610 WrapResourceHandler(std::move(resource_handler), raw_ptr_to_request_), | 614 WrapResourceHandler(std::move(resource_handler), raw_ptr_to_request_), |
| 611 CertStore::GetInstance(), this)); | 615 CertStore::GetInstance(), this)); |
| 612 } | 616 } |
| 613 | 617 |
| 614 void SetUp() override { | 618 void SetUp() override { |
| 615 job_factory_.SetProtocolHandler("test", CreateProtocolHandler()); | 619 job_factory_.SetProtocolHandler("test", CreateProtocolHandler()); |
| 616 | 620 |
| 617 browser_context_.reset(new TestBrowserContext()); | 621 browser_context_.reset(new TestBrowserContext()); |
| 618 scoped_refptr<SiteInstance> site_instance = | 622 scoped_refptr<SiteInstance> site_instance = |
| 619 SiteInstance::Create(browser_context_.get()); | 623 SiteInstance::Create(browser_context_.get()); |
| 620 web_contents_.reset( | 624 web_contents_.reset( |
| 621 TestWebContents::Create(browser_context_.get(), site_instance.get())); | 625 TestWebContents::Create(browser_context_.get(), site_instance.get())); |
| 622 | 626 |
| 623 std::unique_ptr<net::URLRequest> request( | 627 std::unique_ptr<net::URLRequest> request( |
| 624 resource_context_.GetRequestContext()->CreateRequest( | 628 resource_context_.GetRequestContext()->CreateRequest( |
| 625 test_url(), net::DEFAULT_PRIORITY, nullptr /* delegate */)); | 629 test_url(), net::DEFAULT_PRIORITY, nullptr /* delegate */)); |
| 626 SetUpResourceLoader(std::move(request), true); | 630 SetUpResourceLoader(std::move(request), RESOURCE_TYPE_MAIN_FRAME, true); |
| 627 } | 631 } |
| 628 | 632 |
| 629 void TearDown() override { | 633 void TearDown() override { |
| 630 // Destroy the WebContents and pump the event loop before destroying | 634 // Destroy the WebContents and pump the event loop before destroying |
| 631 // |rvh_test_enabler_| and |thread_bundle_|. This lets asynchronous cleanup | 635 // |rvh_test_enabler_| and |thread_bundle_|. This lets asynchronous cleanup |
| 632 // tasks complete. | 636 // tasks complete. |
| 633 web_contents_.reset(); | 637 web_contents_.reset(); |
| 634 base::RunLoop().RunUntilIdle(); | 638 base::RunLoop().RunUntilIdle(); |
| 635 } | 639 } |
| 636 | 640 |
| (...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1105 EXPECT_EQ(test_data(), contents); | 1109 EXPECT_EQ(test_data(), contents); |
| 1106 } | 1110 } |
| 1107 | 1111 |
| 1108 // Test that an HTTPS resource has the expected security info attached | 1112 // Test that an HTTPS resource has the expected security info attached |
| 1109 // to it. | 1113 // to it. |
| 1110 TEST_F(HTTPSSecurityInfoResourceLoaderTest, SecurityInfoOnHTTPSResource) { | 1114 TEST_F(HTTPSSecurityInfoResourceLoaderTest, SecurityInfoOnHTTPSResource) { |
| 1111 // Start the request and wait for it to finish. | 1115 // Start the request and wait for it to finish. |
| 1112 std::unique_ptr<net::URLRequest> request( | 1116 std::unique_ptr<net::URLRequest> request( |
| 1113 resource_context_.GetRequestContext()->CreateRequest( | 1117 resource_context_.GetRequestContext()->CreateRequest( |
| 1114 test_https_url(), net::DEFAULT_PRIORITY, nullptr /* delegate */)); | 1118 test_https_url(), net::DEFAULT_PRIORITY, nullptr /* delegate */)); |
| 1115 SetUpResourceLoader(std::move(request), true); | 1119 SetUpResourceLoader(std::move(request), RESOURCE_TYPE_MAIN_FRAME, true); |
| 1116 | 1120 |
| 1117 // Send the request and wait until it completes. | 1121 // Send the request and wait until it completes. |
| 1118 loader_->StartRequest(); | 1122 loader_->StartRequest(); |
| 1119 raw_ptr_resource_handler_->WaitForResponseComplete(); | 1123 raw_ptr_resource_handler_->WaitForResponseComplete(); |
| 1120 ASSERT_EQ(net::URLRequestStatus::SUCCESS, | 1124 ASSERT_EQ(net::URLRequestStatus::SUCCESS, |
| 1121 raw_ptr_to_request_->status().status()); | 1125 raw_ptr_to_request_->status().status()); |
| 1122 | 1126 |
| 1123 ResourceResponse* response = raw_ptr_resource_handler_->response(); | 1127 ResourceResponse* response = raw_ptr_resource_handler_->response(); |
| 1124 ASSERT_TRUE(response); | 1128 ASSERT_TRUE(response); |
| 1125 | 1129 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1144 | 1148 |
| 1145 // Test that an HTTPS redirect response has the expected security info | 1149 // Test that an HTTPS redirect response has the expected security info |
| 1146 // attached to it. | 1150 // attached to it. |
| 1147 TEST_F(HTTPSSecurityInfoResourceLoaderTest, | 1151 TEST_F(HTTPSSecurityInfoResourceLoaderTest, |
| 1148 SecurityInfoOnHTTPSRedirectResource) { | 1152 SecurityInfoOnHTTPSRedirectResource) { |
| 1149 // Start the request and wait for it to finish. | 1153 // Start the request and wait for it to finish. |
| 1150 std::unique_ptr<net::URLRequest> request( | 1154 std::unique_ptr<net::URLRequest> request( |
| 1151 resource_context_.GetRequestContext()->CreateRequest( | 1155 resource_context_.GetRequestContext()->CreateRequest( |
| 1152 test_https_redirect_url(), net::DEFAULT_PRIORITY, | 1156 test_https_redirect_url(), net::DEFAULT_PRIORITY, |
| 1153 nullptr /* delegate */)); | 1157 nullptr /* delegate */)); |
| 1154 SetUpResourceLoader(std::move(request), true); | 1158 SetUpResourceLoader(std::move(request), RESOURCE_TYPE_MAIN_FRAME, true); |
| 1155 | 1159 |
| 1156 // Send the request and wait until it completes. | 1160 // Send the request and wait until it completes. |
| 1157 loader_->StartRequest(); | 1161 loader_->StartRequest(); |
| 1158 raw_ptr_resource_handler_->WaitForResponseComplete(); | 1162 raw_ptr_resource_handler_->WaitForResponseComplete(); |
| 1159 ASSERT_EQ(net::URLRequestStatus::SUCCESS, | 1163 ASSERT_EQ(net::URLRequestStatus::SUCCESS, |
| 1160 raw_ptr_to_request_->status().status()); | 1164 raw_ptr_to_request_->status().status()); |
| 1161 ASSERT_TRUE(raw_ptr_resource_handler_->received_request_redirected()); | 1165 ASSERT_TRUE(raw_ptr_resource_handler_->received_request_redirected()); |
| 1162 | 1166 |
| 1163 ResourceResponse* redirect_response = | 1167 ResourceResponse* redirect_response = |
| 1164 raw_ptr_resource_handler_->redirect_response(); | 1168 raw_ptr_resource_handler_->redirect_response(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1179 EXPECT_TRUE(cert->Equals(GetTestCert().get())); | 1183 EXPECT_TRUE(cert->Equals(GetTestCert().get())); |
| 1180 | 1184 |
| 1181 EXPECT_EQ(kTestCertError, deserialized.cert_status); | 1185 EXPECT_EQ(kTestCertError, deserialized.cert_status); |
| 1182 EXPECT_EQ(kTestConnectionStatus, deserialized.connection_status); | 1186 EXPECT_EQ(kTestConnectionStatus, deserialized.connection_status); |
| 1183 EXPECT_EQ(kTestSecurityBits, deserialized.security_bits); | 1187 EXPECT_EQ(kTestSecurityBits, deserialized.security_bits); |
| 1184 } | 1188 } |
| 1185 | 1189 |
| 1186 class EffectiveConnectionTypeResourceLoaderTest : public ResourceLoaderTest { | 1190 class EffectiveConnectionTypeResourceLoaderTest : public ResourceLoaderTest { |
| 1187 public: | 1191 public: |
| 1188 void VerifyEffectiveConnectionType( | 1192 void VerifyEffectiveConnectionType( |
| 1189 bool is_main_frame, | 1193 ResourceType resource_type, |
| 1194 bool belongs_to_main_frame, |
| 1190 net::EffectiveConnectionType set_type, | 1195 net::EffectiveConnectionType set_type, |
| 1191 net::EffectiveConnectionType expected_type) { | 1196 net::EffectiveConnectionType expected_type) { |
| 1192 network_quality_estimator()->set_effective_connection_type(set_type); | 1197 network_quality_estimator()->set_effective_connection_type(set_type); |
| 1193 | 1198 |
| 1194 // Start the request and wait for it to finish. | 1199 // Start the request and wait for it to finish. |
| 1195 std::unique_ptr<net::URLRequest> request( | 1200 std::unique_ptr<net::URLRequest> request( |
| 1196 resource_context_.GetRequestContext()->CreateRequest( | 1201 resource_context_.GetRequestContext()->CreateRequest( |
| 1197 test_url(), net::DEFAULT_PRIORITY, nullptr /* delegate */)); | 1202 test_url(), net::DEFAULT_PRIORITY, nullptr /* delegate */)); |
| 1198 SetUpResourceLoader(std::move(request), is_main_frame); | 1203 SetUpResourceLoader(std::move(request), resource_type, |
| 1204 belongs_to_main_frame); |
| 1199 | 1205 |
| 1200 // Send the request and wait until it completes. | 1206 // Send the request and wait until it completes. |
| 1201 loader_->StartRequest(); | 1207 loader_->StartRequest(); |
| 1202 raw_ptr_resource_handler_->WaitForResponseComplete(); | 1208 raw_ptr_resource_handler_->WaitForResponseComplete(); |
| 1203 ASSERT_EQ(net::URLRequestStatus::SUCCESS, | 1209 ASSERT_EQ(net::URLRequestStatus::SUCCESS, |
| 1204 raw_ptr_to_request_->status().status()); | 1210 raw_ptr_to_request_->status().status()); |
| 1205 | 1211 |
| 1206 EXPECT_EQ(expected_type, | 1212 EXPECT_EQ(expected_type, |
| 1207 raw_ptr_resource_handler_->observed_effective_connection_type()); | 1213 raw_ptr_resource_handler_->observed_effective_connection_type()); |
| 1208 } | 1214 } |
| 1209 }; | 1215 }; |
| 1210 | 1216 |
| 1211 // Tests that the effective connection type is set on main frame requests. | 1217 // Tests that the effective connection type is set on main frame requests. |
| 1212 TEST_F(EffectiveConnectionTypeResourceLoaderTest, Slow2G) { | 1218 TEST_F(EffectiveConnectionTypeResourceLoaderTest, Slow2G) { |
| 1213 VerifyEffectiveConnectionType(true, net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G, | 1219 VerifyEffectiveConnectionType(RESOURCE_TYPE_MAIN_FRAME, true, |
| 1220 net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G, |
| 1214 net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G); | 1221 net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G); |
| 1215 } | 1222 } |
| 1216 | 1223 |
| 1217 // Tests that the effective connection type is set on main frame requests. | 1224 // Tests that the effective connection type is set on main frame requests. |
| 1218 TEST_F(EffectiveConnectionTypeResourceLoaderTest, 3G) { | 1225 TEST_F(EffectiveConnectionTypeResourceLoaderTest, 3G) { |
| 1219 VerifyEffectiveConnectionType(true, net::EFFECTIVE_CONNECTION_TYPE_3G, | 1226 VerifyEffectiveConnectionType(RESOURCE_TYPE_MAIN_FRAME, true, |
| 1227 net::EFFECTIVE_CONNECTION_TYPE_3G, |
| 1220 net::EFFECTIVE_CONNECTION_TYPE_3G); | 1228 net::EFFECTIVE_CONNECTION_TYPE_3G); |
| 1221 } | 1229 } |
| 1222 | 1230 |
| 1231 // Tests that the effective connection type is not set on requests that belong |
| 1232 // to main frame. |
| 1233 TEST_F(EffectiveConnectionTypeResourceLoaderTest, BelongsToMainFrame) { |
| 1234 VerifyEffectiveConnectionType(RESOURCE_TYPE_OBJECT, true, |
| 1235 net::EFFECTIVE_CONNECTION_TYPE_3G, |
| 1236 net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN); |
| 1237 } |
| 1238 |
| 1223 // Tests that the effective connection type is not set on non-main frame | 1239 // Tests that the effective connection type is not set on non-main frame |
| 1224 // requests. | 1240 // requests. |
| 1225 TEST_F(EffectiveConnectionTypeResourceLoaderTest, NotAMainFrame) { | 1241 TEST_F(EffectiveConnectionTypeResourceLoaderTest, DoesNotBelongToMainFrame) { |
| 1226 VerifyEffectiveConnectionType(false, net::EFFECTIVE_CONNECTION_TYPE_3G, | 1242 VerifyEffectiveConnectionType(RESOURCE_TYPE_OBJECT, false, |
| 1243 net::EFFECTIVE_CONNECTION_TYPE_3G, |
| 1227 net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN); | 1244 net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN); |
| 1228 } | 1245 } |
| 1229 | 1246 |
| 1230 } // namespace content | 1247 } // namespace content |
| OLD | NEW |