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, &registered_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, &registered_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, &registered_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, &registered_rules);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, registered_rules.size());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registered_rules.clear();
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry->GetAllRules(kExtensionId2, &registered_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, &registered_rules);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, registered_rules.size());
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registered_rules.clear();
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry->GetAllRules(kExtensionId2, &registered_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