1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.h" 6 7#include <string> 8 9#include "base/test/values_test_util.h" 10#include "chrome/browser/extensions/extension_tab_util.h" 11#include "chrome/browser/extensions/test_extension_environment.h" 12#include "chrome/test/base/testing_profile.h" 13#include "content/public/browser/navigation_details.h" 14#include "content/public/browser/web_contents.h" 15#include "content/public/common/frame_navigate_params.h" 16#include "testing/gmock/include/gmock/gmock.h" 17#include "testing/gtest/include/gtest/gtest.h" 18 19namespace extensions { 20 21using base::test::ParseJson; 22using testing::HasSubstr; 23using content::WebContents; 24 25// Must be outside the anonymous namespace to be a friend of 26// ContentRulesRegistry. 27class DeclarativeChromeContentRulesRegistryTest : public testing::Test { 28 protected: 29 static const std::map<int, std::set<ContentRule*> >& active_rules( 30 const ChromeContentRulesRegistry& registry) { 31 return registry.active_rules_; 32 } 33}; 34 35namespace { 36 37TEST_F(DeclarativeChromeContentRulesRegistryTest, ActiveRulesDoesntGrow) { 38 TestExtensionEnvironment env; 39 40 scoped_refptr<ChromeContentRulesRegistry> registry( 41 new ChromeContentRulesRegistry(env.profile(), NULL)); 42 43 EXPECT_EQ(0u, active_rules(*registry.get()).size()); 44 45 content::LoadCommittedDetails load_details; 46 content::FrameNavigateParams navigate_params; 47 scoped_ptr<WebContents> tab = env.MakeTab(); 48 registry->DidNavigateMainFrame(tab.get(), load_details, navigate_params); 49 EXPECT_EQ(0u, active_rules(*registry.get()).size()); 50 51 // Add a rule. 52 linked_ptr<RulesRegistry::Rule> rule(new RulesRegistry::Rule); 53 RulesRegistry::Rule::Populate( 54 *ParseJson( 55 "{\n" 56 " \"id\": \"rule1\",\n" 57 " \"priority\": 100,\n" 58 " \"conditions\": [\n" 59 " {\n" 60 " \"instanceType\": \"declarativeContent.PageStateMatcher\",\n" 61 " \"css\": [\"input\"]\n" 62 " }],\n" 63 " \"actions\": [\n" 64 " { \"instanceType\": \"declarativeContent.ShowPageAction\" }\n" 65 " ]\n" 66 "}"), 67 rule.get()); 68 std::vector<linked_ptr<RulesRegistry::Rule> > rules; 69 rules.push_back(rule); 70 71 const Extension* extension = env.MakeExtension(*ParseJson( 72 "{\"page_action\": {}}")); 73 registry->AddRulesImpl(extension->id(), rules); 74 75 registry->DidNavigateMainFrame(tab.get(), load_details, navigate_params); 76 EXPECT_EQ(0u, active_rules(*registry.get()).size()); 77 78 std::vector<std::string> css_selectors; 79 css_selectors.push_back("input"); 80 registry->Apply(tab.get(), css_selectors); 81 EXPECT_EQ(1u, active_rules(*registry.get()).size()); 82 83 // Closing the tab should erase its entry from active_rules_. 84 tab.reset(); 85 EXPECT_EQ(0u, active_rules(*registry.get()).size()); 86 87 tab = env.MakeTab(); 88 registry->Apply(tab.get(), css_selectors); 89 EXPECT_EQ(1u, active_rules(*registry.get()).size()); 90 // Navigating the tab should erase its entry from active_rules_ if 91 // it no longer matches. 92 registry->DidNavigateMainFrame(tab.get(), load_details, navigate_params); 93 EXPECT_EQ(0u, active_rules(*registry.get()).size()); 94} 95 96} // namespace 97} // namespace extensions 98