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

Unified Diff: chrome/common/extensions/matcher/url_matcher.h

Issue 10910179: Event matching by regular expression matching on URLs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ascii artiste Created 8 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/common/extensions/matcher/url_matcher.h
diff --git a/chrome/common/extensions/matcher/url_matcher.h b/chrome/common/extensions/matcher/url_matcher.h
index c547ae62fd79c6743bc97c4dde577645cfa41972..e868e278d5d5823decb2139ad1b572835f92fe59 100644
--- a/chrome/common/extensions/matcher/url_matcher.h
+++ b/chrome/common/extensions/matcher/url_matcher.h
@@ -11,6 +11,7 @@
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/scoped_vector.h"
+#include "chrome/common/extensions/matcher/regex_set_matcher.h"
#include "chrome/common/extensions/matcher/substring_set_matcher.h"
class GURL;
@@ -24,10 +25,12 @@ namespace extensions {
// This class represents a single URL matching condition, e.g. a match on the
// host suffix or the containment of a string in the query component of a GURL.
//
-// The difference from a simple SubstringPattern is that this also supports
+// The difference from a simple StringPattern is that this also supports
// checking whether the {Host, Path, Query} of a URL contains a string. The
// reduction of URL matching conditions to StringPatterns conducted by
// URLMatcherConditionFactory is not capable of expressing that alone.
+//
+// Also supported is matching regular expressions against the URL (URL_MATCHES).
class URLMatcherCondition {
public:
enum Criterion {
@@ -49,19 +52,20 @@ class URLMatcherCondition {
URL_SUFFIX,
URL_CONTAINS,
URL_EQUALS,
+ URL_MATCHES,
};
URLMatcherCondition();
~URLMatcherCondition();
URLMatcherCondition(Criterion criterion,
- const SubstringPattern* substring_pattern);
+ const StringPattern* substring_pattern);
URLMatcherCondition(const URLMatcherCondition& rhs);
URLMatcherCondition& operator=(const URLMatcherCondition& rhs);
bool operator<(const URLMatcherCondition& rhs) const;
Criterion criterion() const { return criterion_; }
- const SubstringPattern* substring_pattern() const {
- return substring_pattern_;
+ const StringPattern* string_pattern() const {
+ return string_pattern_;
}
// Returns whether this URLMatcherCondition needs to be executed on a
@@ -69,19 +73,22 @@ class URLMatcherCondition {
// URLMatcherConditionFactory).
bool IsFullURLCondition() const;
+ // Returns whether this URLMatcherCondition is a regular expression to be
+ // handled by a regex matcher instead of a substring matcher.
+ bool IsRegexCondition() const;
+
// Returns whether this condition is fulfilled according to
- // |matching_substring_patterns| and |url|.
- bool IsMatch(
- const std::set<SubstringPattern::ID>& matching_substring_patterns,
- const GURL& url) const;
+ // |matching_patterns| and |url|.
+ bool IsMatch(const std::set<StringPattern::ID>& matching_patterns,
+ const GURL& url) const;
private:
- // |criterion_| and |substring_pattern_| describe together what property a URL
+ // |criterion_| and |string_pattern_| describe together what property a URL
// needs to fulfill to be considered a match.
Criterion criterion_;
- // This is the SubstringPattern that is used in a SubstringSetMatcher.
- const SubstringPattern* substring_pattern_;
+ // This is the StringPattern that is used in a SubstringSetMatcher.
+ const StringPattern* string_pattern_;
};
// Class to map the problem of finding {host, path, query} {prefixes, suffixes,
@@ -101,7 +108,7 @@ class URLMatcherCondition {
// of a dictionary in a text" problem, which can be solved very efficiently
// by the Aho-Corasick algorithm.
//
-// IMPORTANT: The URLMatcherConditionFactory owns the SubstringPattern
+// IMPORTANT: The URLMatcherConditionFactory owns the StringPattern
// referenced by created URLMatcherConditions. Therefore, it must outlive
// all created URLMatcherCondition and the SubstringSetMatcher.
class URLMatcherConditionFactory {
@@ -146,23 +153,28 @@ class URLMatcherConditionFactory {
// Canonicalizes a URL for "CreateURL*Condition" searches.
std::string CanonicalizeURLForFullSearches(const GURL& url);
+ // Canonicalizes a URL for "CreateURLMatchesCondition" searches.
+ std::string CanonicalizeURLForRegexSearches(const GURL& url);
+
URLMatcherCondition CreateURLPrefixCondition(const std::string& prefix);
URLMatcherCondition CreateURLSuffixCondition(const std::string& suffix);
URLMatcherCondition CreateURLContainsCondition(const std::string& str);
URLMatcherCondition CreateURLEqualsCondition(const std::string& str);
+ URLMatcherCondition CreateURLMatchesCondition(const std::string& regex);
+
// Removes all patterns from |pattern_singletons_| that are not listed in
// |used_patterns|. These patterns are not referenced any more and get
// freed.
void ForgetUnusedPatterns(
- const std::set<SubstringPattern::ID>& used_patterns);
+ const std::set<StringPattern::ID>& used_patterns);
// Returns true if this object retains no allocated data. Only for debugging.
bool IsEmpty() const;
private:
// Creates a URLMatcherCondition according to the parameters passed.
- // The URLMatcherCondition will refer to a SubstringPattern that is
+ // The URLMatcherCondition will refer to a StringPattern that is
// owned by |pattern_singletons_|.
URLMatcherCondition CreateCondition(URLMatcherCondition::Criterion criterion,
const std::string& pattern);
@@ -170,19 +182,21 @@ class URLMatcherConditionFactory {
// Prepends a "." to the hostname if it does not start with one.
std::string CanonicalizeHostname(const std::string& hostname) const;
- // Counter that ensures that all created SubstringPatterns have unique IDs.
+ // Counter that ensures that all created StringPatterns have unique IDs.
+ // Note that substring patterns and regex patterns will use different IDs.
int id_counter_;
// This comparison considers only the pattern() value of the
- // SubstringPatterns.
- struct SubstringPatternPointerCompare {
- bool operator()(SubstringPattern* lhs, SubstringPattern* rhs) const;
+ // StringPatterns.
+ struct StringPatternPointerCompare {
+ bool operator()(StringPattern* lhs, StringPattern* rhs) const;
};
- // Set to ensure that we generate only one SubstringPattern for each content
- // of SubstringPattern::pattern().
- typedef std::set<SubstringPattern*, SubstringPatternPointerCompare>
+ // Set to ensure that we generate only one StringPattern for each content
+ // of StringPattern::pattern().
+ typedef std::set<StringPattern*, StringPatternPointerCompare>
PatternSingletons;
- PatternSingletons pattern_singletons_;
+ PatternSingletons substring_pattern_singletons_;
+ PatternSingletons regex_pattern_singletons_;
DISALLOW_COPY_AND_ASSIGN(URLMatcherConditionFactory);
};
@@ -244,9 +258,8 @@ class URLMatcherConditionSet : public base::RefCounted<URLMatcherConditionSet> {
ID id() const { return id_; }
const Conditions& conditions() const { return conditions_; }
- bool IsMatch(
- const std::set<SubstringPattern::ID>& matching_substring_patterns,
- const GURL& url) const;
+ bool IsMatch(const std::set<StringPattern::ID>& matching_patterns,
+ const GURL& url) const;
private:
friend class base::RefCounted<URLMatcherConditionSet>;
@@ -296,6 +309,7 @@ class URLMatcher {
private:
void UpdateSubstringSetMatcher(bool full_url_conditions);
+ void UpdateRegexSetMatcher();
void UpdateTriggers();
void UpdateConditionFactory();
void UpdateInternalDatastructures();
@@ -309,15 +323,16 @@ class URLMatcher {
URLMatcherConditionSets;
URLMatcherConditionSets url_matcher_condition_sets_;
- // Maps a SubstringPattern ID to the URLMatcherConditions that need to
- // be triggered in case of a SubstringPattern match.
- std::map<SubstringPattern::ID, std::set<URLMatcherConditionSet::ID> >
+ // Maps a StringPattern ID to the URLMatcherConditions that need to
+ // be triggered in case of a StringPattern match.
+ std::map<StringPattern::ID, std::set<URLMatcherConditionSet::ID> >
substring_match_triggers_;
SubstringSetMatcher full_url_matcher_;
SubstringSetMatcher url_component_matcher_;
- std::set<const SubstringPattern*> registered_full_url_patterns_;
- std::set<const SubstringPattern*> registered_url_component_patterns_;
+ RegexSetMatcher regex_set_matcher_;
+ std::set<const StringPattern*> registered_full_url_patterns_;
+ std::set<const StringPattern*> registered_url_component_patterns_;
DISALLOW_COPY_AND_ASSIGN(URLMatcher);
};
« no previous file with comments | « chrome/common/extensions/matcher/substring_set_matcher_unittest.cc ('k') | chrome/common/extensions/matcher/url_matcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698