webrequest_rules_registry_unittest.cc revision 3551c9c881056c480085172ff9840cab31610854
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/json/json_reader.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h" 139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/test/values_test_util.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/extension_test_util.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/matcher/url_matcher_constants.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest-message.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExtensionId[] = "ext1"; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExtensionId2[] = "ext2"; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kRuleId1[] = "rule1"; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kRuleId2[] = "rule2"; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kRuleId3[] = "rule3"; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kRuleId4[] = "rule4"; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using extension_test_util::LoadManifest; 37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using extension_test_util::LoadManifestUnchecked; 38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::Value; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::HasSubstr; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace helpers = extension_web_request_api_helpers; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace keys = declarative_webrequest_constants; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace keys2 = url_matcher_constants; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestWebRequestRulesRegistry : public WebRequestRulesRegistry { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit TestWebRequestRulesRegistry( 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ExtensionInfoMap> extension_info_map) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : WebRequestRulesRegistry(NULL /*profile*/, NULL /*ui_part*/), 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_clear_cache_calls_(0) { 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetExtensionInfoMapForTesting(extension_info_map); 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns how often the in-memory caches of the renderers were instructed 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to be cleared. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_clear_cache_calls() const { return num_clear_cache_calls_; } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // How many rules are there which have some conditions not triggered by URL 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // matches. 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t RulesWithoutTriggers() const { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rules_with_untriggered_conditions_for_test().size(); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestWebRequestRulesRegistry() {} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ClearCacheOnNavigation() OVERRIDE { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++num_clear_cache_calls_; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_clear_cache_calls_; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebRequestRulesRegistryTest : public testing::Test { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebRequestRulesRegistryTest() 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : message_loop_(base::MessageLoop::TYPE_IO), 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ui_(content::BrowserThread::UI, &message_loop_), 83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) io_(content::BrowserThread::IO, &message_loop_) {} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WebRequestRulesRegistryTest() {} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUp() OVERRIDE; 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that deletion traits of all registries are executed. 91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) message_loop_.RunUntilIdle(); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a rule that roughly matches http://*.example.com and 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // https://www.example.com and cancels it 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<RulesRegistry::Rule> CreateRule1() { 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::ListValue* scheme_http = new base::ListValue(); 983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scheme_http->Append(new base::StringValue("http")); 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue* http_condition_dict = new base::DictionaryValue(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_condition_dict->Set(keys2::kSchemesKey, scheme_http); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_condition_dict->SetString(keys2::kHostSuffixKey, "example.com"); 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue http_condition_url_filter; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_condition_url_filter.Set(keys::kUrlKey, http_condition_dict); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_condition_url_filter.SetString(keys::kInstanceTypeKey, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keys::kRequestMatcherType); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::ListValue* scheme_https = new base::ListValue(); 1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scheme_http->Append(new base::StringValue("https")); 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue* https_condition_dict = new base::DictionaryValue(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) https_condition_dict->Set(keys2::kSchemesKey, scheme_https); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) https_condition_dict->SetString(keys2::kHostSuffixKey, "example.com"); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) https_condition_dict->SetString(keys2::kHostPrefixKey, "www"); 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue https_condition_url_filter; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) https_condition_url_filter.Set(keys::kUrlKey, https_condition_dict); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) https_condition_url_filter.SetString(keys::kInstanceTypeKey, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keys::kRequestMatcherType); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue action_dict; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rule->id.reset(new std::string(kRuleId1)); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rule->priority.reset(new int(100)); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rule->actions.push_back(linked_ptr<base::Value>(action_dict.DeepCopy())); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rule->conditions.push_back( 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) linked_ptr<base::Value>(http_condition_url_filter.DeepCopy())); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rule->conditions.push_back( 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) linked_ptr<base::Value>(https_condition_url_filter.DeepCopy())); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rule; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a rule that matches anything and cancels it. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<RulesRegistry::Rule> CreateRule2() { 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue condition_dict; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) condition_dict.SetString(keys::kInstanceTypeKey, keys::kRequestMatcherType); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue action_dict; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rule->id.reset(new std::string(kRuleId2)); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rule->priority.reset(new int(100)); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rule->actions.push_back(linked_ptr<base::Value>(action_dict.DeepCopy())); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rule->conditions.push_back( 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) linked_ptr<base::Value>(condition_dict.DeepCopy())); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rule; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<RulesRegistry::Rule> CreateRedirectRule( 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& destination) { 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue condition_dict; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) condition_dict.SetString(keys::kInstanceTypeKey, keys::kRequestMatcherType); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue action_dict; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action_dict.SetString(keys::kInstanceTypeKey, keys::kRedirectRequestType); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action_dict.SetString(keys::kRedirectUrlKey, destination); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rule->id.reset(new std::string(kRuleId3)); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rule->priority.reset(new int(100)); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rule->actions.push_back(linked_ptr<base::Value>(action_dict.DeepCopy())); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rule->conditions.push_back( 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) linked_ptr<base::Value>(condition_dict.DeepCopy())); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rule; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a rule to ignore all other rules for a destination that 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // contains index.html. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<RulesRegistry::Rule> CreateIgnoreRule() { 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue condition_dict; 171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue* http_condition_dict = new base::DictionaryValue(); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_condition_dict->SetString(keys2::kPathContainsKey, "index.html"); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) condition_dict.SetString(keys::kInstanceTypeKey, keys::kRequestMatcherType); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) condition_dict.Set(keys::kUrlKey, http_condition_dict); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue action_dict; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action_dict.SetString(keys::kInstanceTypeKey, keys::kIgnoreRulesType); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action_dict.SetInteger(keys::kLowerPriorityThanKey, 150); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rule->id.reset(new std::string(kRuleId4)); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rule->priority.reset(new int(200)); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rule->actions.push_back(linked_ptr<base::Value>(action_dict.DeepCopy())); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rule->conditions.push_back( 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) linked_ptr<base::Value>(condition_dict.DeepCopy())); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rule; 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a condition with the attributes specified. An example value of 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |attributes| is: "\"resourceType\": [\"stylesheet\"], \n". 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) linked_ptr<base::Value> CreateCondition(const std::string& attributes) { 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string json_description = 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "{ \n" 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"instanceType\": \"declarativeWebRequest.RequestMatcher\", \n"; 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) json_description += attributes; 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) json_description += "}"; 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return linked_ptr<base::Value>( 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::test::ParseJson(json_description).release()); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a rule with the ID |rule_id| and with conditions created from the 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |attributes| specified (one entry one condition). An example value of a 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // string from |attributes| is: "\"resourceType\": [\"stylesheet\"], \n". 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) linked_ptr<RulesRegistry::Rule> CreateCancellingRule( 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* rule_id, 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<const std::string*>& attributes) { 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue action_dict; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) action_dict.SetString(keys::kInstanceTypeKey, keys::kCancelRequestType); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rule->id.reset(new std::string(rule_id)); 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rule->priority.reset(new int(1)); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rule->actions.push_back(linked_ptr<base::Value>(action_dict.DeepCopy())); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::vector<const std::string*>::const_iterator it = 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attributes.begin(); 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != attributes.end(); ++it) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rule->conditions.push_back(CreateCondition(**it)); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rule; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop message_loop_; 224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::TestBrowserThread ui_; 225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::TestBrowserThread io_; 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Two extensions with host permissions for all URLs and the DWR permission. 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Installation times will be so that |extension_| is older than 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |extension2_|. 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> extension_; 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> extension2_; 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<ExtensionInfoMap> extension_info_map_; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebRequestRulesRegistryTest::SetUp() { 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) testing::Test::SetUp(); 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error; 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_ = LoadManifestUnchecked("permissions", 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "web_request_all_host_permissions.json", 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Manifest::INVALID_LOCATION, 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Extension::NO_FLAGS, 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kExtensionId, 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &error); 244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(extension_.get()) << error; 245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) extension2_ = LoadManifestUnchecked("permissions", 246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "web_request_all_host_permissions.json", 247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Manifest::INVALID_LOCATION, 248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Extension::NO_FLAGS, 249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) kExtensionId2, 250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &error); 251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(extension2_.get()) << error; 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_info_map_ = new ExtensionInfoMap; 253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(extension_info_map_.get()); 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_info_map_->AddExtension(extension_.get(), 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time() + base::TimeDelta::FromDays(1), 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false /*incognito_enabled*/); 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_info_map_->AddExtension(extension2_.get(), 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time() + base::TimeDelta::FromDays(2), 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false /*incognito_enabled*/); 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebRequestRulesRegistryTest, AddRulesImpl) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<TestWebRequestRulesRegistry> registry( 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new TestWebRequestRulesRegistry(extension_info_map_)); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<RulesRegistry::Rule> > rules; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.push_back(CreateRule1()); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.push_back(CreateRule2()); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = registry->AddRules(kExtensionId, rules); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", error); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, registry->num_clear_cache_calls()); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<const WebRequestRule*> matches; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL http_url("http://www.example.com"); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLRequestContext context; 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLRequest http_request(http_url, NULL, &context, NULL); 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRequestData request_data(&http_request, ON_BEFORE_REQUEST); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matches = registry->GetMatches(request_data); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, matches.size()); 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<WebRequestRule::GlobalRuleId> matches_ids; 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::set<const WebRequestRule*>::const_iterator it = matches.begin(); 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != matches.end(); ++it) 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matches_ids.insert((*it)->id()); 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(ContainsKey(matches_ids, std::make_pair(kExtensionId, kRuleId1))); 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(ContainsKey(matches_ids, std::make_pair(kExtensionId, kRuleId2))); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL foobar_url("http://www.foobar.com"); 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLRequest foobar_request(foobar_url, NULL, &context, NULL); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_data.request = &foobar_request; 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matches = registry->GetMatches(request_data); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, matches.size()); 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRequestRule::GlobalRuleId expected_pair = 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(kExtensionId, kRuleId2); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_pair, (*matches.begin())->id()); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebRequestRulesRegistryTest, RemoveRulesImpl) { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<TestWebRequestRulesRegistry> registry( 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new TestWebRequestRulesRegistry(extension_info_map_)); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup RulesRegistry to contain two rules. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<RulesRegistry::Rule> > rules_to_add; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules_to_add.push_back(CreateRule1()); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules_to_add.push_back(CreateRule2()); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = registry->AddRules(kExtensionId, rules_to_add); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", error); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, registry->num_clear_cache_calls()); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify initial state. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<RulesRegistry::Rule> > registered_rules; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry->GetAllRules(kExtensionId, ®istered_rules); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, registered_rules.size()); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, registry->RulesWithoutTriggers()); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove first rule. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> rules_to_remove; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules_to_remove.push_back(kRuleId1); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = registry->RemoveRules(kExtensionId, rules_to_remove); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", error); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, registry->num_clear_cache_calls()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that only one rule is left. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registered_rules.clear(); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry->GetAllRules(kExtensionId, ®istered_rules); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, registered_rules.size()); 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, registry->RulesWithoutTriggers()); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now rules_to_remove contains both rules, i.e. one that does not exist in 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the rules registry anymore. Effectively we only remove the second rule. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules_to_remove.push_back(kRuleId2); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = registry->RemoveRules(kExtensionId, rules_to_remove); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", error); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, registry->num_clear_cache_calls()); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that everything is gone. 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registered_rules.clear(); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry->GetAllRules(kExtensionId, ®istered_rules); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, registered_rules.size()); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, registry->RulesWithoutTriggers()); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(registry->IsEmpty()); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebRequestRulesRegistryTest, RemoveAllRulesImpl) { 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<TestWebRequestRulesRegistry> registry( 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new TestWebRequestRulesRegistry(extension_info_map_)); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup RulesRegistry to contain two rules, one for each extension. 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<RulesRegistry::Rule> > rules_to_add(1); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules_to_add[0] = CreateRule1(); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = registry->AddRules(kExtensionId, rules_to_add); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", error); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, registry->num_clear_cache_calls()); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules_to_add[0] = CreateRule2(); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = registry->AddRules(kExtensionId2, rules_to_add); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", error); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, registry->num_clear_cache_calls()); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify initial state. 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<RulesRegistry::Rule> > registered_rules; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry->GetAllRules(kExtensionId, ®istered_rules); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, registered_rules.size()); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registered_rules.clear(); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry->GetAllRules(kExtensionId2, ®istered_rules); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, registered_rules.size()); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove rule of first extension. 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = registry->RemoveAllRules(kExtensionId); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", error); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, registry->num_clear_cache_calls()); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that only the first rule is deleted. 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registered_rules.clear(); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry->GetAllRules(kExtensionId, ®istered_rules); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, registered_rules.size()); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registered_rules.clear(); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registry->GetAllRules(kExtensionId2, ®istered_rules); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, registered_rules.size()); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test removing rules if none exist. 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = registry->RemoveAllRules(kExtensionId); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", error); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, registry->num_clear_cache_calls()); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove rule from second extension. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = registry->RemoveAllRules(kExtensionId2); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", error); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, registry->num_clear_cache_calls()); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(registry->IsEmpty()); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test precedences between extensions. 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebRequestRulesRegistryTest, Precedences) { 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<WebRequestRulesRegistry> registry( 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new TestWebRequestRulesRegistry(extension_info_map_)); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<RulesRegistry::Rule> > rules_to_add_1(1); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules_to_add_1[0] = CreateRedirectRule("http://www.foo.com"); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = registry->AddRules(kExtensionId, rules_to_add_1); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", error); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<RulesRegistry::Rule> > rules_to_add_2(1); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules_to_add_2[0] = CreateRedirectRule("http://www.bar.com"); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = registry->AddRules(kExtensionId2, rules_to_add_2); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", error); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com"); 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLRequestContext context; 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLRequest request(url, NULL, &context, NULL); 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRequestData request_data(&request, ON_BEFORE_REQUEST); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<LinkedPtrEventResponseDelta> deltas = 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->CreateDeltas(NULL, request_data, false); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The second extension is installed later and will win for this reason 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in conflict resolution. 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, deltas.size()); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deltas.sort(&helpers::InDecreasingExtensionInstallationTimeOrder); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<LinkedPtrEventResponseDelta>::iterator i = deltas.begin(); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LinkedPtrEventResponseDelta winner = *i++; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LinkedPtrEventResponseDelta loser = *i; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kExtensionId2, winner->extension_id); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::Time() + base::TimeDelta::FromDays(2), 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) winner->extension_install_time); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://www.bar.com"), winner->new_url); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kExtensionId, loser->extension_id); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::Time() + base::TimeDelta::FromDays(1), 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loser->extension_install_time); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://www.foo.com"), loser->new_url); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test priorities of rules within one extension. 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebRequestRulesRegistryTest, Priorities) { 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<WebRequestRulesRegistry> registry( 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new TestWebRequestRulesRegistry(extension_info_map_)); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<RulesRegistry::Rule> > rules_to_add_1(1); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules_to_add_1[0] = CreateRedirectRule("http://www.foo.com"); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = registry->AddRules(kExtensionId, rules_to_add_1); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", error); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<RulesRegistry::Rule> > rules_to_add_2(1); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules_to_add_2[0] = CreateRedirectRule("http://www.bar.com"); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = registry->AddRules(kExtensionId2, rules_to_add_2); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", error); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<RulesRegistry::Rule> > rules_to_add_3(1); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules_to_add_3[0] = CreateIgnoreRule(); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = registry->AddRules(kExtensionId, rules_to_add_3); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", error); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com/index.html"); 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLRequestContext context; 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLRequest request(url, NULL, &context, NULL); 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRequestData request_data(&request, ON_BEFORE_REQUEST); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<LinkedPtrEventResponseDelta> deltas = 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->CreateDeltas(NULL, request_data, false); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The redirect by the first extension is ignored due to the ignore rule. 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, deltas.size()); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LinkedPtrEventResponseDelta effective_rule = *(deltas.begin()); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kExtensionId2, effective_rule->extension_id); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::Time() + base::TimeDelta::FromDays(2), 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effective_rule->extension_install_time); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://www.bar.com"), effective_rule->new_url); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test ignoring of rules by tag. 483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(WebRequestRulesRegistryTest, IgnoreRulesByTag) { 484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char kRule1[] = 485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "{ \n" 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"id\": \"rule1\", \n" 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"tags\": [\"non_matching_tag\", \"ignore_tag\"], \n" 488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"conditions\": [ \n" 489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " { \n" 490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"instanceType\": \"declarativeWebRequest.RequestMatcher\", \n" 491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": {\"hostSuffix\": \"foo.com\"} \n" 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " } \n" 493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " ], \n" 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"actions\": [ \n" 495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " { \n" 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"instanceType\": \"declarativeWebRequest.RedirectRequest\",\n" 497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"redirectUrl\": \"http://bar.com\" \n" 498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " } \n" 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " ], \n" 500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"priority\": 200 \n" 501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "} "; 502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char kRule2[] = 504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "{ \n" 505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"id\": \"rule2\", \n" 506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"conditions\": [ \n" 507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " { \n" 508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"instanceType\": \"declarativeWebRequest.RequestMatcher\", \n" 509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": {\"pathPrefix\": \"/test\"} \n" 510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " } \n" 511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " ], \n" 512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"actions\": [ \n" 513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " { \n" 514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"instanceType\": \"declarativeWebRequest.IgnoreRules\", \n" 515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"hasTag\": \"ignore_tag\" \n" 516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " } \n" 517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " ], \n" 518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"priority\": 300 \n" 519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "} "; 520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<Value> value1(base::JSONReader::Read(kRule1)); 522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(value1.get()); 523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<Value> value2(base::JSONReader::Read(kRule2)); 524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(value2.get()); 525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<linked_ptr<RulesRegistry::Rule> > rules; 527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) rules.push_back(make_linked_ptr(new RulesRegistry::Rule)); 528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) rules.push_back(make_linked_ptr(new RulesRegistry::Rule)); 529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(RulesRegistry::Rule::Populate(*value1, rules[0].get())); 530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(RulesRegistry::Rule::Populate(*value2, rules[1].get())); 531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<WebRequestRulesRegistry> registry( 533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new TestWebRequestRulesRegistry(extension_info_map_)); 534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error = registry->AddRulesImpl(kExtensionId, rules); 535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("", error); 536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(registry->IsEmpty()); 537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL url("http://www.foo.com/test"); 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestURLRequestContext context; 540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestURLRequest request(url, NULL, &context, NULL); 541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebRequestData request_data(&request, ON_BEFORE_REQUEST); 542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::list<LinkedPtrEventResponseDelta> deltas = 543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->CreateDeltas(NULL, request_data, false); 544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The redirect by the redirect rule is ignored due to the ignore rule. 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<const WebRequestRule*> matches = registry->GetMatches(request_data); 547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, matches.size()); 548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(0u, deltas.size()); 549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that rules failing IsFulfilled on their conditions are never returned by 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// GetMatches. 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WebRequestRulesRegistryTest, GetMatchesCheckFulfilled) { 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TestWebRequestRulesRegistry> registry( 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new TestWebRequestRulesRegistry(extension_info_map_)); 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string kMatchingUrlAttribute( 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "\"url\": { \"pathContains\": \"\" }, \n"); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string kNonMatchingNonUrlAttribute( 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "\"resourceType\": [\"stylesheet\"], \n"); 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string kBothAttributes(kMatchingUrlAttribute + 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kNonMatchingNonUrlAttribute); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<const std::string*> attributes; 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<linked_ptr<RulesRegistry::Rule> > rules; 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Rules 1 and 2 have one condition, neither of them should fire. 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attributes.push_back(&kNonMatchingNonUrlAttribute); 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rules.push_back(CreateCancellingRule(kRuleId1, attributes)); 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attributes.clear(); 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attributes.push_back(&kBothAttributes); 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rules.push_back(CreateCancellingRule(kRuleId2, attributes)); 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Rule 3 has two conditions, one with a matching URL attribute, and one 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // with a non-matching non-URL attribute. 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attributes.clear(); 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attributes.push_back(&kMatchingUrlAttribute); 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attributes.push_back(&kNonMatchingNonUrlAttribute); 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rules.push_back(CreateCancellingRule(kRuleId3, attributes)); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error = registry->AddRules(kExtensionId, rules); 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, registry->num_clear_cache_calls()); 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<const WebRequestRule*> matches; 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL http_url("http://www.example.com"); 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLRequestContext context; 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLRequest http_request(http_url, NULL, &context, NULL); 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRequestData request_data(&http_request, ON_BEFORE_REQUEST); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matches = registry->GetMatches(request_data); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, matches.size()); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRequestRule::GlobalRuleId expected_pair = std::make_pair(kExtensionId, 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kRuleId3); 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_pair, (*matches.begin())->id()); 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that the url and firstPartyForCookiesUrl attributes are evaluated 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// against corresponding URLs. Tested on requests where these URLs actually 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// differ. 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WebRequestRulesRegistryTest, GetMatchesDifferentUrls) { 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TestWebRequestRulesRegistry> registry( 603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new TestWebRequestRulesRegistry(extension_info_map_)); 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string kUrlAttribute( 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "\"url\": { \"hostContains\": \"url\" }, \n"); 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string kFirstPartyUrlAttribute( 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "\"firstPartyForCookiesUrl\": { \"hostContains\": \"fpfc\" }, \n"); 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<const std::string*> attributes; 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<linked_ptr<RulesRegistry::Rule> > rules; 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Rule 1 has one condition, with a url attribute 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attributes.push_back(&kUrlAttribute); 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rules.push_back(CreateCancellingRule(kRuleId1, attributes)); 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Rule 2 has one condition, with a firstPartyForCookiesUrl attribute 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attributes.clear(); 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attributes.push_back(&kFirstPartyUrlAttribute); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rules.push_back(CreateCancellingRule(kRuleId2, attributes)); 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error = registry->AddRules(kExtensionId, rules); 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", error); 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, registry->num_clear_cache_calls()); 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<const WebRequestRule*> matches; 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL urls[] = { 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://url.example.com"), // matching 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://www.example.com") // non-matching 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL firstPartyUrls[] = { 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://www.example.com"), // non-matching 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://fpfc.example.com") // matching 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Which rules should match in subsequent test iterations. 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* matchingRuleIds[] = { kRuleId1, kRuleId2 }; 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COMPILE_ASSERT(arraysize(urls) == arraysize(firstPartyUrls), 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) urls_and_firstPartyUrls_need_to_have_the_same_size); 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) COMPILE_ASSERT(arraysize(urls) == arraysize(matchingRuleIds), 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) urls_and_matchingRuleIds_need_to_have_the_same_size); 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLRequestContext context; 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < arraysize(matchingRuleIds); ++i) { 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Construct the inputs. 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::TestURLRequest http_request(urls[i], NULL, &context, NULL); 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRequestData request_data(&http_request, ON_BEFORE_REQUEST); 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) http_request.set_first_party_for_cookies(firstPartyUrls[i]); 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now run both rules on the input. 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matches = registry->GetMatches(request_data); 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SCOPED_TRACE(testing::Message("i = ") << i << ", rule id = " 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << matchingRuleIds[i]); 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure that the right rule succeeded. 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, matches.size()); 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(WebRequestRule::GlobalRuleId(std::make_pair(kExtensionId, 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matchingRuleIds[i])), 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*matches.begin())->id()); 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(WebRequestRulesRegistrySimpleTest, StageChecker) { 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The contentType condition can only be evaluated during ON_HEADERS_RECEIVED 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // but the redirect action can only be executed during ON_BEFORE_REQUEST. 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Therefore, this is an inconsistent rule that needs to be flagged. 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kRule[] = 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "{ \n" 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"id\": \"rule1\", \n" 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"conditions\": [ \n" 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " { \n" 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"instanceType\": \"declarativeWebRequest.RequestMatcher\", \n" 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"url\": {\"hostSuffix\": \"foo.com\"}, \n" 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"contentType\": [\"image/jpeg\"] \n" 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " } \n" 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " ], \n" 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"actions\": [ \n" 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " { \n" 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"instanceType\": \"declarativeWebRequest.RedirectRequest\",\n" 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"redirectUrl\": \"http://bar.com\" \n" 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " } \n" 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " ], \n" 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " \"priority\": 200 \n" 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "} "; 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<Value> value(base::JSONReader::Read(kRule)); 684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(value); 685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RulesRegistry::Rule rule; 687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(RulesRegistry::Rule::Populate(*value, &rule)); 688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error; 690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLMatcher matcher; 691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<WebRequestConditionSet> conditions = 692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebRequestConditionSet::Create( 693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) matcher.condition_factory(), rule.conditions, &error); 694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(error.empty()) << error; 695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(conditions); 696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool bad_message = false; 698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<WebRequestActionSet> actions = 699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebRequestActionSet::Create(rule.actions, &error, &bad_message); 700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(error.empty()) << error; 701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(bad_message); 702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(actions); 703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(WebRequestRulesRegistry::StageChecker( 705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) conditions.get(), actions.get(), &error)); 706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_THAT(error, HasSubstr("no time in the request life-cycle")); 707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_THAT(error, HasSubstr(actions->actions().back()->GetName())); 708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(WebRequestRulesRegistrySimpleTest, HostPermissionsChecker) { 711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char kAction[] = // This action requires all URLs host permission. 712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "{ \n" 713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"instanceType\": \"declarativeWebRequest.RedirectRequest\",\n" 714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"redirectUrl\": \"http://bar.com\" \n" 715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "} "; 716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<Value> action_value(base::JSONReader::Read(kAction)); 717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(action_value); 718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebRequestActionSet::AnyVector actions; 720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) actions.push_back(linked_ptr<base::Value>(action_value.release())); 721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(actions.back().get()); 722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string error; 724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool bad_message = false; 725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<WebRequestActionSet> action_set( 726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebRequestActionSet::Create(actions, &error, &bad_message)); 727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(error.empty()) << error; 728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(bad_message); 729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(action_set); 730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> extension_no_url( 732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadManifest("permissions", "web_request_no_host.json")); 733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> extension_some_urls( 734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadManifest("permissions", "web_request_com_host_permissions.json")); 735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<Extension> extension_all_urls( 736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadManifest("permissions", "web_request_all_host_permissions.json")); 737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(WebRequestRulesRegistry::HostPermissionsChecker( 739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_all_urls.get(), action_set.get(), &error)); 740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(error.empty()) << error; 741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(WebRequestRulesRegistry::HostPermissionsChecker( 743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_some_urls.get(), action_set.get(), &error)); 744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_THAT(error, HasSubstr("permission for all")); 745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_THAT(error, HasSubstr(action_set->actions().back()->GetName())); 746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(WebRequestRulesRegistry::HostPermissionsChecker( 748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_no_url.get(), action_set.get(), &error)); 749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_THAT(error, HasSubstr("permission for all")); 750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_THAT(error, HasSubstr(action_set->actions().back()->GetName())); 751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(WebRequestRulesRegistryTest, CheckOriginAndPathRegEx) { 754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char kRule[] = 755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "{ \n" 756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"id\": \"rule1\", \n" 757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"conditions\": [ \n" 758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " { \n" 759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"instanceType\": \"declarativeWebRequest.RequestMatcher\", \n" 760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"url\": {\"originAndPathMatches\": \"fo+.com\"} \n" 761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " } \n" 762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " ], \n" 763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"actions\": [ \n" 764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " { \n" 765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"instanceType\": \"declarativeWebRequest.RedirectRequest\",\n" 766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"redirectUrl\": \"http://bar.com\" \n" 767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " } \n" 768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " ], \n" 769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " \"priority\": 200 \n" 770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "} "; 771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<Value> value(base::JSONReader::Read(kRule)); 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(value.get()); 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<linked_ptr<RulesRegistry::Rule> > rules; 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rules.push_back(make_linked_ptr(new RulesRegistry::Rule)); 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(RulesRegistry::Rule::Populate(*value, rules.back().get())); 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<WebRequestRulesRegistry> registry( 780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new TestWebRequestRulesRegistry(extension_info_map_)); 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLMatcher matcher; 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error = registry->AddRulesImpl(kExtensionId, rules); 784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("", error); 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestURLRequestContext context; 787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::list<LinkedPtrEventResponseDelta> deltas; 788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No match because match is in the query parameter. 790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL url1("http://bar.com/index.html?foo.com"); 791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestURLRequest request1(url1, NULL, &context, NULL); 792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebRequestData request_data1(&request1, ON_BEFORE_REQUEST); 793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) deltas = registry->CreateDeltas(NULL, request_data1, false); 794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0u, deltas.size()); 795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is a correct match. 797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL url2("http://foo.com/index.html"); 798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::TestURLRequest request2(url2, NULL, &context, NULL); 799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebRequestData request_data2(&request2, ON_BEFORE_REQUEST); 800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) deltas = registry->CreateDeltas(NULL, request_data2, false); 801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, deltas.size()); 802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 805