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 "chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_
registry.h" | 5 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_
registry.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/json/json_reader.h" | 9 #include "base/json/json_reader.h" |
10 #include "base/memory/linked_ptr.h" | 10 #include "base/memory/linked_ptr.h" |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 scheme_http->Append(Value::CreateStringValue("https")); | 105 scheme_http->Append(Value::CreateStringValue("https")); |
106 DictionaryValue* https_condition_dict = new DictionaryValue(); | 106 DictionaryValue* https_condition_dict = new DictionaryValue(); |
107 https_condition_dict->Set(keys2::kSchemesKey, scheme_https); | 107 https_condition_dict->Set(keys2::kSchemesKey, scheme_https); |
108 https_condition_dict->SetString(keys2::kHostSuffixKey, "example.com"); | 108 https_condition_dict->SetString(keys2::kHostSuffixKey, "example.com"); |
109 https_condition_dict->SetString(keys2::kHostPrefixKey, "www"); | 109 https_condition_dict->SetString(keys2::kHostPrefixKey, "www"); |
110 DictionaryValue https_condition_url_filter; | 110 DictionaryValue https_condition_url_filter; |
111 https_condition_url_filter.Set(keys::kUrlKey, https_condition_dict); | 111 https_condition_url_filter.Set(keys::kUrlKey, https_condition_dict); |
112 https_condition_url_filter.SetString(keys::kInstanceTypeKey, | 112 https_condition_url_filter.SetString(keys::kInstanceTypeKey, |
113 keys::kRequestMatcherType); | 113 keys::kRequestMatcherType); |
114 | 114 |
115 linked_ptr<json_schema_compiler::any::Any> condition1( | |
116 new json_schema_compiler::any::Any); | |
117 condition1->Init(http_condition_url_filter); | |
118 | |
119 linked_ptr<json_schema_compiler::any::Any> condition2( | |
120 new json_schema_compiler::any::Any); | |
121 condition2->Init(https_condition_url_filter); | |
122 | |
123 DictionaryValue action_dict; | 115 DictionaryValue action_dict; |
124 action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType); | 116 action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType); |
125 | 117 |
126 linked_ptr<json_schema_compiler::any::Any> action1( | |
127 new json_schema_compiler::any::Any); | |
128 action1->Init(action_dict); | |
129 | |
130 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); | 118 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); |
131 rule->id.reset(new std::string(kRuleId1)); | 119 rule->id.reset(new std::string(kRuleId1)); |
132 rule->priority.reset(new int(100)); | 120 rule->priority.reset(new int(100)); |
133 rule->actions.push_back(action1); | 121 rule->actions.push_back(linked_ptr<base::Value>(action_dict.DeepCopy())); |
134 rule->conditions.push_back(condition1); | 122 rule->conditions.push_back( |
135 rule->conditions.push_back(condition2); | 123 linked_ptr<base::Value>(http_condition_url_filter.DeepCopy())); |
| 124 rule->conditions.push_back( |
| 125 linked_ptr<base::Value>(https_condition_url_filter.DeepCopy())); |
136 return rule; | 126 return rule; |
137 } | 127 } |
138 | 128 |
139 // Returns a rule that matches anything and cancels it. | 129 // Returns a rule that matches anything and cancels it. |
140 linked_ptr<RulesRegistry::Rule> CreateRule2() { | 130 linked_ptr<RulesRegistry::Rule> CreateRule2() { |
141 DictionaryValue condition_dict; | 131 DictionaryValue condition_dict; |
142 condition_dict.SetString(keys::kInstanceTypeKey, keys::kRequestMatcherType); | 132 condition_dict.SetString(keys::kInstanceTypeKey, keys::kRequestMatcherType); |
143 | 133 |
144 linked_ptr<json_schema_compiler::any::Any> condition( | |
145 new json_schema_compiler::any::Any); | |
146 condition->Init(condition_dict); | |
147 | |
148 DictionaryValue action_dict; | 134 DictionaryValue action_dict; |
149 action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType); | 135 action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType); |
150 | 136 |
151 linked_ptr<json_schema_compiler::any::Any> action( | |
152 new json_schema_compiler::any::Any); | |
153 action->Init(action_dict); | |
154 | |
155 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); | 137 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); |
156 rule->id.reset(new std::string(kRuleId2)); | 138 rule->id.reset(new std::string(kRuleId2)); |
157 rule->priority.reset(new int(100)); | 139 rule->priority.reset(new int(100)); |
158 rule->actions.push_back(action); | 140 rule->actions.push_back(linked_ptr<base::Value>(action_dict.DeepCopy())); |
159 rule->conditions.push_back(condition); | 141 rule->conditions.push_back( |
| 142 linked_ptr<base::Value>(condition_dict.DeepCopy())); |
160 return rule; | 143 return rule; |
161 } | 144 } |
162 | 145 |
163 linked_ptr<RulesRegistry::Rule> CreateRedirectRule( | 146 linked_ptr<RulesRegistry::Rule> CreateRedirectRule( |
164 const std::string& destination) { | 147 const std::string& destination) { |
165 DictionaryValue condition_dict; | 148 DictionaryValue condition_dict; |
166 condition_dict.SetString(keys::kInstanceTypeKey, keys::kRequestMatcherType); | 149 condition_dict.SetString(keys::kInstanceTypeKey, keys::kRequestMatcherType); |
167 | 150 |
168 linked_ptr<json_schema_compiler::any::Any> condition( | |
169 new json_schema_compiler::any::Any); | |
170 condition->Init(condition_dict); | |
171 | |
172 DictionaryValue action_dict; | 151 DictionaryValue action_dict; |
173 action_dict.SetString(keys::kInstanceTypeKey, keys::kRedirectRequestType); | 152 action_dict.SetString(keys::kInstanceTypeKey, keys::kRedirectRequestType); |
174 action_dict.SetString(keys::kRedirectUrlKey, destination); | 153 action_dict.SetString(keys::kRedirectUrlKey, destination); |
175 | 154 |
176 linked_ptr<json_schema_compiler::any::Any> action( | |
177 new json_schema_compiler::any::Any); | |
178 action->Init(action_dict); | |
179 | |
180 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); | 155 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); |
181 rule->id.reset(new std::string(kRuleId3)); | 156 rule->id.reset(new std::string(kRuleId3)); |
182 rule->priority.reset(new int(100)); | 157 rule->priority.reset(new int(100)); |
183 rule->actions.push_back(action); | 158 rule->actions.push_back(linked_ptr<base::Value>(action_dict.DeepCopy())); |
184 rule->conditions.push_back(condition); | 159 rule->conditions.push_back( |
| 160 linked_ptr<base::Value>(condition_dict.DeepCopy())); |
185 return rule; | 161 return rule; |
186 } | 162 } |
187 | 163 |
188 // Create a rule to ignore all other rules for a destination that | 164 // Create a rule to ignore all other rules for a destination that |
189 // contains index.html. | 165 // contains index.html. |
190 linked_ptr<RulesRegistry::Rule> CreateIgnoreRule() { | 166 linked_ptr<RulesRegistry::Rule> CreateIgnoreRule() { |
191 linked_ptr<json_schema_compiler::any::Any> condition( | |
192 new json_schema_compiler::any::Any); | |
193 DictionaryValue condition_dict; | 167 DictionaryValue condition_dict; |
194 DictionaryValue* http_condition_dict = new DictionaryValue(); | 168 DictionaryValue* http_condition_dict = new DictionaryValue(); |
195 http_condition_dict->SetString(keys2::kPathContainsKey, "index.html"); | 169 http_condition_dict->SetString(keys2::kPathContainsKey, "index.html"); |
196 condition_dict.SetString(keys::kInstanceTypeKey, keys::kRequestMatcherType); | 170 condition_dict.SetString(keys::kInstanceTypeKey, keys::kRequestMatcherType); |
197 condition_dict.Set(keys::kUrlKey, http_condition_dict); | 171 condition_dict.Set(keys::kUrlKey, http_condition_dict); |
198 condition->Init(condition_dict); | |
199 | 172 |
200 DictionaryValue action_dict; | 173 DictionaryValue action_dict; |
201 action_dict.SetString(keys::kInstanceTypeKey, keys::kIgnoreRulesType); | 174 action_dict.SetString(keys::kInstanceTypeKey, keys::kIgnoreRulesType); |
202 action_dict.SetInteger(keys::kLowerPriorityThanKey, 150); | 175 action_dict.SetInteger(keys::kLowerPriorityThanKey, 150); |
203 linked_ptr<json_schema_compiler::any::Any> action( | |
204 new json_schema_compiler::any::Any); | |
205 action->Init(action_dict); | |
206 | 176 |
207 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); | 177 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); |
208 rule->id.reset(new std::string(kRuleId4)); | 178 rule->id.reset(new std::string(kRuleId4)); |
209 rule->priority.reset(new int(200)); | 179 rule->priority.reset(new int(200)); |
210 rule->actions.push_back(action); | 180 rule->actions.push_back(linked_ptr<base::Value>(action_dict.DeepCopy())); |
211 rule->conditions.push_back(condition); | 181 rule->conditions.push_back( |
| 182 linked_ptr<base::Value>(condition_dict.DeepCopy())); |
212 return rule; | 183 return rule; |
213 } | 184 } |
214 | 185 |
215 // Create a condition with the attributes specified. An example value of a | 186 // Create a condition with the attributes specified. An example value of a |
216 // string from |attributes| is: "\"resourceType\": [\"stylesheet\"], \n". | 187 // string from |attributes| is: "\"resourceType\": [\"stylesheet\"], \n". |
217 linked_ptr<json_schema_compiler::any::Any> CreateCondition( | 188 linked_ptr<base::Value> CreateCondition( |
218 const std::vector<const char *>& attributes) { | 189 const std::vector<const char *>& attributes) { |
219 linked_ptr<json_schema_compiler::any::Any> condition( | |
220 new json_schema_compiler::any::Any); | |
221 | |
222 // Starting boilerplate. | 190 // Starting boilerplate. |
223 std::string json_description = | 191 std::string json_description = |
224 "{ \n" | 192 "{ \n" |
225 " \"instanceType\": \"declarativeWebRequest.RequestMatcher\", \n"; | 193 " \"instanceType\": \"declarativeWebRequest.RequestMatcher\", \n"; |
226 for (size_t i = 0; i < attributes.size(); ++i) { | 194 for (size_t i = 0; i < attributes.size(); ++i) { |
227 json_description += attributes[i]; | 195 json_description += attributes[i]; |
228 } | 196 } |
229 // Ending boilerplate. | 197 // Ending boilerplate. |
230 json_description += "}"; | 198 json_description += "}"; |
231 condition->Init(*base::test::ParseJson(json_description)); | |
232 | 199 |
233 return condition; | 200 return linked_ptr<base::Value>( |
| 201 base::test::ParseJson(json_description).release()); |
234 } | 202 } |
235 | 203 |
236 // Create a rule with the ID |rule_id| and with a single condition and a | 204 // Create a rule with the ID |rule_id| and with a single condition and a |
237 // cancelling action. The condition contains a non-matching non-URL attribute, | 205 // cancelling action. The condition contains a non-matching non-URL attribute, |
238 // and optionally, according to |with_url_attribute| also a URL attribute | 206 // and optionally, according to |with_url_attribute| also a URL attribute |
239 // matching any (!) URL. | 207 // matching any (!) URL. |
240 linked_ptr<RulesRegistry::Rule> CreateNonMatchingRule( | 208 linked_ptr<RulesRegistry::Rule> CreateNonMatchingRule( |
241 bool with_url_attribute, | 209 bool with_url_attribute, |
242 const char* rule_id) { | 210 const char* rule_id) { |
243 std::vector<const char*> attributes; | 211 std::vector<const char*> attributes; |
244 if (with_url_attribute) | 212 if (with_url_attribute) |
245 attributes.push_back("\"url\": { \"pathContains\": \"\" }, \n"); | 213 attributes.push_back("\"url\": { \"pathContains\": \"\" }, \n"); |
246 | 214 |
247 // The following attribute never matches in this unit test. | 215 // The following attribute never matches in this unit test. |
248 attributes.push_back("\"resourceType\": [\"stylesheet\"], \n"); | 216 attributes.push_back("\"resourceType\": [\"stylesheet\"], \n"); |
249 | 217 |
250 linked_ptr<json_schema_compiler::any::Any> condition = | |
251 CreateCondition(attributes); | |
252 | |
253 DictionaryValue action_dict; | 218 DictionaryValue action_dict; |
254 action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType); | 219 action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType); |
255 linked_ptr<json_schema_compiler::any::Any> action( | |
256 new json_schema_compiler::any::Any); | |
257 action->Init(action_dict); | |
258 | 220 |
259 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); | 221 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); |
260 rule->id.reset(new std::string(rule_id)); | 222 rule->id.reset(new std::string(rule_id)); |
261 rule->priority.reset(new int(1)); | 223 rule->priority.reset(new int(1)); |
262 rule->actions.push_back(action); | 224 rule->actions.push_back(linked_ptr<base::Value>(action_dict.DeepCopy())); |
263 rule->conditions.push_back(condition); | 225 rule->conditions.push_back(CreateCondition(attributes)); |
264 return rule; | 226 return rule; |
265 } | 227 } |
266 | 228 |
267 // Create a rule with the ID |rule_id| and with two conditions and a | 229 // Create a rule with the ID |rule_id| and with two conditions and a |
268 // cancelling action. One condition contains a non-matching non-URL attribute, | 230 // cancelling action. One condition contains a non-matching non-URL attribute, |
269 // and the other one a URL attribute matching any URL. | 231 // and the other one a URL attribute matching any URL. |
270 linked_ptr<RulesRegistry::Rule> CreateRuleWithTwoConditions( | 232 linked_ptr<RulesRegistry::Rule> CreateRuleWithTwoConditions( |
271 const char* rule_id) { | 233 const char* rule_id) { |
272 std::vector<const char*> attributes; | 234 std::vector<const char*> url_attributes; |
273 attributes.push_back("\"url\": { \"pathContains\": \"\" }, \n"); | 235 url_attributes.push_back("\"url\": { \"pathContains\": \"\" }, \n"); |
274 linked_ptr<json_schema_compiler::any::Any> url_condition = | |
275 CreateCondition(attributes); | |
276 | 236 |
277 attributes.clear(); | |
278 // The following attribute never matches in this unit test. | 237 // The following attribute never matches in this unit test. |
279 attributes.push_back("\"resourceType\": [\"stylesheet\"], \n"); | 238 std::vector<const char*> non_matching_attributes; |
280 linked_ptr<json_schema_compiler::any::Any> non_matching_condition = | 239 non_matching_attributes.push_back("\"resourceType\": [\"stylesheet\"], \n"); |
281 CreateCondition(attributes); | |
282 | 240 |
283 DictionaryValue action_dict; | 241 DictionaryValue action_dict; |
284 action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType); | 242 action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType); |
285 linked_ptr<json_schema_compiler::any::Any> action( | |
286 new json_schema_compiler::any::Any); | |
287 action->Init(action_dict); | |
288 | 243 |
289 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); | 244 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); |
290 rule->id.reset(new std::string(rule_id)); | 245 rule->id.reset(new std::string(rule_id)); |
291 rule->priority.reset(new int(1)); | 246 rule->priority.reset(new int(1)); |
292 rule->actions.push_back(action); | 247 rule->actions.push_back(linked_ptr<base::Value>(action_dict.DeepCopy())); |
293 rule->conditions.push_back(url_condition); | 248 rule->conditions.push_back(CreateCondition(url_attributes)); |
294 rule->conditions.push_back(non_matching_condition); | 249 rule->conditions.push_back(CreateCondition(non_matching_attributes)); |
295 return rule; | 250 return rule; |
296 } | 251 } |
297 | 252 |
298 protected: | 253 protected: |
299 MessageLoop message_loop; | 254 MessageLoop message_loop; |
300 content::TestBrowserThread ui; | 255 content::TestBrowserThread ui; |
301 content::TestBrowserThread io; | 256 content::TestBrowserThread io; |
302 }; | 257 }; |
303 | 258 |
304 TEST_F(WebRequestRulesRegistryTest, AddRulesImpl) { | 259 TEST_F(WebRequestRulesRegistryTest, AddRulesImpl) { |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
594 new TestWebRequestRulesRegistry()); | 549 new TestWebRequestRulesRegistry()); |
595 | 550 |
596 URLMatcher matcher; | 551 URLMatcher matcher; |
597 std::string error = registry->AddRulesImpl(kExtensionId, rules); | 552 std::string error = registry->AddRulesImpl(kExtensionId, rules); |
598 EXPECT_THAT(error, HasSubstr("no time in the request life-cycle")); | 553 EXPECT_THAT(error, HasSubstr("no time in the request life-cycle")); |
599 EXPECT_TRUE(registry->IsEmpty()); | 554 EXPECT_TRUE(registry->IsEmpty()); |
600 } | 555 } |
601 | 556 |
602 | 557 |
603 } // namespace extensions | 558 } // namespace extensions |
OLD | NEW |