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

Side by Side Diff: chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc

Issue 11569007: Refactoring how conditions without URL attributes are handled. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Trigger from Condition.IsFulfilled removed Created 7 years, 11 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "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/memory/linked_ptr.h" 9 #include "base/memory/linked_ptr.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
11 #include "base/stl_util.h"
12 #include "base/test/values_test_util.h"
11 #include "base/values.h" 13 #include "base/values.h"
12 #include "chrome/common/extensions/matcher/url_matcher_constants.h" 14 #include "chrome/common/extensions/matcher/url_matcher_constants.h"
13 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_consta nts.h" 15 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_consta nts.h"
14 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rule.h " 16 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rule.h "
15 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" 17 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h"
16 #include "content/public/test/test_browser_thread.h" 18 #include "content/public/test/test_browser_thread.h"
17 #include "net/url_request/url_request_test_util.h" 19 #include "net/url_request/url_request_test_util.h"
18 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
19 21
20 namespace { 22 namespace {
(...skipping 14 matching lines...) Expand all
35 class TestWebRequestRulesRegistry : public WebRequestRulesRegistry { 37 class TestWebRequestRulesRegistry : public WebRequestRulesRegistry {
36 public: 38 public:
37 TestWebRequestRulesRegistry() 39 TestWebRequestRulesRegistry()
38 : WebRequestRulesRegistry(NULL, NULL), 40 : WebRequestRulesRegistry(NULL, NULL),
39 num_clear_cache_calls_(0) {} 41 num_clear_cache_calls_(0) {}
40 42
41 // Returns how often the in-memory caches of the renderers were instructed 43 // Returns how often the in-memory caches of the renderers were instructed
42 // to be cleared. 44 // to be cleared.
43 int num_clear_cache_calls() const { return num_clear_cache_calls_; } 45 int num_clear_cache_calls() const { return num_clear_cache_calls_; }
44 46
47 // How many rules are there which have some conditions not triggered by URL
48 // matches.
49 size_t RulesWithoutTriggers() const {
50 return rules_with_untriggered_conditions_for_test().size();
51 }
52
45 protected: 53 protected:
46 virtual ~TestWebRequestRulesRegistry() {} 54 virtual ~TestWebRequestRulesRegistry() {}
47 55
48 virtual base::Time GetExtensionInstallationTime( 56 virtual base::Time GetExtensionInstallationTime(
49 const std::string& extension_id) const { 57 const std::string& extension_id) const {
50 if (extension_id == kExtensionId) 58 if (extension_id == kExtensionId)
51 return base::Time() + base::TimeDelta::FromDays(1); 59 return base::Time() + base::TimeDelta::FromDays(1);
52 else if (extension_id == kExtensionId2) 60 else if (extension_id == kExtensionId2)
53 return base::Time() + base::TimeDelta::FromDays(2); 61 return base::Time() + base::TimeDelta::FromDays(2);
54 else 62 else
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 scheme_http->Append(Value::CreateStringValue("https")); 102 scheme_http->Append(Value::CreateStringValue("https"));
95 DictionaryValue* https_condition_dict = new DictionaryValue(); 103 DictionaryValue* https_condition_dict = new DictionaryValue();
96 https_condition_dict->Set(keys2::kSchemesKey, scheme_https); 104 https_condition_dict->Set(keys2::kSchemesKey, scheme_https);
97 https_condition_dict->SetString(keys2::kHostSuffixKey, "example.com"); 105 https_condition_dict->SetString(keys2::kHostSuffixKey, "example.com");
98 https_condition_dict->SetString(keys2::kHostPrefixKey, "www"); 106 https_condition_dict->SetString(keys2::kHostPrefixKey, "www");
99 DictionaryValue https_condition_url_filter; 107 DictionaryValue https_condition_url_filter;
100 https_condition_url_filter.Set(keys::kUrlKey, https_condition_dict); 108 https_condition_url_filter.Set(keys::kUrlKey, https_condition_dict);
101 https_condition_url_filter.SetString(keys::kInstanceTypeKey, 109 https_condition_url_filter.SetString(keys::kInstanceTypeKey,
102 keys::kRequestMatcherType); 110 keys::kRequestMatcherType);
103 111
104 linked_ptr<json_schema_compiler::any::Any> condition1 = make_linked_ptr( 112 linked_ptr<json_schema_compiler::any::Any> condition1(
105 new json_schema_compiler::any::Any); 113 new json_schema_compiler::any::Any);
106 condition1->Init(http_condition_url_filter); 114 condition1->Init(http_condition_url_filter);
107 115
108 linked_ptr<json_schema_compiler::any::Any> condition2 = make_linked_ptr( 116 linked_ptr<json_schema_compiler::any::Any> condition2(
109 new json_schema_compiler::any::Any); 117 new json_schema_compiler::any::Any);
110 condition2->Init(https_condition_url_filter); 118 condition2->Init(https_condition_url_filter);
111 119
112 DictionaryValue action_dict; 120 DictionaryValue action_dict;
113 action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType); 121 action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType);
114 122
115 linked_ptr<json_schema_compiler::any::Any> action1 = make_linked_ptr( 123 linked_ptr<json_schema_compiler::any::Any> action1(
116 new json_schema_compiler::any::Any); 124 new json_schema_compiler::any::Any);
117 action1->Init(action_dict); 125 action1->Init(action_dict);
118 126
119 linked_ptr<RulesRegistry::Rule> rule = 127 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule);
120 make_linked_ptr(new RulesRegistry::Rule);
121 rule->id.reset(new std::string(kRuleId1)); 128 rule->id.reset(new std::string(kRuleId1));
122 rule->priority.reset(new int(100)); 129 rule->priority.reset(new int(100));
123 rule->actions.push_back(action1); 130 rule->actions.push_back(action1);
124 rule->conditions.push_back(condition1); 131 rule->conditions.push_back(condition1);
125 rule->conditions.push_back(condition2); 132 rule->conditions.push_back(condition2);
126 return rule; 133 return rule;
127 } 134 }
128 135
129 // Returns a rule that matches anything and cancels it. 136 // Returns a rule that matches anything and cancels it.
130 linked_ptr<RulesRegistry::Rule> CreateRule2() { 137 linked_ptr<RulesRegistry::Rule> CreateRule2() {
131 DictionaryValue condition_dict; 138 DictionaryValue condition_dict;
132 condition_dict.SetString(keys::kInstanceTypeKey, keys::kRequestMatcherType); 139 condition_dict.SetString(keys::kInstanceTypeKey, keys::kRequestMatcherType);
133 140
134 linked_ptr<json_schema_compiler::any::Any> condition = make_linked_ptr( 141 linked_ptr<json_schema_compiler::any::Any> condition(
135 new json_schema_compiler::any::Any); 142 new json_schema_compiler::any::Any);
136 condition->Init(condition_dict); 143 condition->Init(condition_dict);
137 144
138 DictionaryValue action_dict; 145 DictionaryValue action_dict;
139 action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType); 146 action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType);
140 147
141 linked_ptr<json_schema_compiler::any::Any> action = make_linked_ptr( 148 linked_ptr<json_schema_compiler::any::Any> action(
142 new json_schema_compiler::any::Any); 149 new json_schema_compiler::any::Any);
143 action->Init(action_dict); 150 action->Init(action_dict);
144 151
145 linked_ptr<RulesRegistry::Rule> rule = 152 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule);
146 make_linked_ptr(new RulesRegistry::Rule);
147 rule->id.reset(new std::string(kRuleId2)); 153 rule->id.reset(new std::string(kRuleId2));
148 rule->priority.reset(new int(100)); 154 rule->priority.reset(new int(100));
149 rule->actions.push_back(action); 155 rule->actions.push_back(action);
150 rule->conditions.push_back(condition); 156 rule->conditions.push_back(condition);
151 return rule; 157 return rule;
152 } 158 }
153 159
154 linked_ptr<RulesRegistry::Rule> CreateRedirectRule( 160 linked_ptr<RulesRegistry::Rule> CreateRedirectRule(
155 const std::string& destination) { 161 const std::string& destination) {
156 DictionaryValue condition_dict; 162 DictionaryValue condition_dict;
157 condition_dict.SetString(keys::kInstanceTypeKey, keys::kRequestMatcherType); 163 condition_dict.SetString(keys::kInstanceTypeKey, keys::kRequestMatcherType);
158 164
159 linked_ptr<json_schema_compiler::any::Any> condition = make_linked_ptr( 165 linked_ptr<json_schema_compiler::any::Any> condition(
160 new json_schema_compiler::any::Any); 166 new json_schema_compiler::any::Any);
161 condition->Init(condition_dict); 167 condition->Init(condition_dict);
162 168
163 DictionaryValue action_dict; 169 DictionaryValue action_dict;
164 action_dict.SetString(keys::kInstanceTypeKey, keys::kRedirectRequestType); 170 action_dict.SetString(keys::kInstanceTypeKey, keys::kRedirectRequestType);
165 action_dict.SetString(keys::kRedirectUrlKey, destination); 171 action_dict.SetString(keys::kRedirectUrlKey, destination);
166 172
167 linked_ptr<json_schema_compiler::any::Any> action = make_linked_ptr( 173 linked_ptr<json_schema_compiler::any::Any> action(
168 new json_schema_compiler::any::Any); 174 new json_schema_compiler::any::Any);
169 action->Init(action_dict); 175 action->Init(action_dict);
170 176
171 linked_ptr<RulesRegistry::Rule> rule = 177 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule);
172 make_linked_ptr(new RulesRegistry::Rule);
173 rule->id.reset(new std::string(kRuleId3)); 178 rule->id.reset(new std::string(kRuleId3));
174 rule->priority.reset(new int(100)); 179 rule->priority.reset(new int(100));
175 rule->actions.push_back(action); 180 rule->actions.push_back(action);
176 rule->conditions.push_back(condition); 181 rule->conditions.push_back(condition);
177 return rule; 182 return rule;
178 } 183 }
179 184
180 // Create a rule to ignore all other rules for a destination that 185 // Create a rule to ignore all other rules for a destination that
181 // contains index.html. 186 // contains index.html.
182 linked_ptr<RulesRegistry::Rule> CreateIgnoreRule() { 187 linked_ptr<RulesRegistry::Rule> CreateIgnoreRule() {
183 linked_ptr<json_schema_compiler::any::Any> condition = make_linked_ptr( 188 linked_ptr<json_schema_compiler::any::Any> condition(
184 new json_schema_compiler::any::Any); 189 new json_schema_compiler::any::Any);
185 DictionaryValue condition_dict; 190 DictionaryValue condition_dict;
186 DictionaryValue* http_condition_dict = new DictionaryValue(); 191 DictionaryValue* http_condition_dict = new DictionaryValue();
187 http_condition_dict->SetString(keys2::kPathContainsKey, "index.html"); 192 http_condition_dict->SetString(keys2::kPathContainsKey, "index.html");
188 condition_dict.SetString(keys::kInstanceTypeKey, keys::kRequestMatcherType); 193 condition_dict.SetString(keys::kInstanceTypeKey, keys::kRequestMatcherType);
189 condition_dict.Set(keys::kUrlKey, http_condition_dict); 194 condition_dict.Set(keys::kUrlKey, http_condition_dict);
190 condition->Init(condition_dict); 195 condition->Init(condition_dict);
191 196
192 DictionaryValue action_dict; 197 DictionaryValue action_dict;
193 action_dict.SetString(keys::kInstanceTypeKey, keys::kIgnoreRulesType); 198 action_dict.SetString(keys::kInstanceTypeKey, keys::kIgnoreRulesType);
194 action_dict.SetInteger(keys::kLowerPriorityThanKey, 150); 199 action_dict.SetInteger(keys::kLowerPriorityThanKey, 150);
195 linked_ptr<json_schema_compiler::any::Any> action = make_linked_ptr( 200 linked_ptr<json_schema_compiler::any::Any> action(
196 new json_schema_compiler::any::Any); 201 new json_schema_compiler::any::Any);
197 action->Init(action_dict); 202 action->Init(action_dict);
198 203
199 linked_ptr<RulesRegistry::Rule> rule = 204 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule);
200 make_linked_ptr(new RulesRegistry::Rule);
201 rule->id.reset(new std::string(kRuleId4)); 205 rule->id.reset(new std::string(kRuleId4));
202 rule->priority.reset(new int(200)); 206 rule->priority.reset(new int(200));
203 rule->actions.push_back(action); 207 rule->actions.push_back(action);
204 rule->conditions.push_back(condition); 208 rule->conditions.push_back(condition);
205 return rule; 209 return rule;
206 } 210 }
207 211
212 // Create a condition with the attributes specified. An example value of a
213 // string from |attributes| is: "\"resourceType\": [\"stylesheet\"], \n".
214 linked_ptr<json_schema_compiler::any::Any> CreateCondition(
215 const std::vector<const char *>& attributes) {
216 linked_ptr<json_schema_compiler::any::Any> condition(
217 new json_schema_compiler::any::Any);
218
219 // Starting boilerplate.
220 std::string json_description =
221 "{ \n"
222 " \"instanceType\": \"declarativeWebRequest.RequestMatcher\", \n";
223 for (size_t i = 0; i < attributes.size(); ++i) {
224 json_description += attributes[i];
225 }
226 // Ending boilerplate.
227 json_description += "}";
228 condition->Init(*base::test::ParseJson(json_description));
229
230 return condition;
231 }
232
233 // Create a rule with the ID |rule_id| and with a single condition and a
234 // cancelling action. The condition contains a non-matching non-URL attribute,
235 // and optionally, according to |with_url_attribute| also a URL attribute
236 // matching any (!) URL.
237 linked_ptr<RulesRegistry::Rule> CreateNonMatchingRule(
238 bool with_url_attribute,
239 const char* rule_id) {
240 std::vector<const char*> attributes;
241 if (with_url_attribute)
242 attributes.push_back("\"url\": { \"pathContains\": \"\" }, \n");
243
244 // The following attribute never matches in this unit test.
245 attributes.push_back("\"resourceType\": [\"stylesheet\"], \n");
246
247 linked_ptr<json_schema_compiler::any::Any> condition =
248 CreateCondition(attributes);
249
250 DictionaryValue action_dict;
251 action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType);
252 linked_ptr<json_schema_compiler::any::Any> action(
253 new json_schema_compiler::any::Any);
254 action->Init(action_dict);
255
256 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule);
257 rule->id.reset(new std::string(rule_id));
258 rule->priority.reset(new int(1));
259 rule->actions.push_back(action);
260 rule->conditions.push_back(condition);
261 return rule;
262 }
263
264 // Create a rule with the ID |rule_id| and with two conditions and a
265 // cancelling action. One condition contains a non-matching non-URL attribute,
266 // and the other one a URL attribute matching any URL.
267 linked_ptr<RulesRegistry::Rule> CreateRuleWithTwoConditions(
268 const char* rule_id) {
269 std::vector<const char*> attributes;
270 attributes.push_back("\"url\": { \"pathContains\": \"\" }, \n");
271 linked_ptr<json_schema_compiler::any::Any> url_condition =
272 CreateCondition(attributes);
273
274 attributes.clear();
275 // The following attribute never matches in this unit test.
276 attributes.push_back("\"resourceType\": [\"stylesheet\"], \n");
277 linked_ptr<json_schema_compiler::any::Any> non_matching_condition =
278 CreateCondition(attributes);
279
280 DictionaryValue action_dict;
281 action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType);
282 linked_ptr<json_schema_compiler::any::Any> action(
283 new json_schema_compiler::any::Any);
284 action->Init(action_dict);
285
286 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule);
287 rule->id.reset(new std::string(rule_id));
288 rule->priority.reset(new int(1));
289 rule->actions.push_back(action);
290 rule->conditions.push_back(url_condition);
291 rule->conditions.push_back(non_matching_condition);
292 return rule;
293 }
294
208 protected: 295 protected:
209 MessageLoop message_loop; 296 MessageLoop message_loop;
210 content::TestBrowserThread ui; 297 content::TestBrowserThread ui;
211 content::TestBrowserThread io; 298 content::TestBrowserThread io;
212 }; 299 };
213 300
214 TEST_F(WebRequestRulesRegistryTest, AddRulesImpl) { 301 TEST_F(WebRequestRulesRegistryTest, AddRulesImpl) {
215 scoped_refptr<TestWebRequestRulesRegistry> registry( 302 scoped_refptr<TestWebRequestRulesRegistry> registry(
216 new TestWebRequestRulesRegistry()); 303 new TestWebRequestRulesRegistry());
217 std::string error; 304 std::string error;
218 305
219 std::vector<linked_ptr<RulesRegistry::Rule> > rules; 306 std::vector<linked_ptr<RulesRegistry::Rule> > rules;
220 rules.push_back(CreateRule1()); 307 rules.push_back(CreateRule1());
221 rules.push_back(CreateRule2()); 308 rules.push_back(CreateRule2());
222 309
223 error = registry->AddRules(kExtensionId, rules); 310 error = registry->AddRules(kExtensionId, rules);
224 EXPECT_EQ("", error); 311 EXPECT_EQ("", error);
225 EXPECT_EQ(1, registry->num_clear_cache_calls()); 312 EXPECT_EQ(1, registry->num_clear_cache_calls());
226 313
227 std::set<WebRequestRule::GlobalRuleId> matches; 314 std::set<const WebRequestRule*> matches;
228 315
229 GURL http_url("http://www.example.com"); 316 GURL http_url("http://www.example.com");
230 net::TestURLRequestContext context; 317 net::TestURLRequestContext context;
231 net::TestURLRequest http_request(http_url, NULL, &context); 318 net::TestURLRequest http_request(http_url, NULL, &context);
232 matches = registry->GetMatches( 319 matches = registry->GetMatches(
233 WebRequestRule::RequestData(&http_request, ON_BEFORE_REQUEST)); 320 WebRequestRule::RequestData(&http_request, ON_BEFORE_REQUEST));
234 EXPECT_EQ(2u, matches.size()); 321 EXPECT_EQ(2u, matches.size());
235 EXPECT_TRUE(matches.find(std::make_pair(kExtensionId, kRuleId1)) != 322
236 matches.end()); 323 std::set<WebRequestRule::GlobalRuleId> matches_ids;
237 EXPECT_TRUE(matches.find(std::make_pair(kExtensionId, kRuleId2)) != 324 for (std::set<const WebRequestRule*>::const_iterator it = matches.begin();
238 matches.end()); 325 it != matches.end(); ++it)
326 matches_ids.insert((*it)->id());
327 EXPECT_TRUE(ContainsKey(matches_ids, std::make_pair(kExtensionId, kRuleId1)));
328 EXPECT_TRUE(ContainsKey(matches_ids, std::make_pair(kExtensionId, kRuleId2)));
239 329
240 GURL foobar_url("http://www.foobar.com"); 330 GURL foobar_url("http://www.foobar.com");
241 net::TestURLRequest foobar_request(foobar_url, NULL, &context); 331 net::TestURLRequest foobar_request(foobar_url, NULL, &context);
242 matches = registry->GetMatches( 332 matches = registry->GetMatches(
243 WebRequestRule::RequestData(&foobar_request, ON_BEFORE_REQUEST)); 333 WebRequestRule::RequestData(&foobar_request, ON_BEFORE_REQUEST));
244 EXPECT_EQ(1u, matches.size()); 334 EXPECT_EQ(1u, matches.size());
245 EXPECT_TRUE(matches.find(std::make_pair(kExtensionId, kRuleId2)) != 335 WebRequestRule::GlobalRuleId expected_pair =
246 matches.end()); 336 std::make_pair(kExtensionId, kRuleId2);
337 EXPECT_EQ(expected_pair, (*matches.begin())->id());
247 } 338 }
248 339
249 TEST_F(WebRequestRulesRegistryTest, RemoveRulesImpl) { 340 TEST_F(WebRequestRulesRegistryTest, RemoveRulesImpl) {
250 scoped_refptr<TestWebRequestRulesRegistry> registry( 341 scoped_refptr<TestWebRequestRulesRegistry> registry(
251 new TestWebRequestRulesRegistry()); 342 new TestWebRequestRulesRegistry());
252 std::string error; 343 std::string error;
253 344
254 // Setup RulesRegistry to contain two rules. 345 // Setup RulesRegistry to contain two rules.
255 std::vector<linked_ptr<RulesRegistry::Rule> > rules_to_add; 346 std::vector<linked_ptr<RulesRegistry::Rule> > rules_to_add;
256 rules_to_add.push_back(CreateRule1()); 347 rules_to_add.push_back(CreateRule1());
257 rules_to_add.push_back(CreateRule2()); 348 rules_to_add.push_back(CreateRule2());
258 error = registry->AddRules(kExtensionId, rules_to_add); 349 error = registry->AddRules(kExtensionId, rules_to_add);
259 EXPECT_EQ("", error); 350 EXPECT_EQ("", error);
260 EXPECT_EQ(1, registry->num_clear_cache_calls()); 351 EXPECT_EQ(1, registry->num_clear_cache_calls());
261 352
262 // Verify initial state. 353 // Verify initial state.
263 std::vector<linked_ptr<RulesRegistry::Rule> > registered_rules; 354 std::vector<linked_ptr<RulesRegistry::Rule> > registered_rules;
264 registry->GetAllRules(kExtensionId, &registered_rules); 355 registry->GetAllRules(kExtensionId, &registered_rules);
265 EXPECT_EQ(2u, registered_rules.size()); 356 EXPECT_EQ(2u, registered_rules.size());
357 EXPECT_EQ(1u, registry->RulesWithoutTriggers());
266 358
267 // Remove first rule. 359 // Remove first rule.
268 std::vector<std::string> rules_to_remove; 360 std::vector<std::string> rules_to_remove;
269 rules_to_remove.push_back(kRuleId1); 361 rules_to_remove.push_back(kRuleId1);
270 error = registry->RemoveRules(kExtensionId, rules_to_remove); 362 error = registry->RemoveRules(kExtensionId, rules_to_remove);
271 EXPECT_EQ("", error); 363 EXPECT_EQ("", error);
272 EXPECT_EQ(2, registry->num_clear_cache_calls()); 364 EXPECT_EQ(2, registry->num_clear_cache_calls());
273 365
274 // Verify that only one rule is left. 366 // Verify that only one rule is left.
275 registered_rules.clear(); 367 registered_rules.clear();
276 registry->GetAllRules(kExtensionId, &registered_rules); 368 registry->GetAllRules(kExtensionId, &registered_rules);
277 EXPECT_EQ(1u, registered_rules.size()); 369 EXPECT_EQ(1u, registered_rules.size());
370 EXPECT_EQ(1u, registry->RulesWithoutTriggers());
278 371
279 // Now rules_to_remove contains both rules, i.e. one that does not exist in 372 // Now rules_to_remove contains both rules, i.e. one that does not exist in
280 // the rules registry anymore. Effectively we only remove the second rule. 373 // the rules registry anymore. Effectively we only remove the second rule.
281 rules_to_remove.push_back(kRuleId2); 374 rules_to_remove.push_back(kRuleId2);
282 error = registry->RemoveRules(kExtensionId, rules_to_remove); 375 error = registry->RemoveRules(kExtensionId, rules_to_remove);
283 EXPECT_EQ("", error); 376 EXPECT_EQ("", error);
284 EXPECT_EQ(3, registry->num_clear_cache_calls()); 377 EXPECT_EQ(3, registry->num_clear_cache_calls());
285 378
286 // Verify that everything is gone. 379 // Verify that everything is gone.
287 registered_rules.clear(); 380 registered_rules.clear();
288 registry->GetAllRules(kExtensionId, &registered_rules); 381 registry->GetAllRules(kExtensionId, &registered_rules);
289 EXPECT_EQ(0u, registered_rules.size()); 382 EXPECT_EQ(0u, registered_rules.size());
383 EXPECT_EQ(0u, registry->RulesWithoutTriggers());
290 384
291 EXPECT_TRUE(registry->IsEmpty()); 385 EXPECT_TRUE(registry->IsEmpty());
292 } 386 }
293 387
294 TEST_F(WebRequestRulesRegistryTest, RemoveAllRulesImpl) { 388 TEST_F(WebRequestRulesRegistryTest, RemoveAllRulesImpl) {
295 scoped_refptr<TestWebRequestRulesRegistry> registry( 389 scoped_refptr<TestWebRequestRulesRegistry> registry(
296 new TestWebRequestRulesRegistry()); 390 new TestWebRequestRulesRegistry());
297 std::string error; 391 std::string error;
298 392
299 // Setup RulesRegistry to contain two rules, one for each extension. 393 // Setup RulesRegistry to contain two rules, one for each extension.
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 513
420 // The redirect by the first extension is ignored due to the ignore rule. 514 // The redirect by the first extension is ignored due to the ignore rule.
421 ASSERT_EQ(1u, deltas.size()); 515 ASSERT_EQ(1u, deltas.size());
422 LinkedPtrEventResponseDelta effective_rule = *(deltas.begin()); 516 LinkedPtrEventResponseDelta effective_rule = *(deltas.begin());
423 517
424 EXPECT_EQ(kExtensionId2, effective_rule->extension_id); 518 EXPECT_EQ(kExtensionId2, effective_rule->extension_id);
425 EXPECT_EQ(base::Time() + base::TimeDelta::FromDays(2), 519 EXPECT_EQ(base::Time() + base::TimeDelta::FromDays(2),
426 effective_rule->extension_install_time); 520 effective_rule->extension_install_time);
427 EXPECT_EQ(GURL("http://www.bar.com"), effective_rule->new_url); 521 EXPECT_EQ(GURL("http://www.bar.com"), effective_rule->new_url);
428 } 522 }
523
524 // Test that rules failing IsFulfilled on their conditions are never returned by
525 // GetMatches.
526 TEST_F(WebRequestRulesRegistryTest, GetMatchesCheckFulfilled) {
527 scoped_refptr<TestWebRequestRulesRegistry> registry(
528 new TestWebRequestRulesRegistry());
529 std::string error;
530
531 std::vector<linked_ptr<RulesRegistry::Rule> > rules;
532 // Both rules have one condition, neither of them should fire.
533 // This rule's condition has only one, non-matching and non-URL attribute.
534 rules.push_back(CreateNonMatchingRule(false, kRuleId1));
535 // This rule's condition has two attributes: a matching URL, and a
536 // non-matching non-URL attribute.
537 rules.push_back(CreateNonMatchingRule(true, kRuleId2));
538
539 // The 3rd rule has two conditions, one with a matching URL attribute, and one
540 // with a non-matching non-URL attribute.
541 rules.push_back(CreateRuleWithTwoConditions(kRuleId3));
542
543 error = registry->AddRules(kExtensionId, rules);
544 EXPECT_EQ("", error);
545 EXPECT_EQ(1, registry->num_clear_cache_calls());
546
547 std::set<const WebRequestRule*> matches;
548
549 GURL http_url("http://www.example.com");
550 net::TestURLRequestContext context;
551 net::TestURLRequest http_request(http_url, NULL, &context);
552 matches = registry->GetMatches(
553 WebRequestRule::RequestData(&http_request, ON_BEFORE_REQUEST));
554 EXPECT_EQ(1u, matches.size());
555 WebRequestRule::GlobalRuleId expected_pair = std::make_pair(kExtensionId,
556 kRuleId3);
557 EXPECT_EQ(expected_pair, (*matches.begin())->id());
558 }
559
429 } // namespace extensions 560 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698