blob: 389f301e78ae9f26baeeeaf78d26dd5a16542d73 [file] [log] [blame]
// Copyright (c) 2012 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.
#ifndef CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_CONTENT_CONTENT_CONDITION_H_
#define CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_CONTENT_CONTENT_CONDITION_H_
#include <map>
#include <set>
#include <string>
#include <vector>
#include "base/containers/hash_tables.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/values.h"
#include "chrome/browser/extensions/api/declarative/declarative_rule.h"
#include "extensions/common/matcher/url_matcher.h"
#include "url/gurl.h"
namespace extensions {
struct RendererContentMatchData {
RendererContentMatchData();
~RendererContentMatchData();
// Match IDs for the URL of the top-level page the renderer is
// returning data for.
std::set<URLMatcherConditionSet::ID> page_url_matches;
// All watched CSS selectors that match on frames with the same
// origin as the page's main frame.
base::hash_set<std::string> css_selectors;
};
// Representation of a condition in the Declarative Content API. A condition
// consists of an optional URL and a list of CSS selectors. Each of these
// attributes needs to be fulfilled in order for the condition to be fulfilled.
//
// We distinguish between two types of attributes:
// - URL Matcher attributes are attributes that test the URL of a page.
// These are treated separately because we use a URLMatcher to efficiently
// test many of these attributes in parallel by using some advanced
// data structures. The URLMatcher tells us if all URL Matcher attributes
// are fulfilled for a ContentCondition.
// - All other conditions are represented individually as fields in
// ContentCondition. These conditions are probed linearly (only if the URL
// Matcher found a hit).
//
// TODO(battre) Consider making the URLMatcher an owner of the
// URLMatcherConditionSet and only pass a pointer to URLMatcherConditionSet
// in url_matcher_condition_set(). This saves some copying in
// ContentConditionSet::GetURLMatcherConditionSets.
class ContentCondition {
public:
typedef RendererContentMatchData MatchData;
ContentCondition(
scoped_refptr<URLMatcherConditionSet> url_matcher_conditions,
const std::vector<std::string>& css_selectors);
~ContentCondition();
// Factory method that instantiates a ContentCondition according to the
// description |condition| passed by the extension API. |condition| should be
// an instance of declarativeContent.PageStateMatcher.
static scoped_ptr<ContentCondition> Create(
const Extension* extension,
URLMatcherConditionFactory* url_matcher_condition_factory,
const base::Value& condition,
std::string* error);
// Returns whether the request is a match, given that the URLMatcher found
// a match for |url_matcher_conditions_|.
bool IsFulfilled(const RendererContentMatchData& renderer_data) const;
// Returns a URLMatcherConditionSet::ID which is the canonical representation
// for all URL patterns that need to be matched by this ContentCondition.
// This ID is registered in a URLMatcher that can inform us in case of a
// match.
URLMatcherConditionSet::ID url_matcher_condition_set_id() const {
return url_matcher_conditions_->id();
}
// If this Condition has a url filter, appends it to |condition_sets|.
void GetURLMatcherConditionSets(
URLMatcherConditionSet::Vector* condition_sets) const {
if (url_matcher_conditions_.get())
condition_sets->push_back(url_matcher_conditions_);
}
// True if GetURLMatcherConditionSets would append anything to its
// argument.
bool has_url_matcher_condition_set() const {
return url_matcher_conditions_.get() != NULL;
}
// Returns the CSS selectors required to match by this condition.
const std::vector<std::string>& css_selectors() const {
return css_selectors_;
}
private:
scoped_refptr<URLMatcherConditionSet> url_matcher_conditions_;
std::vector<std::string> css_selectors_;
DISALLOW_COPY_AND_ASSIGN(ContentCondition);
};
typedef DeclarativeConditionSet<ContentCondition> ContentConditionSet;
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_CONTENT_CONTENT_CONDITION_H_