| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <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 Loading... |
| 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 646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1937 EXPECT_EQ(0u, warning_set.size()); | 1939 EXPECT_EQ(0u, warning_set.size()); |
| 1938 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1940 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1939 } | 1941 } |
| 1940 | 1942 |
| 1941 TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) { | 1943 TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) { |
| 1942 net::CapturingBoundNetLog capturing_net_log; | 1944 net::CapturingBoundNetLog capturing_net_log; |
| 1943 net::BoundNetLog net_log = capturing_net_log.bound(); | 1945 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 1944 ExtensionWarningSet warning_set; | 1946 ExtensionWarningSet warning_set; |
| 1945 std::string header_value; | 1947 std::string header_value; |
| 1946 EventResponseDeltas deltas; | 1948 EventResponseDeltas deltas; |
| 1949 GURL effective_new_url; |
| 1947 | 1950 |
| 1948 char base_headers_string[] = | 1951 char base_headers_string[] = |
| 1949 "HTTP/1.0 200 OK\r\n" | 1952 "HTTP/1.0 200 OK\r\n" |
| 1950 "Key1: Value1\r\n" | 1953 "Key1: Value1\r\n" |
| 1951 "Key2: Value2, Foo\r\n" | 1954 "Key2: Value2, Foo\r\n" |
| 1952 "\r\n"; | 1955 "\r\n"; |
| 1953 scoped_refptr<net::HttpResponseHeaders> base_headers( | 1956 scoped_refptr<net::HttpResponseHeaders> base_headers( |
| 1954 new net::HttpResponseHeaders( | 1957 new net::HttpResponseHeaders( |
| 1955 net::HttpUtil::AssembleRawHeaders( | 1958 net::HttpUtil::AssembleRawHeaders( |
| 1956 base_headers_string, sizeof(base_headers_string)))); | 1959 base_headers_string, sizeof(base_headers_string)))); |
| 1957 | 1960 |
| 1958 // Check that we can handle if not touching the response headers. | 1961 // Check that we can handle if not touching the response headers. |
| 1959 linked_ptr<EventResponseDelta> d0( | 1962 linked_ptr<EventResponseDelta> d0( |
| 1960 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); | 1963 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); |
| 1961 deltas.push_back(d0); | 1964 deltas.push_back(d0); |
| 1962 scoped_refptr<net::HttpResponseHeaders> new_headers0; | 1965 scoped_refptr<net::HttpResponseHeaders> new_headers0; |
| 1963 MergeOnHeadersReceivedResponses(deltas, base_headers.get(), &new_headers0, | 1966 MergeOnHeadersReceivedResponses( |
| 1964 &warning_set, &net_log); | 1967 deltas, &effective_new_url, base_headers.get(), &new_headers0, |
| 1968 &warning_set, &net_log); |
| 1965 EXPECT_FALSE(new_headers0.get()); | 1969 EXPECT_FALSE(new_headers0.get()); |
| 1966 EXPECT_EQ(0u, warning_set.size()); | 1970 EXPECT_EQ(0u, warning_set.size()); |
| 1967 EXPECT_EQ(0u, capturing_net_log.GetSize()); | 1971 EXPECT_EQ(0u, capturing_net_log.GetSize()); |
| 1968 | 1972 |
| 1969 linked_ptr<EventResponseDelta> d1( | 1973 linked_ptr<EventResponseDelta> d1( |
| 1970 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 1974 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 1971 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1")); | 1975 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1")); |
| 1972 d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2, Foo")); | 1976 d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2, Foo")); |
| 1973 d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3")); | 1977 d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3")); |
| 1974 deltas.push_back(d1); | 1978 deltas.push_back(d1); |
| 1975 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1979 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1976 warning_set.clear(); | 1980 warning_set.clear(); |
| 1977 capturing_net_log.Clear(); | 1981 capturing_net_log.Clear(); |
| 1978 scoped_refptr<net::HttpResponseHeaders> new_headers1; | 1982 scoped_refptr<net::HttpResponseHeaders> new_headers1; |
| 1979 MergeOnHeadersReceivedResponses( | 1983 MergeOnHeadersReceivedResponses( |
| 1980 deltas, base_headers.get(), &new_headers1, &warning_set, &net_log); | 1984 deltas, &effective_new_url, base_headers.get(), &new_headers1, |
| 1985 &warning_set, &net_log); |
| 1981 ASSERT_TRUE(new_headers1.get()); | 1986 ASSERT_TRUE(new_headers1.get()); |
| 1982 std::multimap<std::string, std::string> expected1; | 1987 std::multimap<std::string, std::string> expected1; |
| 1983 expected1.insert(std::pair<std::string, std::string>("Key2", "Value3")); | 1988 expected1.insert(std::pair<std::string, std::string>("Key2", "Value3")); |
| 1984 void* iter = NULL; | 1989 void* iter = NULL; |
| 1985 std::string name; | 1990 std::string name; |
| 1986 std::string value; | 1991 std::string value; |
| 1987 std::multimap<std::string, std::string> actual1; | 1992 std::multimap<std::string, std::string> actual1; |
| 1988 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { | 1993 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { |
| 1989 actual1.insert(std::pair<std::string, std::string>(name, value)); | 1994 actual1.insert(std::pair<std::string, std::string>(name, value)); |
| 1990 } | 1995 } |
| 1991 EXPECT_EQ(expected1, actual1); | 1996 EXPECT_EQ(expected1, actual1); |
| 1992 EXPECT_EQ(0u, warning_set.size()); | 1997 EXPECT_EQ(0u, warning_set.size()); |
| 1993 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 1998 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 1994 | 1999 |
| 1995 // Check that we replace response headers only once. | 2000 // Check that we replace response headers only once. |
| 1996 linked_ptr<EventResponseDelta> d2( | 2001 linked_ptr<EventResponseDelta> d2( |
| 1997 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); | 2002 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); |
| 1998 // Note that we use a different capitalization of KeY2. This should not | 2003 // Note that we use a different capitalization of KeY2. This should not |
| 1999 // matter. | 2004 // matter. |
| 2000 d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2, Foo")); | 2005 d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2, Foo")); |
| 2001 d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4")); | 2006 d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4")); |
| 2002 deltas.push_back(d2); | 2007 deltas.push_back(d2); |
| 2003 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 2008 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 2004 warning_set.clear(); | 2009 warning_set.clear(); |
| 2005 capturing_net_log.Clear(); | 2010 capturing_net_log.Clear(); |
| 2006 scoped_refptr<net::HttpResponseHeaders> new_headers2; | 2011 scoped_refptr<net::HttpResponseHeaders> new_headers2; |
| 2007 MergeOnHeadersReceivedResponses( | 2012 MergeOnHeadersReceivedResponses( |
| 2008 deltas, base_headers.get(), &new_headers2, &warning_set, &net_log); | 2013 deltas, &effective_new_url, base_headers.get(), &new_headers2, |
| 2014 &warning_set, &net_log); |
| 2009 ASSERT_TRUE(new_headers2.get()); | 2015 ASSERT_TRUE(new_headers2.get()); |
| 2010 iter = NULL; | 2016 iter = NULL; |
| 2011 std::multimap<std::string, std::string> actual2; | 2017 std::multimap<std::string, std::string> actual2; |
| 2012 while (new_headers2->EnumerateHeaderLines(&iter, &name, &value)) { | 2018 while (new_headers2->EnumerateHeaderLines(&iter, &name, &value)) { |
| 2013 actual2.insert(std::pair<std::string, std::string>(name, value)); | 2019 actual2.insert(std::pair<std::string, std::string>(name, value)); |
| 2014 } | 2020 } |
| 2015 EXPECT_EQ(expected1, actual2); | 2021 EXPECT_EQ(expected1, actual2); |
| 2016 EXPECT_EQ(1u, warning_set.size()); | 2022 EXPECT_EQ(1u, warning_set.size()); |
| 2017 EXPECT_TRUE(HasWarning(warning_set, "extid2")); | 2023 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 2018 EXPECT_EQ(2u, capturing_net_log.GetSize()); | 2024 EXPECT_EQ(2u, capturing_net_log.GetSize()); |
| 2019 } | 2025 } |
| 2020 | 2026 |
| 2021 // Check that we do not delete too much | 2027 // Check that we do not delete too much |
| 2022 TEST(ExtensionWebRequestHelpersTest, | 2028 TEST(ExtensionWebRequestHelpersTest, |
| 2023 TestMergeOnHeadersReceivedResponsesDeletion) { | 2029 TestMergeOnHeadersReceivedResponsesDeletion) { |
| 2024 net::CapturingBoundNetLog capturing_net_log; | 2030 net::CapturingBoundNetLog capturing_net_log; |
| 2025 net::BoundNetLog net_log = capturing_net_log.bound(); | 2031 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 2026 ExtensionWarningSet warning_set; | 2032 ExtensionWarningSet warning_set; |
| 2027 std::string header_value; | 2033 std::string header_value; |
| 2028 EventResponseDeltas deltas; | 2034 EventResponseDeltas deltas; |
| 2035 GURL effective_new_url; |
| 2029 | 2036 |
| 2030 char base_headers_string[] = | 2037 char base_headers_string[] = |
| 2031 "HTTP/1.0 200 OK\r\n" | 2038 "HTTP/1.0 200 OK\r\n" |
| 2032 "Key1: Value1\r\n" | 2039 "Key1: Value1\r\n" |
| 2033 "Key1: Value2\r\n" | 2040 "Key1: Value2\r\n" |
| 2034 "Key1: Value3\r\n" | 2041 "Key1: Value3\r\n" |
| 2035 "Key2: Value4\r\n" | 2042 "Key2: Value4\r\n" |
| 2036 "\r\n"; | 2043 "\r\n"; |
| 2037 scoped_refptr<net::HttpResponseHeaders> base_headers( | 2044 scoped_refptr<net::HttpResponseHeaders> base_headers( |
| 2038 new net::HttpResponseHeaders( | 2045 new net::HttpResponseHeaders( |
| 2039 net::HttpUtil::AssembleRawHeaders( | 2046 net::HttpUtil::AssembleRawHeaders( |
| 2040 base_headers_string, sizeof(base_headers_string)))); | 2047 base_headers_string, sizeof(base_headers_string)))); |
| 2041 | 2048 |
| 2042 linked_ptr<EventResponseDelta> d1( | 2049 linked_ptr<EventResponseDelta> d1( |
| 2043 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 2050 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 2044 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2")); | 2051 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2")); |
| 2045 deltas.push_back(d1); | 2052 deltas.push_back(d1); |
| 2046 scoped_refptr<net::HttpResponseHeaders> new_headers1; | 2053 scoped_refptr<net::HttpResponseHeaders> new_headers1; |
| 2047 MergeOnHeadersReceivedResponses( | 2054 MergeOnHeadersReceivedResponses( |
| 2048 deltas, base_headers.get(), &new_headers1, &warning_set, &net_log); | 2055 deltas, &effective_new_url, base_headers.get(), &new_headers1, |
| 2056 &warning_set, &net_log); |
| 2049 ASSERT_TRUE(new_headers1.get()); | 2057 ASSERT_TRUE(new_headers1.get()); |
| 2050 std::multimap<std::string, std::string> expected1; | 2058 std::multimap<std::string, std::string> expected1; |
| 2051 expected1.insert(std::pair<std::string, std::string>("Key1", "Value1")); | 2059 expected1.insert(std::pair<std::string, std::string>("Key1", "Value1")); |
| 2052 expected1.insert(std::pair<std::string, std::string>("Key1", "Value3")); | 2060 expected1.insert(std::pair<std::string, std::string>("Key1", "Value3")); |
| 2053 expected1.insert(std::pair<std::string, std::string>("Key2", "Value4")); | 2061 expected1.insert(std::pair<std::string, std::string>("Key2", "Value4")); |
| 2054 void* iter = NULL; | 2062 void* iter = NULL; |
| 2055 std::string name; | 2063 std::string name; |
| 2056 std::string value; | 2064 std::string value; |
| 2057 std::multimap<std::string, std::string> actual1; | 2065 std::multimap<std::string, std::string> actual1; |
| 2058 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { | 2066 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { |
| 2059 actual1.insert(std::pair<std::string, std::string>(name, value)); | 2067 actual1.insert(std::pair<std::string, std::string>(name, value)); |
| 2060 } | 2068 } |
| 2061 EXPECT_EQ(expected1, actual1); | 2069 EXPECT_EQ(expected1, actual1); |
| 2062 EXPECT_EQ(0u, warning_set.size()); | 2070 EXPECT_EQ(0u, warning_set.size()); |
| 2063 EXPECT_EQ(1u, capturing_net_log.GetSize()); | 2071 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 2064 } | 2072 } |
| 2065 | 2073 |
| 2074 // Tests whether onHeadersReceived can initiate a redirect. |
| 2075 // The URL merge logic is shared with onBeforeRequest, so we only need to test |
| 2076 // whether the URLs are merged at all. |
| 2077 TEST(ExtensionWebRequestHelpersTest, |
| 2078 TestMergeOnHeadersReceivedResponsesRedirect) { |
| 2079 EventResponseDeltas deltas; |
| 2080 net::CapturingBoundNetLog capturing_net_log; |
| 2081 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 2082 ExtensionWarningSet warning_set; |
| 2083 GURL effective_new_url; |
| 2084 |
| 2085 // No redirect |
| 2086 linked_ptr<EventResponseDelta> d0( |
| 2087 new EventResponseDelta("extid0", base::Time::FromInternalValue(0))); |
| 2088 deltas.push_back(d0); |
| 2089 MergeOnBeforeRequestResponses( |
| 2090 deltas, &effective_new_url, &warning_set, &net_log); |
| 2091 EXPECT_TRUE(effective_new_url.is_empty()); |
| 2092 |
| 2093 // Single redirect. |
| 2094 GURL new_url_1("http://foo.com"); |
| 2095 linked_ptr<EventResponseDelta> d1( |
| 2096 new EventResponseDelta("extid1", base::Time::FromInternalValue(1000))); |
| 2097 d1->new_url = GURL(new_url_1); |
| 2098 deltas.push_back(d1); |
| 2099 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 2100 capturing_net_log.Clear(); |
| 2101 MergeOnBeforeRequestResponses( |
| 2102 deltas, &effective_new_url, &warning_set, &net_log); |
| 2103 EXPECT_EQ(new_url_1, effective_new_url); |
| 2104 EXPECT_TRUE(warning_set.empty()); |
| 2105 EXPECT_EQ(1u, capturing_net_log.GetSize()); |
| 2106 } |
| 2107 |
| 2066 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) { | 2108 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) { |
| 2067 net::CapturingBoundNetLog capturing_net_log; | 2109 net::CapturingBoundNetLog capturing_net_log; |
| 2068 net::BoundNetLog net_log = capturing_net_log.bound(); | 2110 net::BoundNetLog net_log = capturing_net_log.bound(); |
| 2069 ExtensionWarningSet warning_set; | 2111 ExtensionWarningSet warning_set; |
| 2070 EventResponseDeltas deltas; | 2112 EventResponseDeltas deltas; |
| 2071 base::string16 username = base::ASCIIToUTF16("foo"); | 2113 base::string16 username = base::ASCIIToUTF16("foo"); |
| 2072 base::string16 password = base::ASCIIToUTF16("bar"); | 2114 base::string16 password = base::ASCIIToUTF16("bar"); |
| 2073 base::string16 password2 = base::ASCIIToUTF16("baz"); | 2115 base::string16 password2 = base::ASCIIToUTF16("baz"); |
| 2074 | 2116 |
| 2075 // Check that we can handle if not returning credentials. | 2117 // Check that we can handle if not returning credentials. |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2136 EXPECT_TRUE(credentials_set); | 2178 EXPECT_TRUE(credentials_set); |
| 2137 EXPECT_FALSE(auth3.Empty()); | 2179 EXPECT_FALSE(auth3.Empty()); |
| 2138 EXPECT_EQ(username, auth1.username()); | 2180 EXPECT_EQ(username, auth1.username()); |
| 2139 EXPECT_EQ(password, auth1.password()); | 2181 EXPECT_EQ(password, auth1.password()); |
| 2140 EXPECT_EQ(1u, warning_set.size()); | 2182 EXPECT_EQ(1u, warning_set.size()); |
| 2141 EXPECT_TRUE(HasWarning(warning_set, "extid2")); | 2183 EXPECT_TRUE(HasWarning(warning_set, "extid2")); |
| 2142 EXPECT_EQ(3u, capturing_net_log.GetSize()); | 2184 EXPECT_EQ(3u, capturing_net_log.GetSize()); |
| 2143 } | 2185 } |
| 2144 | 2186 |
| 2145 } // namespace extensions | 2187 } // namespace extensions |
| OLD | NEW |