Index: chrome/browser/extensions/api/declarative/declarative_rule.h |
diff --git a/chrome/browser/extensions/api/declarative/declarative_rule.h b/chrome/browser/extensions/api/declarative/declarative_rule.h |
deleted file mode 100644 |
index 3d286f060a6fd44b28182fdffb2b5e374b112093..0000000000000000000000000000000000000000 |
--- a/chrome/browser/extensions/api/declarative/declarative_rule.h |
+++ /dev/null |
@@ -1,517 +0,0 @@ |
-// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
-// |
-// DeclarativeRule<>, DeclarativeConditionSet<>, and DeclarativeActionSet<> |
-// templates usable with multiple different declarativeFoo systems. These are |
-// templated on the Condition and Action types that define the behavior of a |
-// particular declarative event. |
- |
-#ifndef CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_DECLARATIVE_RULE_H__ |
-#define CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_DECLARATIVE_RULE_H__ |
- |
-#include <limits> |
-#include <set> |
-#include <string> |
-#include <vector> |
- |
-#include "base/callback.h" |
-#include "base/memory/linked_ptr.h" |
-#include "base/memory/scoped_vector.h" |
-#include "base/stl_util.h" |
-#include "base/time/time.h" |
-#include "chrome/common/extensions/api/events.h" |
-#include "components/url_matcher/url_matcher.h" |
-#include "extensions/common/extension.h" |
- |
-namespace base { |
-class Time; |
-class Value; |
-} |
- |
-namespace content { |
-class BrowserContext; |
-} |
- |
-namespace extensions { |
- |
-// This class stores a set of conditions that may be part of a DeclarativeRule. |
-// If any condition is fulfilled, the Actions of the DeclarativeRule can be |
-// triggered. |
-// |
-// ConditionT should be immutable after creation. It must define the following |
-// members: |
-// |
-// // Arguments passed through from DeclarativeConditionSet::Create. |
-// static scoped_ptr<ConditionT> Create( |
-// const Extension* extension, |
-// URLMatcherConditionFactory* url_matcher_condition_factory, |
-// // Except this argument gets elements of the AnyVector. |
-// const base::Value& definition, |
-// std::string* error); |
-// // If the Condition needs to be filtered by some URLMatcherConditionSets, |
-// // append them to |condition_sets|. |
-// // DeclarativeConditionSet::GetURLMatcherConditionSets forwards here. |
-// void GetURLMatcherConditionSets( |
-// URLMatcherConditionSet::Vector* condition_sets); |
-// // |match_data| passed through from DeclarativeConditionSet::IsFulfilled. |
-// bool IsFulfilled(const ConditionT::MatchData& match_data); |
-template<typename ConditionT> |
-class DeclarativeConditionSet { |
- public: |
- typedef std::vector<linked_ptr<base::Value> > AnyVector; |
- typedef std::vector<linked_ptr<const ConditionT> > Conditions; |
- typedef typename Conditions::const_iterator const_iterator; |
- |
- // Factory method that creates a DeclarativeConditionSet 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<DeclarativeConditionSet> Create( |
- const Extension* extension, |
- url_matcher::URLMatcherConditionFactory* url_matcher_condition_factory, |
- const AnyVector& conditions, |
- std::string* error); |
- |
- 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. |
- bool IsFulfilled(url_matcher::URLMatcherConditionSet::ID url_match_trigger, |
- const typename ConditionT::MatchData& 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 ConditionT*> |
- URLMatcherIdToCondition; |
- |
- DeclarativeConditionSet( |
- const Conditions& conditions, |
- const URLMatcherIdToCondition& match_id_to_condition, |
- const std::vector<const ConditionT*>& conditions_without_urls); |
- |
- const URLMatcherIdToCondition match_id_to_condition_; |
- const Conditions conditions_; |
- const std::vector<const ConditionT*> conditions_without_urls_; |
- |
- DISALLOW_COPY_AND_ASSIGN(DeclarativeConditionSet); |
-}; |
- |
-// Immutable container for multiple actions. |
-// |
-// ActionT should be immutable after creation. It must define the following |
-// members: |
-// |
-// // Arguments passed through from ActionSet::Create. |
-// static scoped_ptr<ActionT> Create( |
-// const Extension* extension, |
-// // Except this argument gets elements of the AnyVector. |
-// const base::Value& definition, |
-// std::string* error, bool* bad_message); |
-// void Apply(const std::string& extension_id, |
-// const base::Time& extension_install_time, |
-// // Contains action-type-specific in/out parameters. |
-// typename ActionT::ApplyInfo* apply_info) const; |
-// // Only needed if the RulesRegistry calls DeclarativeActionSet::Revert(). |
-// void Revert(const std::string& extension_id, |
-// const base::Time& extension_install_time, |
-// // Contains action-type-specific in/out parameters. |
-// typename ActionT::ApplyInfo* apply_info) const; |
-// // Return the minimum priority of rules that can be evaluated after this |
-// // action runs. A suitable default value is MIN_INT. |
-// int minimum_priority() const; |
-// |
-// TODO(battre): As DeclarativeActionSet can become the single owner of all |
-// actions, we can optimize here by making some of them singletons (e.g. Cancel |
-// actions). |
-template<typename ActionT> |
-class DeclarativeActionSet { |
- public: |
- typedef std::vector<linked_ptr<base::Value> > AnyVector; |
- typedef std::vector<scoped_refptr<const ActionT> > Actions; |
- |
- explicit DeclarativeActionSet(const Actions& actions); |
- |
- // Factory method that instantiates a DeclarativeActionSet for |extension| |
- // according to |actions| which represents the array of actions received from |
- // the extension API. |
- static scoped_ptr<DeclarativeActionSet> Create( |
- content::BrowserContext* browser_context, |
- const Extension* extension, |
- const AnyVector& actions, |
- 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, |
- typename ActionT::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, |
- typename ActionT::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, |
- typename ActionT::ApplyInfo* apply_info) const; |
- |
- // Returns the minimum priority of rules that may be evaluated after |
- // this rule. Defaults to MIN_INT. |
- int GetMinimumPriority() const; |
- |
- const Actions& actions() const { return actions_; } |
- |
- private: |
- const Actions actions_; |
- |
- DISALLOW_COPY_AND_ASSIGN(DeclarativeActionSet); |
-}; |
- |
-// 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. |
-// |
-// See DeclarativeConditionSet and DeclarativeActionSet for the requirements on |
-// ConditionT and ActionT. |
-template<typename ConditionT, typename ActionT> |
-class DeclarativeRule { |
- public: |
- typedef std::string ExtensionId; |
- typedef std::string RuleId; |
- typedef std::pair<ExtensionId, RuleId> GlobalRuleId; |
- typedef int Priority; |
- typedef DeclarativeConditionSet<ConditionT> ConditionSet; |
- typedef DeclarativeActionSet<ActionT> ActionSet; |
- typedef extensions::api::events::Rule JsonRule; |
- typedef std::vector<std::string> Tags; |
- |
- // 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; |
- |
- DeclarativeRule(const GlobalRuleId& id, |
- const Tags& tags, |
- base::Time extension_installation_time, |
- scoped_ptr<ConditionSet> conditions, |
- scoped_ptr<ActionSet> actions, |
- Priority priority); |
- |
- // Creates a DeclarativeRule for |extension| given a json definition. The |
- // format of each condition and action's json is up to the specific ConditionT |
- // and ActionT. |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<DeclarativeRule> 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(typename ActionT::ApplyInfo* apply_info) const; |
- |
- // Returns the minimum priority of rules that may be evaluated after |
- // this rule. Defaults to MIN_INT. Only valid if the conditions of this rule |
- // are fulfilled. |
- Priority GetMinimumPriority() 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(DeclarativeRule); |
-}; |
- |
-// Implementation details below here. |
- |
-// |
-// DeclarativeConditionSet |
-// |
- |
-template<typename ConditionT> |
-bool DeclarativeConditionSet<ConditionT>::IsFulfilled( |
- url_matcher::URLMatcherConditionSet::ID url_match_trigger, |
- const typename ConditionT::MatchData& match_data) const { |
- if (url_match_trigger == -1) { |
- // Invalid trigger -- indication that we should only check conditions |
- // without URL attributes. |
- for (typename std::vector<const ConditionT*>::const_iterator it = |
- conditions_without_urls_.begin(); |
- it != conditions_without_urls_.end(); ++it) { |
- if ((*it)->IsFulfilled(match_data)) |
- return true; |
- } |
- return false; |
- } |
- |
- typename URLMatcherIdToCondition::const_iterator triggered = |
- match_id_to_condition_.find(url_match_trigger); |
- return (triggered != match_id_to_condition_.end() && |
- triggered->second->IsFulfilled(match_data)); |
-} |
- |
-template<typename ConditionT> |
-void DeclarativeConditionSet<ConditionT>::GetURLMatcherConditionSets( |
- url_matcher::URLMatcherConditionSet::Vector* condition_sets) const { |
- for (typename Conditions::const_iterator i = conditions_.begin(); |
- i != conditions_.end(); ++i) { |
- (*i)->GetURLMatcherConditionSets(condition_sets); |
- } |
-} |
- |
-// static |
-template<typename ConditionT> |
-scoped_ptr<DeclarativeConditionSet<ConditionT> > |
-DeclarativeConditionSet<ConditionT>::Create( |
- const Extension* extension, |
- url_matcher::URLMatcherConditionFactory* url_matcher_condition_factory, |
- const AnyVector& conditions, |
- std::string* error) { |
- Conditions result; |
- |
- for (AnyVector::const_iterator i = conditions.begin(); |
- i != conditions.end(); ++i) { |
- CHECK(i->get()); |
- scoped_ptr<ConditionT> condition = ConditionT::Create( |
- extension, url_matcher_condition_factory, **i, error); |
- if (!error->empty()) |
- return scoped_ptr<DeclarativeConditionSet>(); |
- result.push_back(make_linked_ptr(condition.release())); |
- } |
- |
- URLMatcherIdToCondition match_id_to_condition; |
- std::vector<const ConditionT*> conditions_without_urls; |
- url_matcher::URLMatcherConditionSet::Vector condition_sets; |
- |
- for (typename Conditions::const_iterator i = result.begin(); |
- i != result.end(); ++i) { |
- condition_sets.clear(); |
- (*i)->GetURLMatcherConditionSets(&condition_sets); |
- if (condition_sets.empty()) { |
- conditions_without_urls.push_back(i->get()); |
- } else { |
- for (url_matcher::URLMatcherConditionSet::Vector::const_iterator |
- match_set = condition_sets.begin(); |
- match_set != condition_sets.end(); ++match_set) |
- match_id_to_condition[(*match_set)->id()] = i->get(); |
- } |
- } |
- |
- return make_scoped_ptr(new DeclarativeConditionSet( |
- result, match_id_to_condition, conditions_without_urls)); |
-} |
- |
-template<typename ConditionT> |
-DeclarativeConditionSet<ConditionT>::DeclarativeConditionSet( |
- const Conditions& conditions, |
- const URLMatcherIdToCondition& match_id_to_condition, |
- const std::vector<const ConditionT*>& conditions_without_urls) |
- : match_id_to_condition_(match_id_to_condition), |
- conditions_(conditions), |
- conditions_without_urls_(conditions_without_urls) {} |
- |
-// |
-// DeclarativeActionSet |
-// |
- |
-template<typename ActionT> |
-DeclarativeActionSet<ActionT>::DeclarativeActionSet(const Actions& actions) |
- : actions_(actions) {} |
- |
-// static |
-template<typename ActionT> |
-scoped_ptr<DeclarativeActionSet<ActionT> > |
-DeclarativeActionSet<ActionT>::Create( |
- content::BrowserContext* browser_context, |
- const Extension* extension, |
- const AnyVector& actions, |
- std::string* error, |
- bool* bad_message) { |
- *error = ""; |
- *bad_message = false; |
- Actions result; |
- |
- for (AnyVector::const_iterator i = actions.begin(); |
- i != actions.end(); ++i) { |
- CHECK(i->get()); |
- scoped_refptr<const ActionT> action = |
- ActionT::Create(browser_context, extension, **i, error, bad_message); |
- if (!error->empty() || *bad_message) |
- return scoped_ptr<DeclarativeActionSet>(); |
- result.push_back(action); |
- } |
- |
- return scoped_ptr<DeclarativeActionSet>(new DeclarativeActionSet(result)); |
-} |
- |
-template<typename ActionT> |
-void DeclarativeActionSet<ActionT>::Apply( |
- const std::string& extension_id, |
- const base::Time& extension_install_time, |
- typename ActionT::ApplyInfo* apply_info) const { |
- for (typename Actions::const_iterator i = actions_.begin(); |
- i != actions_.end(); ++i) |
- (*i)->Apply(extension_id, extension_install_time, apply_info); |
-} |
- |
-template<typename ActionT> |
-void DeclarativeActionSet<ActionT>::Reapply( |
- const std::string& extension_id, |
- const base::Time& extension_install_time, |
- typename ActionT::ApplyInfo* apply_info) const { |
- for (typename Actions::const_iterator i = actions_.begin(); |
- i != actions_.end(); ++i) |
- (*i)->Reapply(extension_id, extension_install_time, apply_info); |
-} |
- |
-template<typename ActionT> |
-void DeclarativeActionSet<ActionT>::Revert( |
- const std::string& extension_id, |
- const base::Time& extension_install_time, |
- typename ActionT::ApplyInfo* apply_info) const { |
- for (typename Actions::const_iterator i = actions_.begin(); |
- i != actions_.end(); ++i) |
- (*i)->Revert(extension_id, extension_install_time, apply_info); |
-} |
- |
-template<typename ActionT> |
-int DeclarativeActionSet<ActionT>::GetMinimumPriority() const { |
- int minimum_priority = std::numeric_limits<int>::min(); |
- for (typename Actions::const_iterator i = actions_.begin(); |
- i != actions_.end(); ++i) { |
- minimum_priority = std::max(minimum_priority, (*i)->minimum_priority()); |
- } |
- return minimum_priority; |
-} |
- |
-// |
-// DeclarativeRule |
-// |
- |
-template<typename ConditionT, typename ActionT> |
-DeclarativeRule<ConditionT, ActionT>::DeclarativeRule( |
- const GlobalRuleId& id, |
- const Tags& tags, |
- base::Time extension_installation_time, |
- scoped_ptr<ConditionSet> conditions, |
- scoped_ptr<ActionSet> actions, |
- Priority priority) |
- : id_(id), |
- tags_(tags), |
- extension_installation_time_(extension_installation_time), |
- conditions_(conditions.release()), |
- actions_(actions.release()), |
- priority_(priority) { |
- CHECK(conditions_.get()); |
- CHECK(actions_.get()); |
-} |
- |
-// static |
-template<typename ConditionT, typename ActionT> |
-scoped_ptr<DeclarativeRule<ConditionT, ActionT> > |
-DeclarativeRule<ConditionT, ActionT>::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) { |
- scoped_ptr<DeclarativeRule> error_result; |
- |
- scoped_ptr<ConditionSet> conditions = ConditionSet::Create( |
- extension, url_matcher_condition_factory, rule->conditions, error); |
- if (!error->empty()) |
- return error_result.Pass(); |
- CHECK(conditions.get()); |
- |
- bool bad_message = false; |
- scoped_ptr<ActionSet> actions = |
- ActionSet::Create( |
- browser_context, extension, rule->actions, error, &bad_message); |
- if (bad_message) { |
- // TODO(battre) Export concept of bad_message to caller, the extension |
- // should be killed in case it is true. |
- *error = "An action of a rule set had an invalid " |
- "structure that should have been caught by the JSON validator."; |
- return error_result.Pass(); |
- } |
- if (!error->empty() || bad_message) |
- return error_result.Pass(); |
- CHECK(actions.get()); |
- |
- if (!check_consistency.is_null() && |
- !check_consistency.Run(conditions.get(), actions.get(), error)) { |
- DCHECK(!error->empty()); |
- return error_result.Pass(); |
- } |
- |
- CHECK(rule->priority.get()); |
- int priority = *(rule->priority); |
- |
- GlobalRuleId rule_id(extension->id(), *(rule->id)); |
- Tags tags = rule->tags ? *rule->tags : Tags(); |
- return scoped_ptr<DeclarativeRule>( |
- new DeclarativeRule(rule_id, tags, extension_installation_time, |
- conditions.Pass(), actions.Pass(), priority)); |
-} |
- |
-template<typename ConditionT, typename ActionT> |
-void DeclarativeRule<ConditionT, ActionT>::Apply( |
- typename ActionT::ApplyInfo* apply_info) const { |
- return actions_->Apply(extension_id(), |
- extension_installation_time_, |
- apply_info); |
-} |
- |
-template<typename ConditionT, typename ActionT> |
-int DeclarativeRule<ConditionT, ActionT>::GetMinimumPriority() const { |
- return actions_->GetMinimumPriority(); |
-} |
- |
-} // namespace extensions |
- |
-#endif // CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_DECLARATIVE_RULE_H__ |