content_rules_registry.h revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_CONTENT_CONTENT_RULES_REGISTRY_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_CONTENT_CONTENT_RULES_REGISTRY_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/linked_ptr.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/declarative/declarative_rule.h" 180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/extensions/api/declarative/rules_registry.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/declarative_content/content_action.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/declarative_content/content_condition.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_info_map.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_observer.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_registrar.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/matcher/url_matcher.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Profile; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContentPermissions; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RenderProcessHost; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebContents; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct FrameNavigateParams; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct LoadCommittedDetails; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extension_web_request_api_helpers { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct EventResponseDelta; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net { 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLRequest; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RulesRegistryService; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef DeclarativeRule<ContentCondition, ContentAction> ContentRule; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The ContentRulesRegistry is responsible for managing 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the internal representation of rules for the Declarative Content API. 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Here is the high level overview of this functionality: 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RulesRegistry::Rule consists of Conditions and Actions, these are 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// represented as a ContentRule with ContentConditions and 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ContentRuleActions. 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The evaluation of URL related condition attributes (host_suffix, path_prefix) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is delegated to a URLMatcher, because this is capable of evaluating many 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of such URL related condition attributes in parallel. 620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)class ContentRulesRegistry : public RulesRegistry, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public content::NotificationObserver { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // For testing, |ui_part| can be NULL. In that case it constructs the 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // registry with storage functionality suspended. 670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ContentRulesRegistry(Profile* profile, RulesCacheDelegate* cache_delegate); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Applies all content rules given an update (CSS match change or 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // page navigation, for now) from the renderer. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Apply(content::WebContents* contents, 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& matching_css_selectors); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Applies all content rules given that a tab was just navigated. 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DidNavigateMainFrame(content::WebContents* tab, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::LoadCommittedDetails& details, 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::FrameNavigateParams& params); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Implementation of RulesRegistry: 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual std::string AddRulesImpl( 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id, 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<linked_ptr<RulesRegistry::Rule> >& rules) OVERRIDE; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual std::string RemoveRulesImpl( 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id, 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& rule_identifiers) OVERRIDE; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual std::string RemoveAllRulesImpl( 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id) OVERRIDE; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // content::NotificationObserver implementation. 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Observe(int type, 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationSource& source, 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true if this object retains no allocated data. Only for debugging. 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsEmpty() const; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ContentRulesRegistry(); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Virtual for testing: 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual base::Time GetExtensionInstallationTime( 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id) const; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class DeclarativeContentRulesRegistryTest; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<ContentRule*> 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetMatches(const RendererContentMatchData& renderer_data) const; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Scans the rules for the set of conditions they're watching. If the set has 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // changed, calls InstructRenderProcess() for each RenderProcessHost in the 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // current profile. 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateConditionCache(); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Tells a renderer what page attributes to watch for using an 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ExtensionMsg_WatchPages. 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void InstructRenderProcess(content::RenderProcessHost* process); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::map<URLMatcherConditionSet::ID, ContentRule*> URLMatcherIdToRule; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::map<ContentRule::GlobalRuleId, linked_ptr<ContentRule> > 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RulesMap; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Map that tells us which ContentRules may match under the condition that 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the URLMatcherConditionSet::ID was returned by the |url_matcher_|. 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLMatcherIdToRule match_id_to_rule_; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RulesMap content_rules_; 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Maps tab_id to the set of rules that match on that tab. This 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // lets us call Revert as appropriate. 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<int, std::set<ContentRule*> > active_rules_; 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Matches URLs for the page_url condition. 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLMatcher url_matcher_; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All CSS selectors any rule's conditions watch for. 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> watched_css_selectors_; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Manages our notification registrations. 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationRegistrar registrar_; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ExtensionInfoMap> extension_info_map_; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ContentRulesRegistry); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_CONTENT_CONTENT_RULES_REGISTRY_H_ 150