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"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/url_matcher/url_matcher.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_observer.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_registrar.h"
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/info_map.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)
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef std::map<url_matcher::URLMatcherConditionSet::ID, ContentRule*>
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      URLMatcherIdToRule;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::map<ContentRule::GlobalRuleId, linked_ptr<ContentRule> >
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RulesMap;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Map that tells us which ContentRules may match under the condition that
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the URLMatcherConditionSet::ID was returned by the |url_matcher_|.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLMatcherIdToRule match_id_to_rule_;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RulesMap content_rules_;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Maps tab_id to the set of rules that match on that tab.  This
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // lets us call Revert as appropriate.
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<int, std::set<ContentRule*> > active_rules_;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Matches URLs for the page_url condition.
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  url_matcher::URLMatcher url_matcher_;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All CSS selectors any rule's conditions watch for.
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string> watched_css_selectors_;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Manages our notification registrations.
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::NotificationRegistrar registrar_;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<InfoMap> extension_info_map_;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ContentRulesRegistry);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_CONTENT_CONTENT_RULES_REGISTRY_H_
151