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

Unified Diff: chrome/browser/extensions/api/declarative/declarative_rule.h

Issue 550403003: Move declarative api files to extensions/browser/api/declarative. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix browser tests. Created 6 years, 3 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/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__

Powered by Google App Engine
This is Rietveld 408576698