| // Copyright 2016 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef COMPONENTS_URL_PATTERN_INDEX_URL_PATTERN_H_ | 
 | #define COMPONENTS_URL_PATTERN_INDEX_URL_PATTERN_H_ | 
 |  | 
 | #include <iosfwd> | 
 |  | 
 | #include "base/strings/string_piece.h" | 
 | #include "components/url_pattern_index/proto/rules.pb.h" | 
 | #include "third_party/abseil-cpp/absl/types/optional.h" | 
 | #include "url/third_party/mozilla/url_parse.h" | 
 |  | 
 | class GURL; | 
 |  | 
 | namespace url_pattern_index { | 
 |  | 
 | namespace flat { | 
 | struct UrlRule;  // The FlatBuffers version of UrlRule. | 
 | } | 
 |  | 
 | // The structure used to mirror a URL pattern regardless of the representation | 
 | // of the UrlRule that owns it, and to match it against URLs. | 
 | class UrlPattern { | 
 |  public: | 
 |   enum class MatchCase { | 
 |     kTrue, | 
 |     kFalse, | 
 |   }; | 
 |  | 
 |   // A wrapper over a GURL to reduce redundant computation. | 
 |   class UrlInfo { | 
 |    public: | 
 |     // The |url| must outlive this instance. | 
 |     UrlInfo(const GURL& url); | 
 |  | 
 |     UrlInfo(const UrlInfo&) = delete; | 
 |     UrlInfo& operator=(const UrlInfo&) = delete; | 
 |  | 
 |     ~UrlInfo(); | 
 |  | 
 |     base::StringPiece spec() const { return spec_; } | 
 |     base::StringPiece GetLowerCaseSpec() const; | 
 |     url::Component host() const { return host_; } | 
 |     base::StringPiece GetStringHost() const; | 
 |  | 
 |    private: | 
 |     // The url spec. | 
 |     const base::StringPiece spec_; | 
 |     // String to hold the lazily computed lower cased spec. | 
 |     mutable std::string lower_case_spec_owner_; | 
 |     // Reference to the lower case spec. Computed lazily. | 
 |     mutable absl::optional<base::StringPiece> lower_case_spec_cached_; | 
 |  | 
 |     // The url host component. | 
 |     const url::Component host_; | 
 |   }; | 
 |  | 
 |   UrlPattern(); | 
 |  | 
 |   // Creates a |url_pattern| of a certain |type| and case-sensitivity. | 
 |   UrlPattern(base::StringPiece url_pattern, | 
 |              proto::UrlPatternType type = proto::URL_PATTERN_TYPE_WILDCARDED, | 
 |              MatchCase match_case = MatchCase::kFalse); | 
 |  | 
 |   // Creates a WILDCARDED |url_pattern| with the specified anchors. | 
 |   UrlPattern(base::StringPiece url_pattern, | 
 |              proto::AnchorType anchor_left, | 
 |              proto::AnchorType anchor_right); | 
 |  | 
 |   // The passed in |rule| must outlive the created instance. | 
 |   explicit UrlPattern(const flat::UrlRule& rule); | 
 |  | 
 |   UrlPattern(const UrlPattern&) = delete; | 
 |   UrlPattern& operator=(const UrlPattern&) = delete; | 
 |  | 
 |   ~UrlPattern(); | 
 |  | 
 |   proto::UrlPatternType type() const { return type_; } | 
 |   base::StringPiece url_pattern() const { return url_pattern_; } | 
 |   proto::AnchorType anchor_left() const { return anchor_left_; } | 
 |   proto::AnchorType anchor_right() const { return anchor_right_; } | 
 |   bool match_case() const { return match_case_ == MatchCase::kTrue; } | 
 |  | 
 |   // Returns whether the |url| matches the URL |pattern|. Requires the type of | 
 |   // |this| pattern to be either SUBSTRING or WILDCARDED. | 
 |   // | 
 |   // Splits the pattern into subpatterns separated by '*' wildcards, and | 
 |   // greedily finds each of them in the spec of the |url|. Respects anchors at | 
 |   // either end of the pattern, and '^' separator placeholders when comparing a | 
 |   // subpattern to a subtring of the spec. | 
 |   bool MatchesUrl(const UrlInfo& url) const; | 
 |  | 
 |  private: | 
 |   // TODO(pkalinnikov): Store flat:: types instead of proto::, in order to avoid | 
 |   // conversions in IndexedRuleset. | 
 |   proto::UrlPatternType type_ = proto::URL_PATTERN_TYPE_UNSPECIFIED; | 
 |   base::StringPiece url_pattern_; | 
 |  | 
 |   proto::AnchorType anchor_left_ = proto::ANCHOR_TYPE_NONE; | 
 |   proto::AnchorType anchor_right_ = proto::ANCHOR_TYPE_NONE; | 
 |  | 
 |   MatchCase match_case_ = MatchCase::kTrue; | 
 | }; | 
 |  | 
 | // Allow pretty-printing URLPatterns when they are used in GTest assertions. | 
 | std::ostream& operator<<(std::ostream& out, const UrlPattern& pattern); | 
 |  | 
 | }  // namespace url_pattern_index | 
 |  | 
 | #endif  // COMPONENTS_URL_PATTERN_INDEX_URL_PATTERN_H_ |