Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <queue> | 5 #include <queue> |
| 6 #include <map> | |
| 6 | 7 |
| 7 #include "base/bind.h" | 8 #include "base/bind.h" |
| 8 #include "base/callback.h" | 9 #include "base/callback.h" |
| 9 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| 10 #include "base/json/json_value_serializer.h" | 11 #include "base/json/json_value_serializer.h" |
| 11 #include "base/path_service.h" | 12 #include "base/path_service.h" |
| 12 #include "base/stl_util.h" | 13 #include "base/stl_util.h" |
| 13 #include "base/utf_string_conversions.h" | 14 #include "base/utf_string_conversions.h" |
| 14 #include "chrome/browser/extensions/extension_event_router_forwarder.h" | 15 #include "chrome/browser/extensions/extension_event_router_forwarder.h" |
| 15 #include "chrome/browser/extensions/extension_webrequest_api.h" | 16 #include "chrome/browser/extensions/extension_webrequest_api.h" |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 35 void* profile, | 36 void* profile, |
| 36 const std::string& extension_id, | 37 const std::string& extension_id, |
| 37 const std::string& event_name, | 38 const std::string& event_name, |
| 38 const std::string& sub_event_name, | 39 const std::string& sub_event_name, |
| 39 uint64 request_id, | 40 uint64 request_id, |
| 40 ExtensionWebRequestEventRouter::EventResponse* response) { | 41 ExtensionWebRequestEventRouter::EventResponse* response) { |
| 41 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( | 42 ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled( |
| 42 profile, extension_id, event_name, sub_event_name, request_id, | 43 profile, extension_id, event_name, sub_event_name, request_id, |
| 43 response); | 44 response); |
| 44 } | 45 } |
| 46 | |
| 47 // Searches |key| in |collection| by iterating over its elements and returns | |
| 48 // true if found. | |
| 49 template <typename Collection, typename Key> | |
| 50 bool SearchKey(const Collection& collection, const Key& key) { | |
|
Matt Perry
2011/11/11 22:05:08
rename to Contains?
battre
2011/11/17 12:01:04
I have renamed it to "Contains". Note that we alre
Matt Perry
2011/11/17 20:04:09
I think this 1-off is fine.
| |
| 51 return std::find(collection.begin(), collection.end(), key) != | |
| 52 collection.end(); | |
| 53 } | |
| 54 | |
| 45 } // namespace | 55 } // namespace |
| 46 | 56 |
| 47 // A mock event router that responds to events with a pre-arranged queue of | 57 // A mock event router that responds to events with a pre-arranged queue of |
| 48 // Tasks. | 58 // Tasks. |
| 49 class TestIPCSender : public IPC::Message::Sender { | 59 class TestIPCSender : public IPC::Message::Sender { |
| 50 public: | 60 public: |
| 51 typedef std::list<linked_ptr<IPC::Message> > SentMessages; | 61 typedef std::list<linked_ptr<IPC::Message> > SentMessages; |
| 52 | 62 |
| 53 // Adds a Task to the queue. We will fire these in order as events are | 63 // Adds a Task to the queue. We will fire these in order as events are |
| 54 // dispatched. | 64 // dispatched. |
| (...skipping 759 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 814 ASSERT_TRUE(delta_modified2.get()); | 824 ASSERT_TRUE(delta_modified2.get()); |
| 815 EXPECT_TRUE(delta_modified2->deleted_request_headers.empty()); | 825 EXPECT_TRUE(delta_modified2->deleted_request_headers.empty()); |
| 816 ASSERT_TRUE( | 826 ASSERT_TRUE( |
| 817 delta_modified2->modified_request_headers.GetHeader("key2", &value)); | 827 delta_modified2->modified_request_headers.GetHeader("key2", &value)); |
| 818 EXPECT_EQ("value3", value); | 828 EXPECT_EQ("value3", value); |
| 819 } | 829 } |
| 820 | 830 |
| 821 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnHeadersReceivedDelta) { | 831 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnHeadersReceivedDelta) { |
| 822 using namespace extension_webrequest_api_helpers; | 832 using namespace extension_webrequest_api_helpers; |
| 823 const bool cancel = true; | 833 const bool cancel = true; |
| 824 const char status_line[] = "HTTP/1.0 200 OK"; | 834 char base_headers_string[] = |
| 825 const char response_headers_string[] = "key1: value1\n" | 835 "HTTP/1.0 200 OK\r\n" |
| 826 "key2: value2\n\n"; | 836 "Key1: Value1\r\n" |
| 837 "Key2: Value2\r\n" | |
| 838 "Key3: Value3\r\n" | |
| 839 "\r\n"; | |
| 840 scoped_refptr<net::HttpResponseHeaders> base_headers( | |
| 841 new net::HttpResponseHeaders( | |
| 842 net::HttpUtil::AssembleRawHeaders( | |
| 843 base_headers_string, sizeof(base_headers_string)))); | |
| 844 | |
| 845 ResponseHeaders new_headers; | |
| 846 new_headers.push_back(ResponseHeader("kEy1", "Value1")); // Unchanged | |
| 847 new_headers.push_back(ResponseHeader("Key2", "Value1")); // Modified | |
| 848 // Key3 is deleted | |
| 849 new_headers.push_back(ResponseHeader("Key4", "Value4")); // Added | |
| 827 | 850 |
| 828 scoped_ptr<EventResponseDelta> delta( | 851 scoped_ptr<EventResponseDelta> delta( |
| 829 CalculateOnHeadersReceivedDelta("extid", base::Time::Now(), cancel, | 852 CalculateOnHeadersReceivedDelta("extid", base::Time::Now(), cancel, |
| 830 status_line, response_headers_string)); | 853 base_headers, &new_headers)); |
| 831 ASSERT_TRUE(delta.get()); | 854 ASSERT_TRUE(delta.get()); |
| 832 EXPECT_TRUE(delta->cancel); | 855 EXPECT_TRUE(delta->cancel); |
| 833 ASSERT_TRUE(delta->new_response_headers.get()); | 856 EXPECT_EQ(2u, delta->added_response_headers.size()); |
| 834 EXPECT_TRUE(delta->new_response_headers->HasHeader("key1")); | 857 EXPECT_TRUE(SearchKey(delta->added_response_headers, |
| 835 EXPECT_TRUE(delta->new_response_headers->HasHeader("key2")); | 858 ResponseHeader("Key2", "Value1"))); |
| 836 EXPECT_EQ(status_line, delta->new_response_headers->GetStatusLine()); | 859 EXPECT_TRUE(SearchKey(delta->added_response_headers, |
| 837 // net::HttpResponseHeaders does not have easy access to header values. | 860 ResponseHeader("Key4", "Value4"))); |
| 838 // Let's be lazy and not test it here. | 861 EXPECT_EQ(2u, delta->deleted_response_headers.size()); |
| 862 EXPECT_TRUE(SearchKey(delta->deleted_response_headers, | |
| 863 ResponseHeader("Key2", "Value2"))); | |
| 864 EXPECT_TRUE(SearchKey(delta->deleted_response_headers, | |
| 865 ResponseHeader("Key3", "Value3"))); | |
| 839 } | 866 } |
| 840 | 867 |
| 841 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnAuthRequiredDelta) { | 868 TEST(ExtensionWebRequestHelpersTest, TestCalculateOnAuthRequiredDelta) { |
| 842 using namespace extension_webrequest_api_helpers; | 869 using namespace extension_webrequest_api_helpers; |
| 843 const bool cancel = true; | 870 const bool cancel = true; |
| 844 | 871 |
| 845 string16 username = ASCIIToUTF16("foo"); | 872 string16 username = ASCIIToUTF16("foo"); |
| 846 string16 password = ASCIIToUTF16("bar"); | 873 string16 password = ASCIIToUTF16("bar"); |
| 847 scoped_ptr<net::AuthCredentials> credentials( | 874 scoped_ptr<net::AuthCredentials> credentials( |
| 848 new net::AuthCredentials(username, password)); | 875 new net::AuthCredentials(username, password)); |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1053 EXPECT_EQ("value 3", header_value); | 1080 EXPECT_EQ("value 3", header_value); |
| 1054 ASSERT_TRUE(headers3.GetHeader("key5", &header_value)); | 1081 ASSERT_TRUE(headers3.GetHeader("key5", &header_value)); |
| 1055 EXPECT_EQ("value 5", header_value); | 1082 EXPECT_EQ("value 5", header_value); |
| 1056 EXPECT_EQ(1u, conflicting_extensions.size()); | 1083 EXPECT_EQ(1u, conflicting_extensions.size()); |
| 1057 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1084 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); |
| 1058 EXPECT_EQ(3u, event_log.size()); | 1085 EXPECT_EQ(3u, event_log.size()); |
| 1059 } | 1086 } |
| 1060 | 1087 |
| 1061 TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) { | 1088 TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) { |
| 1062 using namespace extension_webrequest_api_helpers; | 1089 using namespace extension_webrequest_api_helpers; |
| 1063 EventLogEntries event_log; | 1090 EventLogEntries event_log; |
| 1064 std::set<std::string> conflicting_extensions; | 1091 std::set<std::string> conflicting_extensions; |
| 1065 std::string header_value; | 1092 std::string header_value; |
| 1066 EventResponseDeltas deltas; | 1093 EventResponseDeltas deltas; |
| 1094 | |
| 1095 char base_headers_string[] = | |
| 1096 "HTTP/1.0 200 OK\r\n" | |
| 1097 "Key1: Value1\r\n" | |
| 1098 "Key2: Value2\r\n" | |
| 1099 "\r\n"; | |
| 1100 scoped_refptr<net::HttpResponseHeaders> base_headers( | |
| 1101 new net::HttpResponseHeaders( | |
| 1102 net::HttpUtil::AssembleRawHeaders( | |
| 1103 base_headers_string, sizeof(base_headers_string)))); | |
| 1067 | 1104 |
| 1068 // Check that we can handle if not touching the response headers. | 1105 // Check that we can handle if not touching the response headers. |
| 1069 linked_ptr<EventResponseDelta> d0( | 1106 linked_ptr<EventResponseDelta> d0( |
| 1070 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); | 1107 new EventResponseDelta("extid0", base::Time::FromInternalValue(3000))); |
| 1071 deltas.push_back(d0); | 1108 deltas.push_back(d0); |
| 1072 scoped_refptr<net::HttpResponseHeaders> new_headers0; | 1109 scoped_refptr<net::HttpResponseHeaders> new_headers0; |
| 1073 MergeOnHeadersReceivedResponses( | 1110 MergeOnHeadersReceivedResponses( |
| 1074 deltas, &new_headers0, &conflicting_extensions, &event_log); | 1111 deltas, base_headers.get(), &new_headers0, &conflicting_extensions, |
| 1112 &event_log); | |
| 1075 EXPECT_FALSE(new_headers0.get()); | 1113 EXPECT_FALSE(new_headers0.get()); |
| 1076 EXPECT_EQ(0u, conflicting_extensions.size()); | 1114 EXPECT_EQ(0u, conflicting_extensions.size()); |
| 1077 EXPECT_EQ(0u, event_log.size()); | 1115 EXPECT_EQ(0u, event_log.size()); |
| 1078 | 1116 |
| 1079 // Check that we can replace response headers. | |
| 1080 char headers1_string[] = | |
| 1081 "HTTP/1.0 200 OK\r\n" | |
| 1082 "Foo: bar\r\n" | |
| 1083 "\r\n"; | |
| 1084 scoped_refptr<net::HttpResponseHeaders> headers1( | |
| 1085 new net::HttpResponseHeaders( | |
| 1086 net::HttpUtil::AssembleRawHeaders( | |
| 1087 headers1_string, sizeof(headers1_string)))); | |
| 1088 linked_ptr<EventResponseDelta> d1( | 1117 linked_ptr<EventResponseDelta> d1( |
| 1089 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | 1118 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); |
| 1090 d1->new_response_headers = headers1; | 1119 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value1")); |
| 1120 d1->deleted_response_headers.push_back(ResponseHeader("KEY2", "Value2")); | |
| 1121 d1->added_response_headers.push_back(ResponseHeader("Key2", "Value3")); | |
| 1091 deltas.push_back(d1); | 1122 deltas.push_back(d1); |
| 1092 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1123 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1093 scoped_refptr<net::HttpResponseHeaders> new_headers1; | |
| 1094 conflicting_extensions.clear(); | 1124 conflicting_extensions.clear(); |
| 1095 event_log.clear(); | 1125 event_log.clear(); |
| 1126 scoped_refptr<net::HttpResponseHeaders> new_headers1; | |
| 1096 MergeOnHeadersReceivedResponses( | 1127 MergeOnHeadersReceivedResponses( |
| 1097 deltas, &new_headers1, &conflicting_extensions, &event_log); | 1128 deltas, base_headers.get(), &new_headers1, &conflicting_extensions, |
| 1098 EXPECT_EQ(headers1.get(), new_headers1.get()); | 1129 &event_log); |
| 1130 ASSERT_TRUE(new_headers1.get()); | |
| 1131 std::multimap<std::string, std::string> expected1; | |
| 1132 expected1.insert(std::pair<std::string, std::string>("Key2", "Value3")); | |
| 1133 void* iter = NULL; | |
| 1134 std::string name; | |
| 1135 std::string value; | |
| 1136 std::multimap<std::string, std::string> actual1; | |
| 1137 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { | |
| 1138 actual1.insert(std::pair<std::string, std::string>(name, value)); | |
| 1139 } | |
| 1140 EXPECT_EQ(expected1, actual1); | |
| 1099 EXPECT_EQ(0u, conflicting_extensions.size()); | 1141 EXPECT_EQ(0u, conflicting_extensions.size()); |
| 1100 EXPECT_EQ(1u, event_log.size()); | 1142 EXPECT_EQ(1u, event_log.size()); |
| 1101 | 1143 |
| 1102 // Check that we replace response headers only once. | 1144 // Check that we replace response headers only once. |
| 1103 char headers2_string[] = | |
| 1104 "HTTP/1.0 200 OK\r\n" | |
| 1105 "Foo: baz\r\n" | |
| 1106 "\r\n"; | |
| 1107 scoped_refptr<net::HttpResponseHeaders> headers2( | |
| 1108 new net::HttpResponseHeaders( | |
| 1109 net::HttpUtil::AssembleRawHeaders( | |
| 1110 headers2_string, sizeof(headers2_string)))); | |
| 1111 linked_ptr<EventResponseDelta> d2( | 1145 linked_ptr<EventResponseDelta> d2( |
| 1112 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); | 1146 new EventResponseDelta("extid2", base::Time::FromInternalValue(1500))); |
| 1113 d2->new_response_headers = headers2; | 1147 // Note that we use a different capitalization of KeY2. This should not |
| 1148 // matter. | |
| 1149 d2->deleted_response_headers.push_back(ResponseHeader("KeY2", "Value2")); | |
| 1150 d2->added_response_headers.push_back(ResponseHeader("Key2", "Value4")); | |
| 1114 deltas.push_back(d2); | 1151 deltas.push_back(d2); |
| 1115 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); | 1152 deltas.sort(&InDecreasingExtensionInstallationTimeOrder); |
| 1116 scoped_refptr<net::HttpResponseHeaders> new_headers2; | |
| 1117 conflicting_extensions.clear(); | 1153 conflicting_extensions.clear(); |
| 1118 event_log.clear(); | 1154 event_log.clear(); |
| 1155 scoped_refptr<net::HttpResponseHeaders> new_headers2; | |
| 1119 MergeOnHeadersReceivedResponses( | 1156 MergeOnHeadersReceivedResponses( |
| 1120 deltas, &new_headers2, &conflicting_extensions, &event_log); | 1157 deltas, base_headers.get(), &new_headers2, &conflicting_extensions, |
| 1121 EXPECT_EQ(headers1.get(), new_headers1.get()); | 1158 &event_log); |
| 1159 ASSERT_TRUE(new_headers2.get()); | |
| 1160 iter = NULL; | |
| 1161 std::multimap<std::string, std::string> actual2; | |
| 1162 while (new_headers2->EnumerateHeaderLines(&iter, &name, &value)) { | |
| 1163 actual2.insert(std::pair<std::string, std::string>(name, value)); | |
| 1164 } | |
| 1165 EXPECT_EQ(expected1, actual2); | |
| 1122 EXPECT_EQ(1u, conflicting_extensions.size()); | 1166 EXPECT_EQ(1u, conflicting_extensions.size()); |
| 1123 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1167 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); |
| 1124 EXPECT_EQ(2u, event_log.size()); | 1168 EXPECT_EQ(2u, event_log.size()); |
| 1125 } | 1169 } |
| 1126 | 1170 |
| 1171 // Check that we do not delete too much | |
| 1172 TEST(ExtensionWebRequestHelpersTest, | |
| 1173 TestMergeOnHeadersReceivedResponsesDeletion) { | |
| 1174 using namespace extension_webrequest_api_helpers; | |
| 1175 EventLogEntries event_log; | |
| 1176 std::set<std::string> conflicting_extensions; | |
| 1177 std::string header_value; | |
| 1178 EventResponseDeltas deltas; | |
| 1179 | |
| 1180 char base_headers_string[] = | |
| 1181 "HTTP/1.0 200 OK\r\n" | |
| 1182 "Key1: Value1\r\n" | |
| 1183 "Key1: Value2\r\n" | |
| 1184 "Key1: Value3\r\n" | |
| 1185 "Key2: Value4\r\n" | |
| 1186 "\r\n"; | |
| 1187 scoped_refptr<net::HttpResponseHeaders> base_headers( | |
| 1188 new net::HttpResponseHeaders( | |
| 1189 net::HttpUtil::AssembleRawHeaders( | |
| 1190 base_headers_string, sizeof(base_headers_string)))); | |
| 1191 | |
| 1192 linked_ptr<EventResponseDelta> d1( | |
| 1193 new EventResponseDelta("extid1", base::Time::FromInternalValue(2000))); | |
| 1194 d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2")); | |
| 1195 deltas.push_back(d1); | |
| 1196 scoped_refptr<net::HttpResponseHeaders> new_headers1; | |
| 1197 MergeOnHeadersReceivedResponses( | |
| 1198 deltas, base_headers.get(), &new_headers1, &conflicting_extensions, | |
| 1199 &event_log); | |
| 1200 ASSERT_TRUE(new_headers1.get()); | |
| 1201 std::multimap<std::string, std::string> expected1; | |
| 1202 expected1.insert(std::pair<std::string, std::string>("Key1", "Value1")); | |
| 1203 expected1.insert(std::pair<std::string, std::string>("Key1", "Value3")); | |
| 1204 expected1.insert(std::pair<std::string, std::string>("Key2", "Value4")); | |
| 1205 void* iter = NULL; | |
| 1206 std::string name; | |
| 1207 std::string value; | |
| 1208 std::multimap<std::string, std::string> actual1; | |
| 1209 while (new_headers1->EnumerateHeaderLines(&iter, &name, &value)) { | |
| 1210 actual1.insert(std::pair<std::string, std::string>(name, value)); | |
| 1211 } | |
| 1212 EXPECT_EQ(expected1, actual1); | |
| 1213 EXPECT_EQ(0u, conflicting_extensions.size()); | |
| 1214 EXPECT_EQ(1u, event_log.size()); | |
| 1215 } | |
| 1216 | |
| 1127 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) { | 1217 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) { |
| 1128 using namespace extension_webrequest_api_helpers; | 1218 using namespace extension_webrequest_api_helpers; |
| 1129 EventLogEntries event_log; | 1219 EventLogEntries event_log; |
| 1130 std::set<std::string> conflicting_extensions; | 1220 std::set<std::string> conflicting_extensions; |
| 1131 EventResponseDeltas deltas; | 1221 EventResponseDeltas deltas; |
| 1132 string16 username = ASCIIToUTF16("foo"); | 1222 string16 username = ASCIIToUTF16("foo"); |
| 1133 string16 password = ASCIIToUTF16("bar"); | 1223 string16 password = ASCIIToUTF16("bar"); |
| 1134 string16 password2 = ASCIIToUTF16("baz"); | 1224 string16 password2 = ASCIIToUTF16("baz"); |
| 1135 | 1225 |
| 1136 // Check that we can handle if not returning credentials. | 1226 // Check that we can handle if not returning credentials. |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1195 credentials_set = MergeOnAuthRequiredResponses( | 1285 credentials_set = MergeOnAuthRequiredResponses( |
| 1196 deltas, &auth3, &conflicting_extensions, &event_log); | 1286 deltas, &auth3, &conflicting_extensions, &event_log); |
| 1197 EXPECT_TRUE(credentials_set); | 1287 EXPECT_TRUE(credentials_set); |
| 1198 EXPECT_FALSE(auth3.Empty()); | 1288 EXPECT_FALSE(auth3.Empty()); |
| 1199 EXPECT_EQ(username, auth1.username()); | 1289 EXPECT_EQ(username, auth1.username()); |
| 1200 EXPECT_EQ(password, auth1.password()); | 1290 EXPECT_EQ(password, auth1.password()); |
| 1201 EXPECT_EQ(1u, conflicting_extensions.size()); | 1291 EXPECT_EQ(1u, conflicting_extensions.size()); |
| 1202 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); | 1292 EXPECT_TRUE(ContainsKey(conflicting_extensions, "extid2")); |
| 1203 EXPECT_EQ(3u, event_log.size()); | 1293 EXPECT_EQ(3u, event_log.size()); |
| 1204 } | 1294 } |
| OLD | NEW |