Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(133)

Side by Side Diff: chrome/browser/extensions/api/declarative_content/declarative_content_rule.h

Issue 1159733004: Encapsulate CSS selector declarative content condition tracking (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@stars-declarative-content-range-for
Patch Set: iwyu Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
not at google - send to devlin 2015/06/01 22:51:12 (note, maybe of the comments in this file apply to
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_CONTENT_DECLARATIVE_CONTENT_RU LE_H__
6 #define CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_CONTENT_DECLARATIVE_CONTENT_RU LE_H__
7
8 #include <string>
9 #include <vector>
10
11 #include "base/callback.h"
12 #include "base/memory/linked_ptr.h"
13 #include "base/time/time.h"
14 #include "chrome/browser/extensions/api/declarative_content/content_action.h"
15 #include "chrome/browser/extensions/api/declarative_content/content_condition.h"
16 #include "components/url_matcher/url_matcher.h"
17 #include "extensions/common/api/events.h"
18
19 namespace base {
20 class Time;
21 class Value;
22 }
23
24 namespace content {
25 class BrowserContext;
26 }
27
28 namespace extensions {
29
30 class Extension;
31
32 // This class stores a set of conditions that may be part of a
33 // DeclarativeContentRule. If any condition is fulfilled, the Actions of the
34 // DeclarativeContentRule can be triggered.
35 class DeclarativeContentConditionSet {
not at google - send to devlin 2015/06/01 22:51:11 I'm not sure that DeclarativeContentConditionSet/D
36 public:
37 typedef std::vector<linked_ptr<base::Value> > Values;
not at google - send to devlin 2015/06/01 22:51:11 - Use "using Values = ..." rather than "typedef".
38 typedef std::vector<linked_ptr<const ContentCondition> > Conditions;
39 typedef Conditions::const_iterator const_iterator;
40
41 // Factory method that creates a DeclarativeContentConditionSet for
42 // |extension| according to the JSON array |conditions| passed by the
43 // extension API. Sets |error| and returns NULL in case of an error.
44 static scoped_ptr<DeclarativeContentConditionSet> Create(
45 const Extension* extension,
46 url_matcher::URLMatcherConditionFactory* url_matcher_condition_factory,
47 const Values& condition_values,
48 std::string* error);
49
50 ~DeclarativeContentConditionSet();
51
52 const Conditions& conditions() const {
53 return conditions_;
54 }
55
56 const_iterator begin() const { return conditions_.begin(); }
57 const_iterator end() const { return conditions_.end(); }
58
59 // If |url_match_trigger| is not -1, this function looks for a condition
60 // with this URLMatcherConditionSet, and forwards to that condition's
61 // IsFulfilled(|match_data|). If there is no such condition, then false is
62 // returned. If |url_match_trigger| is -1, this function returns whether any
63 // of the conditions without URL attributes is satisfied.
not at google - send to devlin 2015/06/01 22:51:11 Can this be 2 separate interface methods, with an
64 bool IsFulfilled(url_matcher::URLMatcherConditionSet::ID url_match_trigger,
65 const RendererContentMatchData& match_data) const;
66
67 // Appends the URLMatcherConditionSet from all conditions to |condition_sets|.
68 void GetURLMatcherConditionSets(
69 url_matcher::URLMatcherConditionSet::Vector* condition_sets) const;
70
71 // Returns whether there are some conditions without UrlFilter attributes.
72 bool HasConditionsWithoutUrls() const {
73 return !conditions_without_urls_.empty();
74 }
75
76 private:
77 typedef std::map<url_matcher::URLMatcherConditionSet::ID,
78 const ContentCondition*>
79 URLMatcherIdToCondition;
80
81 DeclarativeContentConditionSet(
82 const Conditions& conditions,
83 const URLMatcherIdToCondition& match_id_to_condition,
84 const std::vector<const ContentCondition*>& conditions_without_urls);
85
86 const URLMatcherIdToCondition match_id_to_condition_;
87 const Conditions conditions_;
88 const std::vector<const ContentCondition*> conditions_without_urls_;
89
90 DISALLOW_COPY_AND_ASSIGN(DeclarativeContentConditionSet);
91 };
92
93 typedef DeclarativeContentConditionSet ContentConditionSet;
not at google - send to devlin 2015/06/01 22:51:11 Why not just directly call "DeclarativeContentCond
94
95 // Immutable container for multiple actions.
96 //
97 // TODO(battre): As DeclarativeContentActionSet can become the single owner of
98 // all actions, we can optimize here by making some of them singletons
99 // (e.g. Cancel actions).
100 class DeclarativeContentActionSet {
101 public:
102 typedef std::vector<linked_ptr<base::Value> > Values;
103 typedef std::vector<scoped_refptr<const ContentAction> > Actions;
104
105 explicit DeclarativeContentActionSet(const Actions& actions);
106 ~DeclarativeContentActionSet();
107
108 // Factory method that instantiates a DeclarativeContentActionSet for
109 // |extension| according to |actions| which represents the array of actions
110 // received from the extension API.
111 static scoped_ptr<DeclarativeContentActionSet> Create(
112 content::BrowserContext* browser_context,
113 const Extension* extension,
114 const Values& action_values,
115 std::string* error,
116 bool* bad_message);
117
118 // Rules call this method when their conditions are fulfilled.
119 void Apply(const std::string& extension_id,
120 const base::Time& extension_install_time,
not at google - send to devlin 2015/06/01 22:51:12 This method taking the extension's install time se
121 ContentAction::ApplyInfo* apply_info) const;
122
123 // Rules call this method when their conditions are fulfilled, but Apply has
124 // already been called.
125 void Reapply(const std::string& extension_id,
126 const base::Time& extension_install_time,
127 ContentAction::ApplyInfo* apply_info) const;
128
129 // Rules call this method when they have stateful conditions, and those
130 // conditions stop being fulfilled. Rules with event-based conditions (e.g. a
131 // network request happened) will never Revert() an action.
132 void Revert(const std::string& extension_id,
133 const base::Time& extension_install_time,
134 ContentAction::ApplyInfo* apply_info) const;
135
136 const Actions& actions() const { return actions_; }
137
138 private:
139 const Actions actions_;
140
141 DISALLOW_COPY_AND_ASSIGN(DeclarativeContentActionSet);
142 };
143
144 typedef DeclarativeContentActionSet ContentActionSet;
145
146 // Representation of a rule of a declarative API:
147 // https://developer.chrome.com/beta/extensions/events.html#declarative.
148 // Generally a RulesRegistry will hold a collection of Rules for a given
149 // declarative API and contain the logic for matching and applying them.
150 class DeclarativeContentRule {
151 public:
152 typedef std::string ExtensionId;
not at google - send to devlin 2015/06/01 22:51:11 This typedef already exists in extension.h.
153 typedef std::string RuleId;
154 typedef std::pair<ExtensionId, RuleId> GlobalRuleId;
155 typedef int Priority;
156 typedef DeclarativeContentConditionSet ConditionSet;
157 typedef DeclarativeContentActionSet ActionSet;
158 typedef core_api::events::Rule JsonRule;
159 typedef std::vector<std::string> Tags;
not at google - send to devlin 2015/06/01 22:51:11 That's a lot of typedefs. Some of them like Priori
160
161 // Checks whether the set of |conditions| and |actions| are consistent.
162 // Returns true in case of consistency and MUST set |error| otherwise.
163 typedef base::Callback<bool(const ConditionSet* conditions,
164 const ActionSet* actions,
165 std::string* error)> ConsistencyChecker;
166
167 DeclarativeContentRule(const GlobalRuleId& id,
168 const Tags& tags,
169 base::Time extension_installation_time,
170 scoped_ptr<ConditionSet> conditions,
171 scoped_ptr<ActionSet> actions,
172 Priority priority);
173 ~DeclarativeContentRule();
174
175 // Creates a DeclarativeContentRule for |extension| given a json definition.
176 // The format of each condition and action's json is up to the specific
177 // ContentCondition and ContentAction. |extension| may be NULL in tests.
178 //
179 // Before constructing the final rule, calls check_consistency(conditions,
180 // actions, error) and returns NULL if it fails. Pass NULL if no consistency
181 // check is needed. If |error| is empty, the translation was successful and
182 // the returned rule is internally consistent.
183 static scoped_ptr<DeclarativeContentRule> Create(
184 url_matcher::URLMatcherConditionFactory* url_matcher_condition_factory,
185 content::BrowserContext* browser_context,
186 const Extension* extension,
187 base::Time extension_installation_time,
188 linked_ptr<JsonRule> rule,
189 ConsistencyChecker check_consistency,
190 std::string* error);
191
192 const GlobalRuleId& id() const { return id_; }
193 const Tags& tags() const { return tags_; }
194 const std::string& extension_id() const { return id_.first; }
195 const ConditionSet& conditions() const { return *conditions_; }
196 const ActionSet& actions() const { return *actions_; }
197 Priority priority() const { return priority_; }
198
199 // Calls actions().Apply(extension_id(), extension_installation_time_,
200 // apply_info). This function should only be called when the conditions_ are
201 // fulfilled (from a semantic point of view; no harm is done if this function
202 // is called at other times for testing purposes).
203 void Apply(ContentAction::ApplyInfo* apply_info) const;
204
205 private:
206 GlobalRuleId id_;
207 Tags tags_;
208 base::Time extension_installation_time_; // For precedences of rules.
209 scoped_ptr<ConditionSet> conditions_;
210 scoped_ptr<ActionSet> actions_;
211 Priority priority_;
212
213 DISALLOW_COPY_AND_ASSIGN(DeclarativeContentRule);
214 };
215
216 } // namespace extensions
217
218 #endif // CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_CONTENT_DECLARATIVE_CONTENT _RULE_H__
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698