1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* ***** BEGIN LICENSE BLOCK *****
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * The contents of this file are subject to the Mozilla Public License Version
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 1.1 (the "License"); you may not use this file except in compliance with
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the License. You may obtain a copy of the License at
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * http://www.mozilla.org/MPL/
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Software distributed under the License is distributed on an "AS IS" basis,
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * for the specific language governing rights and limitations under the
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * License.
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * The Original Code is Mozilla TLD Service
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * The Initial Developer of the Original Code is
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Google Inc.
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Portions created by the Initial Developer are Copyright (C) 2006
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the Initial Developer. All Rights Reserved.
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Contributor(s):
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *   Pamela Greene <pamg.bugs@gmail.com> (original author)
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Alternatively, the contents of this file may be used under the terms of
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * either the GNU General Public License Version 2 or later (the "GPL"), or
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * in which case the provisions of the GPL or the LGPL are applicable instead
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * of those above. If you wish to allow use of your version of this file only
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * under the terms of either the GPL or the LGPL, and not to allow others to
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * use your version of this file under the terms of the MPL, indicate your
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * decision by deleting the provisions above and replace them with the notice
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * and other provisions required by the GPL or the LGPL. If you do not delete
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the provisions above, a recipient may use your version of this file under
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the terms of any one of the MPL, the GPL or the LGPL.
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * ***** END LICENSE BLOCK ***** */
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// NB: Modelled after Mozilla's code (originally written by Pamela Greene,
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// later modified by others), but almost entirely rewritten for Chrome.
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/*
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  (Documentation based on the Mozilla documentation currently at
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  http://wiki.mozilla.org/Gecko:Effective_TLD_Service, written by the same
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  author.)
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The RegistryControlledDomainService examines the hostname of a GURL passed to
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  it and determines the longest portion that is controlled by a registrar.
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Although technically the top-level domain (TLD) for a hostname is the last
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  dot-portion of the name (such as .com or .org), many domains (such as co.uk)
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  function as though they were TLDs, allocating any number of more specific,
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  essentially unrelated names beneath them.  For example, .uk is a TLD, but
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  nobody is allowed to register a domain directly under .uk; the "effective"
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TLDs are ac.uk, co.uk, and so on.  We wouldn't want to allow any site in
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  *.co.uk to set a cookie for the entire co.uk domain, so it's important to be
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  able to identify which higher-level domains function as effective TLDs and
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  which can be registered.
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The service obtains its information about effective TLDs from a text resource
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  that must be in the following format:
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  * It should use plain ASCII.
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  * It should contain one domain rule per line, terminated with \n, with nothing
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    else on the line.  (The last rule in the file may omit the ending \n.)
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  * Rules should have been normalized using the same canonicalization that GURL
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    applies.  For ASCII, that means they're not case-sensitive, among other
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    things; other normalizations are applied for other characters.
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  * Each rule should list the entire TLD-like domain name, with any subdomain
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    portions separated by dots (.) as usual.
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  * Rules should neither begin nor end with a dot.
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  * If a hostname matches more than one rule, the most specific rule (that is,
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    the one with more dot-levels) will be used.
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  * Other than in the case of wildcards (see below), rules do not implicitly
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    include their subcomponents.  For example, "bar.baz.uk" does not imply
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    "baz.uk", and if "bar.baz.uk" is the only rule in the list, "foo.bar.baz.uk"
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    will match, but "baz.uk" and "qux.baz.uk" won't.
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  * The wildcard character '*' will match any valid sequence of characters.
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  * Wildcards may only appear as the entire most specific level of a rule.  That
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    is, a wildcard must come at the beginning of a line and must be followed by
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    a dot.  (You may not use a wildcard as the entire rule.)
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  * A wildcard rule implies a rule for the entire non-wildcard portion.  For
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    example, the rule "*.foo.bar" implies the rule "foo.bar" (but not the rule
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    "bar").  This is typically important in the case of exceptions (see below).
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  * The exception character '!' before a rule marks an exception to a wildcard
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    rule.  If your rules are "*.tokyo.jp" and "!pref.tokyo.jp", then
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    "a.b.tokyo.jp" has an effective TLD of "b.tokyo.jp", but "a.pref.tokyo.jp"
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    has an effective TLD of "tokyo.jp" (the exception prevents the wildcard
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    match, and we thus fall through to matching on the implied "tokyo.jp" rule
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    from the wildcard).
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  * If you use an exception rule without a corresponding wildcard rule, the
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    behavior is undefined.
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Firefox has a very similar service, and it's their data file we use to
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  construct our resource.  However, the data expected by this implementation
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  differs from the Mozilla file in several important ways:
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott   (1) We require that all single-level TLDs (com, edu, etc.) be explicitly
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott       listed.  As of this writing, Mozilla's file includes the single-level
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott       TLDs too, but that might change.
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott   (2) Our data is expected be in pure ASCII: all UTF-8 or otherwise encoded
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott       items must already have been normalized.
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott   (3) We do not allow comments, rule notes, blank lines, or line endings other
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott       than LF.
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Rules are also expected to be syntactically valid.
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The utility application tld_cleanup.exe converts a Mozilla-style file into a
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Chrome one, making sure that single-level TLDs are explicitly listed, using
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GURL to normalize rules, and validating the rules.
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott*/
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_BASE_REGISTRY_CONTROLLED_DOMAIN_H_
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_BASE_REGISTRY_CONTROLLED_DOMAIN_H_
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string>
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h"
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass GURL;
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename T>
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct DefaultSingletonTraits;
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct DomainRule;
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net {
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct RegistryControlledDomainServiceSingletonTraits;
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This class is a singleton.
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass RegistryControlledDomainService {
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott   ~RegistryControlledDomainService() { }
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns the registered, organization-identifying host and all its registry
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // information, but no subdomains, from the given GURL.  Returns an empty
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // string if the GURL is invalid, has no host (e.g. a file: URL), has multiple
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // trailing dots, is an IP address, has only one subcomponent (i.e. no dots
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // other than leading/trailing ones), or is itself a recognized registry
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // identifier.  If no matching rule is found in the effective-TLD data (or in
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // the default data, if the resource failed to load), the last subcomponent of
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // the host is assumed to be the registry.
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Examples:
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://www.google.com/file.html -> "google.com"  (com)
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://..google.com/file.html   -> "google.com"  (com)
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://google.com./file.html    -> "google.com." (com)
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://a.b.co.uk/file.html      -> "b.co.uk"     (co.uk)
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   file:///C:/bar.html             -> ""            (no host)
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://foo.com../file.html      -> ""            (multiple trailing dots)
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://192.168.0.1/file.html    -> ""            (IP address)
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://bar/file.html            -> ""            (no subcomponents)
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://co.uk/file.html          -> ""            (host is a registry)
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://foo.bar/file.html        -> "foo.bar"     (no rule; assume bar)
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static std::string GetDomainAndRegistry(const GURL& gurl);
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Like the GURL version, but takes a host (which is canonicalized internally)
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // instead of a full GURL.
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static std::string GetDomainAndRegistry(const std::string& host);
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static std::string GetDomainAndRegistry(const std::wstring& host);
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This convenience function returns true if the two GURLs both have hosts
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // and one of the following is true:
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // * They each have a known domain and registry, and it is the same for both
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   URLs.  Note that this means the trailing dot, if any, must match too.
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // * They don't have known domains/registries, but the hosts are identical.
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Effectively, callers can use this function to check whether the input URLs
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // represent hosts "on the same site".
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static bool SameDomainOrHost(const GURL& gurl1, const GURL& gurl2);
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Finds the length in bytes of the registrar portion of the host in the
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // given GURL.  Returns std::string::npos if the GURL is invalid or has no
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // host (e.g. a file: URL).  Returns 0 if the GURL has multiple trailing dots,
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // is an IP address, has no subcomponents, or is itself a recognized registry
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // identifier.  If no matching rule is found in the effective-TLD data (or in
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // the default data, if the resource failed to load), returns 0 if
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // |allow_unknown_registries| is false, or the length of the last subcomponent
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // if |allow_unknown_registries| is true.
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Examples:
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://www.google.com/file.html -> 3                 (com)
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://..google.com/file.html   -> 3                 (com)
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://google.com./file.html    -> 4                 (com)
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://a.b.co.uk/file.html      -> 5                 (co.uk)
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   file:///C:/bar.html             -> std::string::npos (no host)
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://foo.com../file.html      -> 0                 (multiple trailing
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //                                                         dots)
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://192.168.0.1/file.html    -> 0                 (IP address)
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://bar/file.html            -> 0                 (no subcomponents)
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://co.uk/file.html          -> 0                 (host is a registry)
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   http://foo.bar/file.html        -> 0 or 3, depending (no rule; assume
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //                                                         bar)
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static size_t GetRegistryLength(const GURL& gurl,
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                  bool allow_unknown_registries);
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Like the GURL version, but takes a host (which is canonicalized internally)
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // instead of a full GURL.
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static size_t GetRegistryLength(const std::string& host,
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                  bool allow_unknown_registries);
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static size_t GetRegistryLength(const std::wstring& host,
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                  bool allow_unknown_registries);
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected:
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The entire protected API is only for unit testing.  I mean it.  Don't make
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // me come over there!
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  RegistryControlledDomainService();
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Set the RegistryControledDomainService instance to be used internally.
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // |instance| will supersede the singleton instance normally used.  If
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // |instance| is NULL, normal behavior is restored, and internal operations
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // will return to using the singleton.  This function always returns the
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // instance set by the most recent call to SetInstance.
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static RegistryControlledDomainService* SetInstance(
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      RegistryControlledDomainService* instance);
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  typedef const struct DomainRule* (*FindDomainPtr)(const char *, unsigned int);
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Used for unit tests, so that a different perfect hash map from the full
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // list is used.
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static void UseFindDomainFunction(FindDomainPtr function);
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // To allow construction of the internal singleton instance.
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  friend struct DefaultSingletonTraits<RegistryControlledDomainService>;
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns the singleton instance, after attempting to initialize it.
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // NOTE that if the effective-TLD data resource can't be found, the instance
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // will be initialized and continue operation with simple default TLD data.
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static RegistryControlledDomainService* GetInstance();
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Internal workings of the static public methods.  See above.
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static std::string GetDomainAndRegistryImpl(const std::string& host);
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  size_t GetRegistryLengthImpl(const std::string& host,
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                               bool allow_unknown_registries);
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Function that returns a DomainRule given a domain.
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FindDomainPtr find_domain_function_;
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DISALLOW_COPY_AND_ASSIGN(RegistryControlledDomainService);
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace net
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // NET_BASE_REGISTRY_CONTROLLED_DOMAIN_H_
242