Index: chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.h |
diff --git a/chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.h b/chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.h |
index c6a9f45cdc2e244dba1f95d8d9269acdc622f227..316fc9e4c8ea227eb716fdaf80aefd02d6f62ec2 100644 |
--- a/chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.h |
+++ b/chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.h |
@@ -16,7 +16,6 @@ |
#include "base/time/time.h" |
#include "chrome/browser/extensions/api/declarative_content/content_action.h" |
#include "chrome/browser/extensions/api/declarative_content/content_condition.h" |
-#include "chrome/browser/extensions/api/declarative_content/declarative_content_css_condition_tracker.h" |
#include "components/url_matcher/url_matcher.h" |
#include "content/public/browser/notification_observer.h" |
#include "content/public/browser/notification_registrar.h" |
@@ -67,17 +66,20 @@ |
// side of split-mode extensions to incognito tabs. The non-incognito instance |
// handles incognito tabs for spanning-mode extensions, plus all non-incognito |
// tabs. |
-class ChromeContentRulesRegistry |
- : public ContentRulesRegistry, |
- public content::NotificationObserver, |
- public DeclarativeContentCssConditionTrackerDelegate { |
+class ChromeContentRulesRegistry : public ContentRulesRegistry, |
+ public content::NotificationObserver { |
public: |
// For testing, |ui_part| can be NULL. In that case it constructs the |
// registry with storage functionality suspended. |
ChromeContentRulesRegistry(content::BrowserContext* browser_context, |
RulesCacheDelegate* cache_delegate); |
- // ContentRulesRegistry: |
+ // ChromeContentRulesRegistry implementation: |
+ // Applies all content rules given an update (CSS match change or |
+ // page navigation, for now) from the renderer. |
+ void Apply(content::WebContents* contents, |
+ const std::vector<std::string>& matching_css_selectors) override; |
+ |
// Applies all content rules given that a tab was just navigated. |
void DidNavigateMainFrame( |
content::WebContents* tab, |
@@ -92,7 +94,7 @@ |
const content::LoadCommittedDetails& details, |
const content::FrameNavigateParams& params) override; |
- // RulesRegistry: |
+ // Implementation of RulesRegistry: |
std::string AddRulesImpl( |
const std::string& extension_id, |
const std::vector<linked_ptr<RulesRegistry::Rule>>& rules) override; |
@@ -101,30 +103,13 @@ |
const std::vector<std::string>& rule_identifiers) override; |
std::string RemoveAllRulesImpl(const std::string& extension_id) override; |
- // content::NotificationObserver: |
+ // content::NotificationObserver implementation. |
void Observe(int type, |
const content::NotificationSource& source, |
const content::NotificationDetails& details) override; |
- // DeclarativeContentCssConditionTrackerDelegate: |
- void RequestEvaluation(content::WebContents* contents) override; |
- bool ShouldManageConditionsForBrowserContext( |
- content::BrowserContext* context) override; |
- |
// Returns true if this object retains no allocated data. Only for debugging. |
bool IsEmpty() const; |
- |
- // TODO(wittman): Remove once DeclarativeChromeContentRulesRegistry no longer |
- // depends on concrete condition implementations. At that point |
- // DeclarativeChromeContentRulesRegistryTest.ActiveRulesDoesntGrow will be |
- // able to use a test condition object and not need to depend on force setting |
- // matching CSS seleectors. |
- void UpdateMatchingCssSelectorsForTesting( |
- content::WebContents* contents, |
- const std::vector<std::string>& matching_css_selectors); |
- |
- // Returns the number of active rules. |
- size_t GetActiveRulesCountForTesting(); |
protected: |
~ChromeContentRulesRegistry() override; |
@@ -134,22 +119,27 @@ |
const std::string& extension_id) const; |
private: |
- // Utility function for iterating a lambda over the relevant WebContents. |
- template <class Func> |
- void ForEachWebContents(const Func& func); |
- |
- // Set up the state to track rules for |contents|. |
- void TrackRulesForWebContents(content::WebContents* contents); |
+ friend class DeclarativeChromeContentRulesRegistryTest; |
// True if this object is managing the rules for |context|. |
bool ManagingRulesForBrowserContext(content::BrowserContext* context); |
+ |
+ // Applies all content rules given that a tab was just navigated. |
+ void OnTabNavigation(content::WebContents* tab, bool is_in_page_navigation); |
std::set<const ContentRule*> GetMatches( |
const RendererContentMatchData& renderer_data, |
bool is_incognito_renderer) const; |
- // Updates the condition evaluator with the current watched CSS selectors. |
- void UpdateCssSelectorsFromRules(); |
+ // Scans the rules for the set of conditions they're watching. If the set has |
+ // changed, calls InstructRenderProcess() for each RenderProcessHost in the |
+ // current browser_context. |
+ void UpdateConditionCache(); |
+ |
+ // If the renderer process is associated with our browser context, tells it |
+ // what page attributes to watch for using an ExtensionMsg_WatchPages. |
+ void InstructRenderProcessIfSameBrowserContext( |
+ content::RenderProcessHost* process); |
// Evaluates the conditions for |tab| based on the tab state and matching CSS |
// selectors. |
@@ -162,6 +152,8 @@ |
URLMatcherIdToRule; |
typedef std::map<ContentRule::GlobalRuleId, linked_ptr<const ContentRule>> |
RulesMap; |
+ typedef std::map<content::WebContents*, std::vector<std::string>> |
+ CssSelectors; |
// Map that tells us which ContentRules may match under the condition that |
// the URLMatcherConditionSet::ID was returned by the |url_matcher_|. |
@@ -170,21 +162,22 @@ |
RulesMap content_rules_; |
// Maps a WebContents to the set of rules that match on that WebContents. |
- // This lets us call Revert as appropriate. Note that this is expected to have |
- // a key-value pair for every WebContents the registry is tracking, even if |
- // the value is the empty set. |
+ // This lets us call Revert as appropriate. |
std::map<content::WebContents*, std::set<const ContentRule*>> active_rules_; |
// Matches URLs for the page_url condition. |
url_matcher::URLMatcher url_matcher_; |
- // Responsible for evaluating the declarative content conditions. |
- DeclarativeContentCssConditionTracker css_condition_tracker_; |
+ // All CSS selectors any rule's conditions watch for. |
+ std::vector<std::string> watched_css_selectors_; |
// Manages our notification registrations. |
content::NotificationRegistrar registrar_; |
scoped_refptr<InfoMap> extension_info_map_; |
+ |
+ // Maps tab_id to the matching CSS selectors for the tab. |
+ CssSelectors matching_css_selectors_; |
DISALLOW_COPY_AND_ASSIGN(ChromeContentRulesRegistry); |
}; |