Index: content/browser/loader/resource_dispatcher_host_unittest.cc |
diff --git a/content/browser/loader/resource_dispatcher_host_unittest.cc b/content/browser/loader/resource_dispatcher_host_unittest.cc |
index 80d78c508282411331ebbcb5fe9db93c24250cc0..47a2dbdb83f1f979d248fb104f63f473cd0396d3 100644 |
--- a/content/browser/loader/resource_dispatcher_host_unittest.cc |
+++ b/content/browser/loader/resource_dispatcher_host_unittest.cc |
@@ -946,6 +946,12 @@ class ResourceDispatcherHostTest : public testing::Test, |
void MakeWebContentsAssociatedTestRequest(int request_id, const GURL& url); |
+ void MakeTestFetchRequestWithRedirectMode( |
+ int render_view_id, |
+ int request_id, |
+ const GURL& url, |
+ FetchRedirectMode fetch_redirect_mode); |
+ |
void CancelRequest(int request_id); |
void RendererCancelRequest(int request_id) { |
ResourceMessageFilter* old_filter = SetFilter(filter_.get()); |
@@ -1072,6 +1078,19 @@ void ResourceDispatcherHostTest::MakeWebContentsAssociatedTestRequest( |
KickOffRequest(); |
} |
+void ResourceDispatcherHostTest::MakeTestFetchRequestWithRedirectMode( |
+ int render_view_id, |
+ int request_id, |
+ const GURL& url, |
+ FetchRedirectMode fetch_redirect_mode) { |
+ ResourceHostMsg_Request request = |
+ CreateResourceRequest("GET", RESOURCE_TYPE_SUB_RESOURCE, url); |
+ request.fetch_redirect_mode = fetch_redirect_mode; |
+ ResourceHostMsg_RequestResource msg(render_view_id, request_id, request); |
+ host_.OnMessageReceived(msg, filter_.get()); |
+ KickOffRequest(); |
+} |
+ |
void ResourceDispatcherHostTest::CancelRequest(int request_id) { |
host_.CancelRequest(filter_->child_id(), request_id); |
} |
@@ -1183,7 +1202,6 @@ void CheckSuccessfulRedirect(const std::vector<IPC::Message>& messages, |
} |
void CheckFailedRequest(const std::vector<IPC::Message>& messages, |
- const std::string& reference_data, |
int expected_error) { |
ASSERT_LT(0U, messages.size()); |
ASSERT_GE(2U, messages.size()); |
@@ -2019,8 +2037,7 @@ TEST_F(ResourceDispatcherHostTest, TooMuchOutstandingRequestsMemory) { |
for (int i = 0; i < 2; ++i) { |
// Should have sent a single RequestComplete message. |
int index = kMaxRequests + i; |
- CheckFailedRequest(msgs[index], net::URLRequestTestJob::test_data_2(), |
- net::ERR_INSUFFICIENT_RESOURCES); |
+ CheckFailedRequest(msgs[index], net::ERR_INSUFFICIENT_RESOURCES); |
} |
// The final 2 requests should have succeeded. |
@@ -2086,12 +2103,10 @@ TEST_F(ResourceDispatcherHostTest, TooManyOutstandingRequests) { |
CheckSuccessfulRequest(msgs[i], net::URLRequestTestJob::test_data_2()); |
CheckFailedRequest(msgs[kMaxRequestsPerProcess + 0], |
- net::URLRequestTestJob::test_data_2(), |
net::ERR_INSUFFICIENT_RESOURCES); |
CheckSuccessfulRequest(msgs[kMaxRequestsPerProcess + 1], |
net::URLRequestTestJob::test_data_2()); |
CheckFailedRequest(msgs[kMaxRequestsPerProcess + 2], |
- net::URLRequestTestJob::test_data_2(), |
net::ERR_INSUFFICIENT_RESOURCES); |
} |
@@ -3329,6 +3344,49 @@ TEST_F(ResourceDispatcherHostTest, TransferRequestRedirected) { |
web_contents_observer_->resource_request_redirect_count()); |
} |
+// Confirm that the redirect response is handled as an error when the request's |
+// redirect mode is "error". |
+TEST_F(ResourceDispatcherHostTest, FetchRedirectModeError) { |
+ MakeTestFetchRequestWithRedirectMode( |
+ 0, 1, net::URLRequestTestJob::test_url_redirect_to_url_2(), |
+ FETCH_REDIRECT_MODE_ERROR); |
+ |
+ // flush all the pending requests |
+ while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} |
+ base::MessageLoop::current()->RunUntilIdle(); |
+ |
+ // sorts out all the messages we saw by request |
+ ResourceIPCAccumulator::ClassifiedMessages msgs; |
+ accum_.GetClassifiedMessages(&msgs); |
+ |
+ ASSERT_EQ(1U, msgs.size()); |
+ CheckFailedRequest(msgs[0], net::ERR_ABORTED); |
+} |
+ |
+// Confirm that the redirect response is not followed when the request's |
+// redirect mode is "manual". |
+TEST_F(ResourceDispatcherHostTest, FetchRedirectModeManual) { |
+ MakeTestFetchRequestWithRedirectMode( |
+ 0, 1, net::URLRequestTestJob::test_url_redirect_to_url_2(), |
+ FETCH_REDIRECT_MODE_MANUAL); |
+ |
+ // flush all the pending requests |
+ while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} |
+ base::MessageLoop::current()->RunUntilIdle(); |
+ |
+ // sorts out all the messages we saw by request |
+ ResourceIPCAccumulator::ClassifiedMessages msgs; |
+ accum_.GetClassifiedMessages(&msgs); |
+ |
+ ASSERT_EQ(1U, msgs.size()); |
+ ASSERT_EQ(2U, msgs[0].size()); |
+ ResourceResponseHead response_head; |
+ GetResponseHead(msgs[0], &response_head); |
+ ASSERT_TRUE(response_head.headers); |
+ ASSERT_EQ(302, response_head.headers->response_code()); |
+ CheckRequestCompleteErrorCode(msgs[0][1], net::OK); |
+} |
+ |
net::URLRequestJob* TestURLRequestJobFactory::MaybeCreateJobWithProtocolHandler( |
const std::string& scheme, |
net::URLRequest* request, |