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

Side by Side Diff: chrome/browser/extensions/api/web_request/web_request_api_unittest.cc

Issue 154473002: Support redirectUrl at onHeadersReceived in WebRequest / DWR API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Pass allowed_unsafe_redirect_url via delegate parameter instead of HttpResponseHeaders + fragment t… Created 6 years, 9 months 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 <map> 5 #include <map>
6 #include <queue> 6 #include <queue>
7 7
8 #include "base/basictypes.h" 8 #include "base/basictypes.h"
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 1257 matching lines...) Expand 10 before | Expand all | Expand 10 after
1268 scoped_refptr<net::HttpResponseHeaders> base_headers( 1268 scoped_refptr<net::HttpResponseHeaders> base_headers(
1269 new net::HttpResponseHeaders( 1269 new net::HttpResponseHeaders(
1270 net::HttpUtil::AssembleRawHeaders( 1270 net::HttpUtil::AssembleRawHeaders(
1271 base_headers_string, sizeof(base_headers_string)))); 1271 base_headers_string, sizeof(base_headers_string))));
1272 1272
1273 ResponseHeaders new_headers; 1273 ResponseHeaders new_headers;
1274 new_headers.push_back(ResponseHeader("kEy1", "Value1")); // Unchanged 1274 new_headers.push_back(ResponseHeader("kEy1", "Value1")); // Unchanged
1275 new_headers.push_back(ResponseHeader("Key2", "Value1")); // Modified 1275 new_headers.push_back(ResponseHeader("Key2", "Value1")); // Modified
1276 // Key3 is deleted 1276 // Key3 is deleted
1277 new_headers.push_back(ResponseHeader("Key4", "Value4")); // Added 1277 new_headers.push_back(ResponseHeader("Key4", "Value4")); // Added
1278 GURL effective_new_url;
1278 1279
1279 scoped_ptr<EventResponseDelta> delta(CalculateOnHeadersReceivedDelta( 1280 scoped_ptr<EventResponseDelta> delta(CalculateOnHeadersReceivedDelta(
1280 "extid", base::Time::Now(), cancel, base_headers.get(), &new_headers)); 1281 "extid", base::Time::Now(), cancel, effective_new_url,
1282 base_headers.get(), &new_headers));
1281 ASSERT_TRUE(delta.get()); 1283 ASSERT_TRUE(delta.get());
1282 EXPECT_TRUE(delta->cancel); 1284 EXPECT_TRUE(delta->cancel);
1283 EXPECT_EQ(2u, delta->added_response_headers.size()); 1285 EXPECT_EQ(2u, delta->added_response_headers.size());
1284 EXPECT_TRUE(Contains(delta->added_response_headers, 1286 EXPECT_TRUE(Contains(delta->added_response_headers,
1285 ResponseHeader("Key2", "Value1"))); 1287 ResponseHeader("Key2", "Value1")));
1286 EXPECT_TRUE(Contains(delta->added_response_headers, 1288 EXPECT_TRUE(Contains(delta->added_response_headers,
1287 ResponseHeader("Key4", "Value4"))); 1289 ResponseHeader("Key4", "Value4")));
1288 EXPECT_EQ(2u, delta->deleted_response_headers.size()); 1290 EXPECT_EQ(2u, delta->deleted_response_headers.size());
1289 EXPECT_TRUE(Contains(delta->deleted_response_headers, 1291 EXPECT_TRUE(Contains(delta->deleted_response_headers,
1290 ResponseHeader("Key2", "Value2, Bar"))); 1292 ResponseHeader("Key2", "Value2, Bar")));
(...skipping 662 matching lines...) Expand 10 before | Expand all | Expand 10 after
1953 scoped_refptr<net::HttpResponseHeaders> base_headers( 1955 scoped_refptr<net::HttpResponseHeaders> base_headers(
1954 new net::HttpResponseHeaders( 1956 new net::HttpResponseHeaders(
1955 net::HttpUtil::AssembleRawHeaders( 1957 net::HttpUtil::AssembleRawHeaders(
1956 base_headers_string, sizeof(base_headers_string)))); 1958 base_headers_string, sizeof(base_headers_string))));
1957 1959
1958 // Check that we can handle if not touching the response headers. 1960 // Check that we can handle if not touching the response headers.
1959 linked_ptr<EventResponseDelta> d0( 1961 linked_ptr<EventResponseDelta> d0(
1960 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); 1962 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000)));
1961 deltas.push_back(d0); 1963 deltas.push_back(d0);
1962 scoped_refptr<net::HttpResponseHeaders> new_headers0; 1964 scoped_refptr<net::HttpResponseHeaders> new_headers0;
1963 MergeOnHeadersReceivedResponses(deltas, base_headers.get(), &new_headers0, 1965 GURL allowed_unsafe_redirect_url0;
1964 &warning_set, &net_log); 1966 MergeOnHeadersReceivedResponses(
1967 deltas, base_headers.get(), &new_headers0, &allowed_unsafe_redirect_url0,
1968 &warning_set, &net_log);
1965 EXPECT_FALSE(new_headers0.get()); 1969 EXPECT_FALSE(new_headers0.get());
1970 EXPECT_TRUE(allowed_unsafe_redirect_url0.is_empty());
1966 EXPECT_EQ(0u, warning_set.size()); 1971 EXPECT_EQ(0u, warning_set.size());
1967 EXPECT_EQ(0u, capturing_net_log.GetSize()); 1972 EXPECT_EQ(0u, capturing_net_log.GetSize());
1968 1973
1969 linked_ptr<EventResponseDelta> d1( 1974 linked_ptr<EventResponseDelta> d1(
1970 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); 1975 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000)));
1971 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1")); 1976 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1"));
1972 d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2, Foo")); 1977 d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2, Foo"));
1973 d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3")); 1978 d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3"));
1974 deltas.push_back(d1); 1979 deltas.push_back(d1);
1975 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); 1980 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
1976 warning_set.clear(); 1981 warning_set.clear();
1977 capturing_net_log.Clear(); 1982 capturing_net_log.Clear();
1978 scoped_refptr<net::HttpResponseHeaders> new_headers1; 1983 scoped_refptr<net::HttpResponseHeaders> new_headers1;
1984 GURL allowed_unsafe_redirect_url1;
1979 MergeOnHeadersReceivedResponses( 1985 MergeOnHeadersReceivedResponses(
1980 deltas, base_headers.get(), &new_headers1, &warning_set, &net_log); 1986 deltas, base_headers.get(), &new_headers1, &allowed_unsafe_redirect_url1,
1987 &warning_set, &net_log);
1981 ASSERT_TRUE(new_headers1.get()); 1988 ASSERT_TRUE(new_headers1.get());
1989 EXPECT_TRUE(allowed_unsafe_redirect_url1.is_empty());
1982 std::multimap<std::string, std::string> expected1; 1990 std::multimap<std::string, std::string> expected1;
1983 expected1.insert(std::pair<std::string, std::string>("Key2", "Value3")); 1991 expected1.insert(std::pair<std::string, std::string>("Key2", "Value3"));
1984 void* iter = NULL; 1992 void* iter = NULL;
1985 std::string name; 1993 std::string name;
1986 std::string value; 1994 std::string value;
1987 std::multimap<std::string, std::string> actual1; 1995 std::multimap<std::string, std::string> actual1;
1988 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { 1996 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) {
1989 actual1.insert(std::pair<std::string, std::string>(name, value)); 1997 actual1.insert(std::pair<std::string, std::string>(name, value));
1990 } 1998 }
1991 EXPECT_EQ(expected1, actual1); 1999 EXPECT_EQ(expected1, actual1);
1992 EXPECT_EQ(0u, warning_set.size()); 2000 EXPECT_EQ(0u, warning_set.size());
1993 EXPECT_EQ(1u, capturing_net_log.GetSize()); 2001 EXPECT_EQ(1u, capturing_net_log.GetSize());
1994 2002
1995 // Check that we replace response headers only once. 2003 // Check that we replace response headers only once.
1996 linked_ptr<EventResponseDelta> d2( 2004 linked_ptr<EventResponseDelta> d2(
1997 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); 2005 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500)));
1998 // Note that we use a different capitalization of KeY2. This should not 2006 // Note that we use a different capitalization of KeY2. This should not
1999 // matter. 2007 // matter.
2000 d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2, Foo")); 2008 d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2, Foo"));
2001 d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4")); 2009 d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4"));
2002 deltas.push_back(d2); 2010 deltas.push_back(d2);
2003 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); 2011 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
2004 warning_set.clear(); 2012 warning_set.clear();
2005 capturing_net_log.Clear(); 2013 capturing_net_log.Clear();
2006 scoped_refptr<net::HttpResponseHeaders> new_headers2; 2014 scoped_refptr<net::HttpResponseHeaders> new_headers2;
2015 GURL allowed_unsafe_redirect_url2;
2007 MergeOnHeadersReceivedResponses( 2016 MergeOnHeadersReceivedResponses(
2008 deltas, base_headers.get(), &new_headers2, &warning_set, &net_log); 2017 deltas, base_headers.get(), &new_headers2, &allowed_unsafe_redirect_url2,
2018 &warning_set, &net_log);
2009 ASSERT_TRUE(new_headers2.get()); 2019 ASSERT_TRUE(new_headers2.get());
2020 EXPECT_TRUE(allowed_unsafe_redirect_url2.is_empty());
2010 iter = NULL; 2021 iter = NULL;
2011 std::multimap<std::string, std::string> actual2; 2022 std::multimap<std::string, std::string> actual2;
2012 while (new_headers2->EnumerateHeaderLines(&iter, &name, &value)) { 2023 while (new_headers2->EnumerateHeaderLines(&iter, &name, &value)) {
2013 actual2.insert(std::pair<std::string, std::string>(name, value)); 2024 actual2.insert(std::pair<std::string, std::string>(name, value));
2014 } 2025 }
2015 EXPECT_EQ(expected1, actual2); 2026 EXPECT_EQ(expected1, actual2);
2016 EXPECT_EQ(1u, warning_set.size()); 2027 EXPECT_EQ(1u, warning_set.size());
2017 EXPECT_TRUE(HasWarning(warning_set, "extid2")); 2028 EXPECT_TRUE(HasWarning(warning_set, "extid2"));
2018 EXPECT_EQ(2u, capturing_net_log.GetSize()); 2029 EXPECT_EQ(2u, capturing_net_log.GetSize());
2019 } 2030 }
(...skipping 17 matching lines...) Expand all
2037 scoped_refptr<net::HttpResponseHeaders> base_headers( 2048 scoped_refptr<net::HttpResponseHeaders> base_headers(
2038 new net::HttpResponseHeaders( 2049 new net::HttpResponseHeaders(
2039 net::HttpUtil::AssembleRawHeaders( 2050 net::HttpUtil::AssembleRawHeaders(
2040 base_headers_string, sizeof(base_headers_string)))); 2051 base_headers_string, sizeof(base_headers_string))));
2041 2052
2042 linked_ptr<EventResponseDelta> d1( 2053 linked_ptr<EventResponseDelta> d1(
2043 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); 2054 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000)));
2044 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2")); 2055 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2"));
2045 deltas.push_back(d1); 2056 deltas.push_back(d1);
2046 scoped_refptr<net::HttpResponseHeaders> new_headers1; 2057 scoped_refptr<net::HttpResponseHeaders> new_headers1;
2058 GURL allowed_unsafe_redirect_url1;
2047 MergeOnHeadersReceivedResponses( 2059 MergeOnHeadersReceivedResponses(
2048 deltas, base_headers.get(), &new_headers1, &warning_set, &net_log); 2060 deltas, base_headers.get(), &new_headers1, &allowed_unsafe_redirect_url1,
2061 &warning_set, &net_log);
2049 ASSERT_TRUE(new_headers1.get()); 2062 ASSERT_TRUE(new_headers1.get());
2063 EXPECT_TRUE(allowed_unsafe_redirect_url1.is_empty());
2050 std::multimap<std::string, std::string> expected1; 2064 std::multimap<std::string, std::string> expected1;
2051 expected1.insert(std::pair<std::string, std::string>("Key1", "Value1")); 2065 expected1.insert(std::pair<std::string, std::string>("Key1", "Value1"));
2052 expected1.insert(std::pair<std::string, std::string>("Key1", "Value3")); 2066 expected1.insert(std::pair<std::string, std::string>("Key1", "Value3"));
2053 expected1.insert(std::pair<std::string, std::string>("Key2", "Value4")); 2067 expected1.insert(std::pair<std::string, std::string>("Key2", "Value4"));
2054 void* iter = NULL; 2068 void* iter = NULL;
2055 std::string name; 2069 std::string name;
2056 std::string value; 2070 std::string value;
2057 std::multimap<std::string, std::string> actual1; 2071 std::multimap<std::string, std::string> actual1;
2058 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { 2072 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) {
2059 actual1.insert(std::pair<std::string, std::string>(name, value)); 2073 actual1.insert(std::pair<std::string, std::string>(name, value));
2060 } 2074 }
2061 EXPECT_EQ(expected1, actual1); 2075 EXPECT_EQ(expected1, actual1);
2062 EXPECT_EQ(0u, warning_set.size()); 2076 EXPECT_EQ(0u, warning_set.size());
2063 EXPECT_EQ(1u, capturing_net_log.GetSize()); 2077 EXPECT_EQ(1u, capturing_net_log.GetSize());
2064 } 2078 }
2065 2079
2080 // Tests whether onHeadersReceived can initiate a redirect.
2081 // The URL merge logic is shared with onBeforeRequest, so we only need to test
2082 // whether the URLs are merged at all.
2083 TEST(ExtensionWebRequestHelpersTest,
2084 TestMergeOnHeadersReceivedResponsesRedirect) {
2085 EventResponseDeltas deltas;
2086 net::CapturingBoundNetLog capturing_net_log;
2087 net::BoundNetLog net_log = capturing_net_log.bound();
2088 ExtensionWarningSet warning_set;
2089
2090 char base_headers_string[] =
2091 "HTTP/1.0 200 OK\r\n"
2092 "\r\n";
2093 scoped_refptr<net::HttpResponseHeaders> base_headers(
2094 new net::HttpResponseHeaders(
2095 net::HttpUtil::AssembleRawHeaders(
2096 base_headers_string, sizeof(base_headers_string))));
2097
2098 // No redirect
2099 linked_ptr<EventResponseDelta> d0(
2100 new EventResponseDelta("extid0", base::Time::FromInternalValue(0)));
2101 deltas.push_back(d0);
2102 scoped_refptr<net::HttpResponseHeaders> new_headers0;
2103 GURL allowed_unsafe_redirect_url0;
2104 MergeOnHeadersReceivedResponses(
2105 deltas, base_headers.get(), &new_headers0, &allowed_unsafe_redirect_url0,
2106 &warning_set, &net_log);
2107 EXPECT_FALSE(new_headers0.get());
2108 EXPECT_TRUE(allowed_unsafe_redirect_url0.is_empty());
2109 EXPECT_EQ(0u, warning_set.size());
2110 EXPECT_EQ(0u, capturing_net_log.GetSize());
2111
2112 // Single redirect.
2113 GURL new_url_1("http://foo.com");
2114 linked_ptr<EventResponseDelta> d1(
2115 new EventResponseDelta("extid1", base::Time::FromInternalValue(1000)));
2116 d1->new_url = GURL(new_url_1);
2117 deltas.push_back(d1);
2118 deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
2119 capturing_net_log.Clear();
2120 scoped_refptr<net::HttpResponseHeaders> new_headers1;
2121 GURL allowed_unsafe_redirect_url1;
2122 MergeOnHeadersReceivedResponses(
2123 deltas, base_headers.get(), &new_headers1, &allowed_unsafe_redirect_url1,
2124 &warning_set, &net_log);
2125
2126 EXPECT_TRUE(new_headers1.get());
2127 EXPECT_TRUE(new_headers1->HasHeaderValue("Location", new_url_1.spec()));
2128 EXPECT_EQ(new_url_1, allowed_unsafe_redirect_url1);
2129 EXPECT_TRUE(warning_set.empty());
2130 EXPECT_EQ(1u, capturing_net_log.GetSize());
2131 }
2132
2066 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) { 2133 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) {
2067 net::CapturingBoundNetLog capturing_net_log; 2134 net::CapturingBoundNetLog capturing_net_log;
2068 net::BoundNetLog net_log = capturing_net_log.bound(); 2135 net::BoundNetLog net_log = capturing_net_log.bound();
2069 ExtensionWarningSet warning_set; 2136 ExtensionWarningSet warning_set;
2070 EventResponseDeltas deltas; 2137 EventResponseDeltas deltas;
2071 base::string16 username = base::ASCIIToUTF16("foo"); 2138 base::string16 username = base::ASCIIToUTF16("foo");
2072 base::string16 password = base::ASCIIToUTF16("bar"); 2139 base::string16 password = base::ASCIIToUTF16("bar");
2073 base::string16 password2 = base::ASCIIToUTF16("baz"); 2140 base::string16 password2 = base::ASCIIToUTF16("baz");
2074 2141
2075 // Check that we can handle if not returning credentials. 2142 // Check that we can handle if not returning credentials.
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
2136 EXPECT_TRUE(credentials_set); 2203 EXPECT_TRUE(credentials_set);
2137 EXPECT_FALSE(auth3.Empty()); 2204 EXPECT_FALSE(auth3.Empty());
2138 EXPECT_EQ(username, auth1.username()); 2205 EXPECT_EQ(username, auth1.username());
2139 EXPECT_EQ(password, auth1.password()); 2206 EXPECT_EQ(password, auth1.password());
2140 EXPECT_EQ(1u, warning_set.size()); 2207 EXPECT_EQ(1u, warning_set.size());
2141 EXPECT_TRUE(HasWarning(warning_set, "extid2")); 2208 EXPECT_TRUE(HasWarning(warning_set, "extid2"));
2142 EXPECT_EQ(3u, capturing_net_log.GetSize()); 2209 EXPECT_EQ(3u, capturing_net_log.GetSize());
2143 } 2210 }
2144 2211
2145 } // namespace extensions 2212 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698