| 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/memory/linked_ptr.h" | 9 #include "base/memory/linked_ptr.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 } // namespace | 27 } // namespace |
| 28 | 28 |
| 29 namespace extensions { | 29 namespace extensions { |
| 30 | 30 |
| 31 namespace helpers = extension_web_request_api_helpers; | 31 namespace helpers = extension_web_request_api_helpers; |
| 32 namespace keys = declarative_webrequest_constants; | 32 namespace keys = declarative_webrequest_constants; |
| 33 namespace keys2 = url_matcher_constants; | 33 namespace keys2 = url_matcher_constants; |
| 34 | 34 |
| 35 class TestWebRequestRulesRegistry : public WebRequestRulesRegistry { | 35 class TestWebRequestRulesRegistry : public WebRequestRulesRegistry { |
| 36 public: | 36 public: |
| 37 TestWebRequestRulesRegistry() : WebRequestRulesRegistry(NULL, NULL) {} | 37 TestWebRequestRulesRegistry() |
| 38 : WebRequestRulesRegistry(NULL, NULL), |
| 39 num_clear_cache_calls_(0) {} |
| 40 |
| 41 // Returns how often the in-memory caches of the renderers were instructed |
| 42 // to be cleared. |
| 43 int num_clear_cache_calls() const { return num_clear_cache_calls_; } |
| 38 | 44 |
| 39 protected: | 45 protected: |
| 40 virtual ~TestWebRequestRulesRegistry() {} | 46 virtual ~TestWebRequestRulesRegistry() {} |
| 41 | 47 |
| 42 virtual base::Time GetExtensionInstallationTime( | 48 virtual base::Time GetExtensionInstallationTime( |
| 43 const std::string& extension_id) const { | 49 const std::string& extension_id) const { |
| 44 if (extension_id == kExtensionId) | 50 if (extension_id == kExtensionId) |
| 45 return base::Time() + base::TimeDelta::FromDays(1); | 51 return base::Time() + base::TimeDelta::FromDays(1); |
| 46 else if (extension_id == kExtensionId2) | 52 else if (extension_id == kExtensionId2) |
| 47 return base::Time() + base::TimeDelta::FromDays(2); | 53 return base::Time() + base::TimeDelta::FromDays(2); |
| 48 else | 54 else |
| 49 return base::Time(); | 55 return base::Time(); |
| 50 } | 56 } |
| 57 |
| 58 virtual void ClearCacheOnNavigation() { |
| 59 ++num_clear_cache_calls_; |
| 60 } |
| 61 |
| 62 private: |
| 63 int num_clear_cache_calls_; |
| 51 }; | 64 }; |
| 52 | 65 |
| 53 class WebRequestRulesRegistryTest : public testing::Test { | 66 class WebRequestRulesRegistryTest : public testing::Test { |
| 54 public: | 67 public: |
| 55 WebRequestRulesRegistryTest() | 68 WebRequestRulesRegistryTest() |
| 56 : message_loop(MessageLoop::TYPE_IO), | 69 : message_loop(MessageLoop::TYPE_IO), |
| 57 ui(content::BrowserThread::UI, &message_loop), | 70 ui(content::BrowserThread::UI, &message_loop), |
| 58 io(content::BrowserThread::IO, &message_loop) {} | 71 io(content::BrowserThread::IO, &message_loop) {} |
| 59 | 72 |
| 60 virtual ~WebRequestRulesRegistryTest() {} | 73 virtual ~WebRequestRulesRegistryTest() {} |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 return rule; | 205 return rule; |
| 193 } | 206 } |
| 194 | 207 |
| 195 protected: | 208 protected: |
| 196 MessageLoop message_loop; | 209 MessageLoop message_loop; |
| 197 content::TestBrowserThread ui; | 210 content::TestBrowserThread ui; |
| 198 content::TestBrowserThread io; | 211 content::TestBrowserThread io; |
| 199 }; | 212 }; |
| 200 | 213 |
| 201 TEST_F(WebRequestRulesRegistryTest, AddRulesImpl) { | 214 TEST_F(WebRequestRulesRegistryTest, AddRulesImpl) { |
| 202 scoped_refptr<WebRequestRulesRegistry> registry( | 215 scoped_refptr<TestWebRequestRulesRegistry> registry( |
| 203 new TestWebRequestRulesRegistry()); | 216 new TestWebRequestRulesRegistry()); |
| 204 std::string error; | 217 std::string error; |
| 205 | 218 |
| 206 std::vector<linked_ptr<RulesRegistry::Rule> > rules; | 219 std::vector<linked_ptr<RulesRegistry::Rule> > rules; |
| 207 rules.push_back(CreateRule1()); | 220 rules.push_back(CreateRule1()); |
| 208 rules.push_back(CreateRule2()); | 221 rules.push_back(CreateRule2()); |
| 209 | 222 |
| 210 error = registry->AddRules(kExtensionId, rules); | 223 error = registry->AddRules(kExtensionId, rules); |
| 211 EXPECT_EQ("", error); | 224 EXPECT_EQ("", error); |
| 225 EXPECT_EQ(1, registry->num_clear_cache_calls()); |
| 212 | 226 |
| 213 std::set<WebRequestRule::GlobalRuleId> matches; | 227 std::set<WebRequestRule::GlobalRuleId> matches; |
| 214 | 228 |
| 215 GURL http_url("http://www.example.com"); | 229 GURL http_url("http://www.example.com"); |
| 216 TestURLRequestContext context; | 230 TestURLRequestContext context; |
| 217 TestURLRequest http_request(http_url, NULL, &context); | 231 TestURLRequest http_request(http_url, NULL, &context); |
| 218 matches = registry->GetMatches( | 232 matches = registry->GetMatches( |
| 219 WebRequestRule::RequestData(&http_request, ON_BEFORE_REQUEST)); | 233 WebRequestRule::RequestData(&http_request, ON_BEFORE_REQUEST)); |
| 220 EXPECT_EQ(2u, matches.size()); | 234 EXPECT_EQ(2u, matches.size()); |
| 221 EXPECT_TRUE(matches.find(std::make_pair(kExtensionId, kRuleId1)) != | 235 EXPECT_TRUE(matches.find(std::make_pair(kExtensionId, kRuleId1)) != |
| 222 matches.end()); | 236 matches.end()); |
| 223 EXPECT_TRUE(matches.find(std::make_pair(kExtensionId, kRuleId2)) != | 237 EXPECT_TRUE(matches.find(std::make_pair(kExtensionId, kRuleId2)) != |
| 224 matches.end()); | 238 matches.end()); |
| 225 | 239 |
| 226 GURL foobar_url("http://www.foobar.com"); | 240 GURL foobar_url("http://www.foobar.com"); |
| 227 TestURLRequest foobar_request(foobar_url, NULL, &context); | 241 TestURLRequest foobar_request(foobar_url, NULL, &context); |
| 228 matches = registry->GetMatches( | 242 matches = registry->GetMatches( |
| 229 WebRequestRule::RequestData(&foobar_request, ON_BEFORE_REQUEST)); | 243 WebRequestRule::RequestData(&foobar_request, ON_BEFORE_REQUEST)); |
| 230 EXPECT_EQ(1u, matches.size()); | 244 EXPECT_EQ(1u, matches.size()); |
| 231 EXPECT_TRUE(matches.find(std::make_pair(kExtensionId, kRuleId2)) != | 245 EXPECT_TRUE(matches.find(std::make_pair(kExtensionId, kRuleId2)) != |
| 232 matches.end()); | 246 matches.end()); |
| 233 } | 247 } |
| 234 | 248 |
| 235 TEST_F(WebRequestRulesRegistryTest, RemoveRulesImpl) { | 249 TEST_F(WebRequestRulesRegistryTest, RemoveRulesImpl) { |
| 236 scoped_refptr<WebRequestRulesRegistry> registry( | 250 scoped_refptr<TestWebRequestRulesRegistry> registry( |
| 237 new TestWebRequestRulesRegistry()); | 251 new TestWebRequestRulesRegistry()); |
| 238 std::string error; | 252 std::string error; |
| 239 | 253 |
| 240 // Setup RulesRegistry to contain two rules. | 254 // Setup RulesRegistry to contain two rules. |
| 241 std::vector<linked_ptr<RulesRegistry::Rule> > rules_to_add; | 255 std::vector<linked_ptr<RulesRegistry::Rule> > rules_to_add; |
| 242 rules_to_add.push_back(CreateRule1()); | 256 rules_to_add.push_back(CreateRule1()); |
| 243 rules_to_add.push_back(CreateRule2()); | 257 rules_to_add.push_back(CreateRule2()); |
| 244 error = registry->AddRules(kExtensionId, rules_to_add); | 258 error = registry->AddRules(kExtensionId, rules_to_add); |
| 245 EXPECT_EQ("", error); | 259 EXPECT_EQ("", error); |
| 260 EXPECT_EQ(1, registry->num_clear_cache_calls()); |
| 246 | 261 |
| 247 // Verify initial state. | 262 // Verify initial state. |
| 248 std::vector<linked_ptr<RulesRegistry::Rule> > registered_rules; | 263 std::vector<linked_ptr<RulesRegistry::Rule> > registered_rules; |
| 249 registry->GetAllRules(kExtensionId, ®istered_rules); | 264 registry->GetAllRules(kExtensionId, ®istered_rules); |
| 250 EXPECT_EQ(2u, registered_rules.size()); | 265 EXPECT_EQ(2u, registered_rules.size()); |
| 251 | 266 |
| 252 // Remove first rule. | 267 // Remove first rule. |
| 253 std::vector<std::string> rules_to_remove; | 268 std::vector<std::string> rules_to_remove; |
| 254 rules_to_remove.push_back(kRuleId1); | 269 rules_to_remove.push_back(kRuleId1); |
| 255 error = registry->RemoveRules(kExtensionId, rules_to_remove); | 270 error = registry->RemoveRules(kExtensionId, rules_to_remove); |
| 256 EXPECT_EQ("", error); | 271 EXPECT_EQ("", error); |
| 272 EXPECT_EQ(2, registry->num_clear_cache_calls()); |
| 257 | 273 |
| 258 // Verify that only one rule is left. | 274 // Verify that only one rule is left. |
| 259 registered_rules.clear(); | 275 registered_rules.clear(); |
| 260 registry->GetAllRules(kExtensionId, ®istered_rules); | 276 registry->GetAllRules(kExtensionId, ®istered_rules); |
| 261 EXPECT_EQ(1u, registered_rules.size()); | 277 EXPECT_EQ(1u, registered_rules.size()); |
| 262 | 278 |
| 263 // Now rules_to_remove contains both rules, i.e. one that does not exist in | 279 // Now rules_to_remove contains both rules, i.e. one that does not exist in |
| 264 // the rules registry anymore. Effectively we only remove the second rule. | 280 // the rules registry anymore. Effectively we only remove the second rule. |
| 265 rules_to_remove.push_back(kRuleId2); | 281 rules_to_remove.push_back(kRuleId2); |
| 266 error = registry->RemoveRules(kExtensionId, rules_to_remove); | 282 error = registry->RemoveRules(kExtensionId, rules_to_remove); |
| 267 EXPECT_EQ("", error); | 283 EXPECT_EQ("", error); |
| 284 EXPECT_EQ(3, registry->num_clear_cache_calls()); |
| 268 | 285 |
| 269 // Verify that everything is gone. | 286 // Verify that everything is gone. |
| 270 registered_rules.clear(); | 287 registered_rules.clear(); |
| 271 registry->GetAllRules(kExtensionId, ®istered_rules); | 288 registry->GetAllRules(kExtensionId, ®istered_rules); |
| 272 EXPECT_EQ(0u, registered_rules.size()); | 289 EXPECT_EQ(0u, registered_rules.size()); |
| 273 | 290 |
| 274 EXPECT_TRUE(registry->IsEmpty()); | 291 EXPECT_TRUE(registry->IsEmpty()); |
| 275 } | 292 } |
| 276 | 293 |
| 277 TEST_F(WebRequestRulesRegistryTest, RemoveAllRulesImpl) { | 294 TEST_F(WebRequestRulesRegistryTest, RemoveAllRulesImpl) { |
| 278 scoped_refptr<WebRequestRulesRegistry> registry( | 295 scoped_refptr<TestWebRequestRulesRegistry> registry( |
| 279 new TestWebRequestRulesRegistry()); | 296 new TestWebRequestRulesRegistry()); |
| 280 std::string error; | 297 std::string error; |
| 281 | 298 |
| 282 // Setup RulesRegistry to contain two rules, one for each extension. | 299 // Setup RulesRegistry to contain two rules, one for each extension. |
| 283 std::vector<linked_ptr<RulesRegistry::Rule> > rules_to_add(1); | 300 std::vector<linked_ptr<RulesRegistry::Rule> > rules_to_add(1); |
| 284 rules_to_add[0] = CreateRule1(); | 301 rules_to_add[0] = CreateRule1(); |
| 285 error = registry->AddRules(kExtensionId, rules_to_add); | 302 error = registry->AddRules(kExtensionId, rules_to_add); |
| 286 EXPECT_EQ("", error); | 303 EXPECT_EQ("", error); |
| 304 EXPECT_EQ(1, registry->num_clear_cache_calls()); |
| 287 | 305 |
| 288 rules_to_add[0] = CreateRule2(); | 306 rules_to_add[0] = CreateRule2(); |
| 289 error = registry->AddRules(kExtensionId2, rules_to_add); | 307 error = registry->AddRules(kExtensionId2, rules_to_add); |
| 290 EXPECT_EQ("", error); | 308 EXPECT_EQ("", error); |
| 309 EXPECT_EQ(2, registry->num_clear_cache_calls()); |
| 291 | 310 |
| 292 // Verify initial state. | 311 // Verify initial state. |
| 293 std::vector<linked_ptr<RulesRegistry::Rule> > registered_rules; | 312 std::vector<linked_ptr<RulesRegistry::Rule> > registered_rules; |
| 294 registry->GetAllRules(kExtensionId, ®istered_rules); | 313 registry->GetAllRules(kExtensionId, ®istered_rules); |
| 295 EXPECT_EQ(1u, registered_rules.size()); | 314 EXPECT_EQ(1u, registered_rules.size()); |
| 296 registered_rules.clear(); | 315 registered_rules.clear(); |
| 297 registry->GetAllRules(kExtensionId2, ®istered_rules); | 316 registry->GetAllRules(kExtensionId2, ®istered_rules); |
| 298 EXPECT_EQ(1u, registered_rules.size()); | 317 EXPECT_EQ(1u, registered_rules.size()); |
| 299 | 318 |
| 300 // Remove rule of first extension. | 319 // Remove rule of first extension. |
| 301 error = registry->RemoveAllRules(kExtensionId); | 320 error = registry->RemoveAllRules(kExtensionId); |
| 302 EXPECT_EQ("", error); | 321 EXPECT_EQ("", error); |
| 322 EXPECT_EQ(3, registry->num_clear_cache_calls()); |
| 303 | 323 |
| 304 // Verify that only the first rule is deleted. | 324 // Verify that only the first rule is deleted. |
| 305 registered_rules.clear(); | 325 registered_rules.clear(); |
| 306 registry->GetAllRules(kExtensionId, ®istered_rules); | 326 registry->GetAllRules(kExtensionId, ®istered_rules); |
| 307 EXPECT_EQ(0u, registered_rules.size()); | 327 EXPECT_EQ(0u, registered_rules.size()); |
| 308 registered_rules.clear(); | 328 registered_rules.clear(); |
| 309 registry->GetAllRules(kExtensionId2, ®istered_rules); | 329 registry->GetAllRules(kExtensionId2, ®istered_rules); |
| 310 EXPECT_EQ(1u, registered_rules.size()); | 330 EXPECT_EQ(1u, registered_rules.size()); |
| 311 | 331 |
| 312 // Test removing rules if none exist. | 332 // Test removing rules if none exist. |
| 313 error = registry->RemoveAllRules(kExtensionId); | 333 error = registry->RemoveAllRules(kExtensionId); |
| 314 EXPECT_EQ("", error); | 334 EXPECT_EQ("", error); |
| 335 EXPECT_EQ(4, registry->num_clear_cache_calls()); |
| 315 | 336 |
| 316 // Remove rule from second extension. | 337 // Remove rule from second extension. |
| 317 error = registry->RemoveAllRules(kExtensionId2); | 338 error = registry->RemoveAllRules(kExtensionId2); |
| 318 EXPECT_EQ("", error); | 339 EXPECT_EQ("", error); |
| 340 EXPECT_EQ(5, registry->num_clear_cache_calls()); |
| 319 | 341 |
| 320 EXPECT_TRUE(registry->IsEmpty()); | 342 EXPECT_TRUE(registry->IsEmpty()); |
| 321 } | 343 } |
| 322 | 344 |
| 323 // Test precedences between extensions. | 345 // Test precedences between extensions. |
| 324 TEST_F(WebRequestRulesRegistryTest, Precedences) { | 346 TEST_F(WebRequestRulesRegistryTest, Precedences) { |
| 325 scoped_refptr<WebRequestRulesRegistry> registry( | 347 scoped_refptr<WebRequestRulesRegistry> registry( |
| 326 new TestWebRequestRulesRegistry()); | 348 new TestWebRequestRulesRegistry()); |
| 327 std::string error; | 349 std::string error; |
| 328 | 350 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 398 // The redirect by the first extension is ignored due to the ignore rule. | 420 // The redirect by the first extension is ignored due to the ignore rule. |
| 399 ASSERT_EQ(1u, deltas.size()); | 421 ASSERT_EQ(1u, deltas.size()); |
| 400 LinkedPtrEventResponseDelta effective_rule = *(deltas.begin()); | 422 LinkedPtrEventResponseDelta effective_rule = *(deltas.begin()); |
| 401 | 423 |
| 402 EXPECT_EQ(kExtensionId2, effective_rule->extension_id); | 424 EXPECT_EQ(kExtensionId2, effective_rule->extension_id); |
| 403 EXPECT_EQ(base::Time() + base::TimeDelta::FromDays(2), | 425 EXPECT_EQ(base::Time() + base::TimeDelta::FromDays(2), |
| 404 effective_rule->extension_install_time); | 426 effective_rule->extension_install_time); |
| 405 EXPECT_EQ(GURL("http://www.bar.com"), effective_rule->new_url); | 427 EXPECT_EQ(GURL("http://www.bar.com"), effective_rule->new_url); |
| 406 } | 428 } |
| 407 } // namespace extensions | 429 } // namespace extensions |
| OLD | NEW |