| 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);
 | 
|  };
 | 
| 
 |