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

Unified 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, 7 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/declarative_content/declarative_content_rule.h
diff --git a/chrome/browser/extensions/api/declarative_content/declarative_content_rule.h b/chrome/browser/extensions/api/declarative_content/declarative_content_rule.h
new file mode 100644
index 0000000000000000000000000000000000000000..cc9868495deff6cff23da918f74eaae8e5c4d241
--- /dev/null
+++ b/chrome/browser/extensions/api/declarative_content/declarative_content_rule.h
@@ -0,0 +1,218 @@
+// 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
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_CONTENT_DECLARATIVE_CONTENT_RULE_H__
+#define CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_CONTENT_DECLARATIVE_CONTENT_RULE_H__
+
+#include <string>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/memory/linked_ptr.h"
+#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 "components/url_matcher/url_matcher.h"
+#include "extensions/common/api/events.h"
+
+namespace base {
+class Time;
+class Value;
+}
+
+namespace content {
+class BrowserContext;
+}
+
+namespace extensions {
+
+class Extension;
+
+// This class stores a set of conditions that may be part of a
+// DeclarativeContentRule. If any condition is fulfilled, the Actions of the
+// DeclarativeContentRule can be triggered.
+class DeclarativeContentConditionSet {
not at google - send to devlin 2015/06/01 22:51:11 I'm not sure that DeclarativeContentConditionSet/D
+ public:
+ 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".
+ typedef std::vector<linked_ptr<const ContentCondition> > Conditions;
+ typedef Conditions::const_iterator const_iterator;
+
+ // Factory method that creates a DeclarativeContentConditionSet for
+ // |extension| according to the JSON array |conditions| passed by the
+ // extension API. Sets |error| and returns NULL in case of an error.
+ static scoped_ptr<DeclarativeContentConditionSet> Create(
+ const Extension* extension,
+ url_matcher::URLMatcherConditionFactory* url_matcher_condition_factory,
+ const Values& condition_values,
+ std::string* error);
+
+ ~DeclarativeContentConditionSet();
+
+ const Conditions& conditions() const {
+ return conditions_;
+ }
+
+ const_iterator begin() const { return conditions_.begin(); }
+ const_iterator end() const { return conditions_.end(); }
+
+ // If |url_match_trigger| is not -1, this function looks for a condition
+ // with this URLMatcherConditionSet, and forwards to that condition's
+ // IsFulfilled(|match_data|). If there is no such condition, then false is
+ // returned. If |url_match_trigger| is -1, this function returns whether any
+ // 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
+ bool IsFulfilled(url_matcher::URLMatcherConditionSet::ID url_match_trigger,
+ const RendererContentMatchData& match_data) const;
+
+ // Appends the URLMatcherConditionSet from all conditions to |condition_sets|.
+ void GetURLMatcherConditionSets(
+ url_matcher::URLMatcherConditionSet::Vector* condition_sets) const;
+
+ // Returns whether there are some conditions without UrlFilter attributes.
+ bool HasConditionsWithoutUrls() const {
+ return !conditions_without_urls_.empty();
+ }
+
+ private:
+ typedef std::map<url_matcher::URLMatcherConditionSet::ID,
+ const ContentCondition*>
+ URLMatcherIdToCondition;
+
+ DeclarativeContentConditionSet(
+ const Conditions& conditions,
+ const URLMatcherIdToCondition& match_id_to_condition,
+ const std::vector<const ContentCondition*>& conditions_without_urls);
+
+ const URLMatcherIdToCondition match_id_to_condition_;
+ const Conditions conditions_;
+ const std::vector<const ContentCondition*> conditions_without_urls_;
+
+ DISALLOW_COPY_AND_ASSIGN(DeclarativeContentConditionSet);
+};
+
+typedef DeclarativeContentConditionSet ContentConditionSet;
not at google - send to devlin 2015/06/01 22:51:11 Why not just directly call "DeclarativeContentCond
+
+// Immutable container for multiple actions.
+//
+// TODO(battre): As DeclarativeContentActionSet can become the single owner of
+// all actions, we can optimize here by making some of them singletons
+// (e.g. Cancel actions).
+class DeclarativeContentActionSet {
+ public:
+ typedef std::vector<linked_ptr<base::Value> > Values;
+ typedef std::vector<scoped_refptr<const ContentAction> > Actions;
+
+ explicit DeclarativeContentActionSet(const Actions& actions);
+ ~DeclarativeContentActionSet();
+
+ // Factory method that instantiates a DeclarativeContentActionSet for
+ // |extension| according to |actions| which represents the array of actions
+ // received from the extension API.
+ static scoped_ptr<DeclarativeContentActionSet> Create(
+ content::BrowserContext* browser_context,
+ const Extension* extension,
+ const Values& action_values,
+ std::string* error,
+ bool* bad_message);
+
+ // Rules call this method when their conditions are fulfilled.
+ void Apply(const std::string& extension_id,
+ 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
+ ContentAction::ApplyInfo* apply_info) const;
+
+ // Rules call this method when their conditions are fulfilled, but Apply has
+ // already been called.
+ void Reapply(const std::string& extension_id,
+ const base::Time& extension_install_time,
+ ContentAction::ApplyInfo* apply_info) const;
+
+ // Rules call this method when they have stateful conditions, and those
+ // conditions stop being fulfilled. Rules with event-based conditions (e.g. a
+ // network request happened) will never Revert() an action.
+ void Revert(const std::string& extension_id,
+ const base::Time& extension_install_time,
+ ContentAction::ApplyInfo* apply_info) const;
+
+ const Actions& actions() const { return actions_; }
+
+ private:
+ const Actions actions_;
+
+ DISALLOW_COPY_AND_ASSIGN(DeclarativeContentActionSet);
+};
+
+typedef DeclarativeContentActionSet ContentActionSet;
+
+// Representation of a rule of a declarative API:
+// https://developer.chrome.com/beta/extensions/events.html#declarative.
+// Generally a RulesRegistry will hold a collection of Rules for a given
+// declarative API and contain the logic for matching and applying them.
+class DeclarativeContentRule {
+ public:
+ typedef std::string ExtensionId;
not at google - send to devlin 2015/06/01 22:51:11 This typedef already exists in extension.h.
+ typedef std::string RuleId;
+ typedef std::pair<ExtensionId, RuleId> GlobalRuleId;
+ typedef int Priority;
+ typedef DeclarativeContentConditionSet ConditionSet;
+ typedef DeclarativeContentActionSet ActionSet;
+ typedef core_api::events::Rule JsonRule;
+ 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
+
+ // Checks whether the set of |conditions| and |actions| are consistent.
+ // Returns true in case of consistency and MUST set |error| otherwise.
+ typedef base::Callback<bool(const ConditionSet* conditions,
+ const ActionSet* actions,
+ std::string* error)> ConsistencyChecker;
+
+ DeclarativeContentRule(const GlobalRuleId& id,
+ const Tags& tags,
+ base::Time extension_installation_time,
+ scoped_ptr<ConditionSet> conditions,
+ scoped_ptr<ActionSet> actions,
+ Priority priority);
+ ~DeclarativeContentRule();
+
+ // Creates a DeclarativeContentRule for |extension| given a json definition.
+ // The format of each condition and action's json is up to the specific
+ // ContentCondition and ContentAction. |extension| may be NULL in tests.
+ //
+ // Before constructing the final rule, calls check_consistency(conditions,
+ // actions, error) and returns NULL if it fails. Pass NULL if no consistency
+ // check is needed. If |error| is empty, the translation was successful and
+ // the returned rule is internally consistent.
+ static scoped_ptr<DeclarativeContentRule> Create(
+ url_matcher::URLMatcherConditionFactory* url_matcher_condition_factory,
+ content::BrowserContext* browser_context,
+ const Extension* extension,
+ base::Time extension_installation_time,
+ linked_ptr<JsonRule> rule,
+ ConsistencyChecker check_consistency,
+ std::string* error);
+
+ const GlobalRuleId& id() const { return id_; }
+ const Tags& tags() const { return tags_; }
+ const std::string& extension_id() const { return id_.first; }
+ const ConditionSet& conditions() const { return *conditions_; }
+ const ActionSet& actions() const { return *actions_; }
+ Priority priority() const { return priority_; }
+
+ // Calls actions().Apply(extension_id(), extension_installation_time_,
+ // apply_info). This function should only be called when the conditions_ are
+ // fulfilled (from a semantic point of view; no harm is done if this function
+ // is called at other times for testing purposes).
+ void Apply(ContentAction::ApplyInfo* apply_info) const;
+
+ private:
+ GlobalRuleId id_;
+ Tags tags_;
+ base::Time extension_installation_time_; // For precedences of rules.
+ scoped_ptr<ConditionSet> conditions_;
+ scoped_ptr<ActionSet> actions_;
+ Priority priority_;
+
+ DISALLOW_COPY_AND_ASSIGN(DeclarativeContentRule);
+};
+
+} // namespace extensions
+
+#endif // CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_CONTENT_DECLARATIVE_CONTENT_RULE_H__

Powered by Google App Engine
This is Rietveld 408576698