1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // Patterns used in content setting rules.
7 #ifndef CHROME_COMMON_CONTENT_SETTINGS_PATTERN_H_
8 #define CHROME_COMMON_CONTENT_SETTINGS_PATTERN_H_
13 #include "base/basictypes.h"
14 #include "base/compiler_specific.h"
15 #include "base/gtest_prod_util.h"
21 namespace content_settings
{
29 // A pattern used in content setting rules. See |IsValid| for a description of
31 class ContentSettingsPattern
{
33 // Each content settings pattern describes a set of origins. Patterns, and the
34 // sets they describe, have specific relations. |Relation| describes the
35 // relation of two patterns A and B. When pattern A is compared with pattern B
36 // (A compare B) interesting relations are:
38 // Pattern A and B are identical. The patterns are equal.
40 // - DISJOINT_ORDER_PRE:
41 // Pattern A and B have no intersection. A and B never match the origin of
42 // a URL at the same time. But pattern A has a higher precedence than
43 // pattern B when patterns are sorted.
45 // - DISJOINT_ORDER_POST:
46 // Pattern A and B have no intersection. A and B never match the origin of
47 // a URL at the same time. But pattern A has a lower precedence than
48 // pattern B when patterns are sorted.
51 // Pattern A and B have an intersection. But pattern B has a higher
52 // precedence than pattern A for URLs that are matched by both pattern.
55 // Pattern A and B have an intersection. But pattern A has a higher
56 // precedence than pattern B for URLs that are matched by both pattern.
58 DISJOINT_ORDER_POST
= -2,
62 DISJOINT_ORDER_PRE
= 2,
69 // Lowercase string of the URL scheme to match. This string is empty if the
70 // |is_scheme_wildcard| flag is set.
73 // True if the scheme wildcard is set.
74 bool is_scheme_wildcard
;
76 // Normalized string that is either of the following:
80 // - empty string if the |is_host_wildcard flag is set.
83 // True if the domain wildcard is set.
84 bool has_domain_wildcard
;
86 // String with the port to match. This string is empty if the
87 // |is_port_wildcard| flag is set.
90 // True if the port wildcard is set.
91 bool is_port_wildcard
;
93 // TODO(markusheintz): Needed for legacy reasons. Remove. Path
94 // specification. Only used for content settings pattern with a "file"
98 // True if the path wildcard is set.
99 bool is_path_wildcard
;
102 class BuilderInterface
{
104 virtual ~BuilderInterface() {}
106 virtual BuilderInterface
* WithPort(const std::string
& port
) = 0;
108 virtual BuilderInterface
* WithPortWildcard() = 0;
110 virtual BuilderInterface
* WithHost(const std::string
& host
) = 0;
112 virtual BuilderInterface
* WithDomainWildcard() = 0;
114 virtual BuilderInterface
* WithScheme(const std::string
& scheme
) = 0;
116 virtual BuilderInterface
* WithSchemeWildcard() = 0;
118 virtual BuilderInterface
* WithPath(const std::string
& path
) = 0;
120 virtual BuilderInterface
* WithPathWildcard() = 0;
122 virtual BuilderInterface
* Invalid() = 0;
124 // Returns a content settings pattern according to the current configuration
126 virtual ContentSettingsPattern
Build() = 0;
129 static BuilderInterface
* CreateBuilder(bool use_legacy_validate
);
131 // The version of the pattern format implemented.
132 static const int kContentSettingsPatternVersion
;
134 // The format of a domain wildcard.
135 static const char* kDomainWildcard
;
137 // The length of kDomainWildcard (without the trailing '\0').
138 static const size_t kDomainWildcardLength
;
140 // Returns a wildcard content settings pattern that matches all possible valid
142 static ContentSettingsPattern
Wildcard();
144 // Returns a pattern that matches the scheme and host of this URL, as well as
145 // all subdomains and ports.
146 static ContentSettingsPattern
FromURL(const GURL
& url
);
148 // Returns a pattern that matches exactly this URL.
149 static ContentSettingsPattern
FromURLNoWildcard(const GURL
& url
);
151 // Returns a pattern that matches the given pattern specification.
152 // Valid patterns specifications are:
153 // - [*.]domain.tld (matches domain.tld and all sub-domains)
154 // - host (matches an exact hostname)
155 // - scheme://host:port (supported schemes: http,https)
156 // - scheme://[*.]domain.tld:port (supported schemes: http,https)
157 // - file://path (The path has to be an absolute path and start with a '/')
158 // - a.b.c.d (matches an exact IPv4 ip)
159 // - [a:b:c:d:e:f:g:h] (matches an exact IPv6 ip)
160 static ContentSettingsPattern
FromString(const std::string
& pattern_spec
);
162 static ContentSettingsPattern
LegacyFromString(
163 const std::string
& pattern_spec
);
165 // Constructs an empty pattern. Empty patterns are invalid patterns. Invalid
166 // patterns match nothing.
167 ContentSettingsPattern();
169 // Serializes the pattern to an IPC message or deserializes it.
170 void WriteToMessage(IPC::Message
* m
) const;
171 bool ReadFromMessage(const IPC::Message
* m
, PickleIterator
* iter
);
173 // True if this is a valid pattern.
174 bool IsValid() const { return is_valid_
; }
176 // True if |url| matches this pattern.
177 bool Matches(const GURL
& url
) const;
179 // True if this pattern matches all hosts (i.e. it has a host wildcard).
180 bool MatchesAllHosts() const;
182 // Returns a std::string representation of this pattern.
183 const std::string
ToString() const;
185 // Compares the pattern with a given |other| pattern and returns the
186 // |Relation| of the two patterns.
187 Relation
Compare(const ContentSettingsPattern
& other
) const;
189 // Returns true if the pattern and the |other| pattern are identical.
190 bool operator==(const ContentSettingsPattern
& other
) const;
192 // Returns true if the pattern and the |other| pattern are not identical.
193 bool operator!=(const ContentSettingsPattern
& other
) const;
195 // Returns true if the pattern has a lower priority than the |other| pattern.
196 bool operator<(const ContentSettingsPattern
& other
) const;
198 // Returns true if the pattern has a higher priority than the |other| pattern.
199 bool operator>(const ContentSettingsPattern
& other
) const;
202 friend class content_settings::PatternParser
;
203 friend class Builder
;
204 FRIEND_TEST_ALL_PREFIXES(ContentSettingsPatternParserTest
, SerializePatterns
);
206 class Builder
: public BuilderInterface
{
208 explicit Builder(bool use_legacy_validate
);
211 // Overrides BuilderInterface
212 virtual BuilderInterface
* WithPort(const std::string
& port
) OVERRIDE
;
214 virtual BuilderInterface
* WithPortWildcard() OVERRIDE
;
216 virtual BuilderInterface
* WithHost(const std::string
& host
) OVERRIDE
;
218 virtual BuilderInterface
* WithDomainWildcard() OVERRIDE
;
220 virtual BuilderInterface
* WithScheme(const std::string
& scheme
) OVERRIDE
;
222 virtual BuilderInterface
* WithSchemeWildcard() OVERRIDE
;
224 virtual BuilderInterface
* WithPath(const std::string
& path
) OVERRIDE
;
226 virtual BuilderInterface
* WithPathWildcard() OVERRIDE
;
228 virtual BuilderInterface
* Invalid() OVERRIDE
;
230 virtual ContentSettingsPattern
Build() OVERRIDE
;
233 // Canonicalizes the pattern parts so that they are ASCII only, either
234 // in original (if it was already ASCII) or punycode form. Returns true if
235 // the canonicalization was successful.
236 static bool Canonicalize(PatternParts
* parts
);
238 // Returns true when the pattern |parts| represent a valid pattern.
239 static bool Validate(const PatternParts
& parts
);
241 static bool LegacyValidate(const PatternParts
& parts
);
245 bool use_legacy_validate_
;
249 DISALLOW_COPY_AND_ASSIGN(Builder
);
252 static Relation
CompareScheme(
253 const ContentSettingsPattern::PatternParts
& parts
,
254 const ContentSettingsPattern::PatternParts
& other_parts
);
256 static Relation
CompareHost(
257 const ContentSettingsPattern::PatternParts
& parts
,
258 const ContentSettingsPattern::PatternParts
& other_parts
);
260 static Relation
ComparePort(
261 const ContentSettingsPattern::PatternParts
& parts
,
262 const ContentSettingsPattern::PatternParts
& other_parts
);
264 static bool Validate(const PatternParts
& parts
);
266 ContentSettingsPattern(const PatternParts
& parts
, bool valid
);
273 // Stream operator so ContentSettingsPattern can be used in assertion
275 inline std::ostream
& operator<<(
276 std::ostream
& out
, const ContentSettingsPattern
& pattern
) {
277 return out
<< pattern
.ToString();
280 #endif // CHROME_COMMON_CONTENT_SETTINGS_PATTERN_H_