xref: /aosp_15_r20/external/cronet/url/url_util.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef URL_URL_UTIL_H_
6*6777b538SAndroid Build Coastguard Worker #define URL_URL_UTIL_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <memory>
9*6777b538SAndroid Build Coastguard Worker #include <string>
10*6777b538SAndroid Build Coastguard Worker #include <string_view>
11*6777b538SAndroid Build Coastguard Worker #include <vector>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include "base/component_export.h"
14*6777b538SAndroid Build Coastguard Worker #include "url/third_party/mozilla/url_parse.h"
15*6777b538SAndroid Build Coastguard Worker #include "url/url_canon.h"
16*6777b538SAndroid Build Coastguard Worker #include "url/url_constants.h"
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker namespace url {
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker // Init ------------------------------------------------------------------------
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker // Used for tests that need to reset schemes. Note that this can only be used
23*6777b538SAndroid Build Coastguard Worker // in conjunction with ScopedSchemeRegistryForTests.
24*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) void ClearSchemesForTests();
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker class ScopedSchemeRegistryInternal;
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker // Stores the SchemeRegistry upon creation, allowing tests to modify a copy of
29*6777b538SAndroid Build Coastguard Worker // it, and restores the original SchemeRegistry when deleted.
COMPONENT_EXPORT(URL)30*6777b538SAndroid Build Coastguard Worker class COMPONENT_EXPORT(URL) ScopedSchemeRegistryForTests {
31*6777b538SAndroid Build Coastguard Worker  public:
32*6777b538SAndroid Build Coastguard Worker   ScopedSchemeRegistryForTests();
33*6777b538SAndroid Build Coastguard Worker   ~ScopedSchemeRegistryForTests();
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker  private:
36*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<ScopedSchemeRegistryInternal> internal_;
37*6777b538SAndroid Build Coastguard Worker };
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker // Schemes ---------------------------------------------------------------------
40*6777b538SAndroid Build Coastguard Worker 
41*6777b538SAndroid Build Coastguard Worker // Changes the behavior of SchemeHostPort / Origin to allow non-standard schemes
42*6777b538SAndroid Build Coastguard Worker // to be specified, instead of canonicalizing them to an invalid SchemeHostPort
43*6777b538SAndroid Build Coastguard Worker // or opaque Origin, respectively. This is used for Android WebView backwards
44*6777b538SAndroid Build Coastguard Worker // compatibility, which allows the use of custom schemes: content hosted in
45*6777b538SAndroid Build Coastguard Worker // Android WebView assumes that one URL with a non-standard scheme will be
46*6777b538SAndroid Build Coastguard Worker // same-origin to another URL with the same non-standard scheme.
47*6777b538SAndroid Build Coastguard Worker //
48*6777b538SAndroid Build Coastguard Worker // Not thread-safe.
49*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) void EnableNonStandardSchemesForAndroidWebView();
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker // Whether or not SchemeHostPort and Origin allow non-standard schemes.
52*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) bool AllowNonStandardSchemesForAndroidWebView();
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker // The following Add*Scheme method are not threadsafe and can not be called
55*6777b538SAndroid Build Coastguard Worker // concurrently with any other url_util function. They will assert if the lists
56*6777b538SAndroid Build Coastguard Worker // of schemes have been locked (see LockSchemeRegistries), or used.
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker // Adds an application-defined scheme to the internal list of "standard-format"
59*6777b538SAndroid Build Coastguard Worker // URL schemes. A standard-format scheme adheres to what RFC 3986 calls "generic
60*6777b538SAndroid Build Coastguard Worker // URI syntax" (https://tools.ietf.org/html/rfc3986#section-3).
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
63*6777b538SAndroid Build Coastguard Worker void AddStandardScheme(const char* new_scheme, SchemeType scheme_type);
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker // Returns the list of schemes registered for "standard" URLs.  Note, this
66*6777b538SAndroid Build Coastguard Worker // should not be used if you just need to check if your protocol is standard
67*6777b538SAndroid Build Coastguard Worker // or not.  Instead use the IsStandard() function above as its much more
68*6777b538SAndroid Build Coastguard Worker // efficient.  This function should only be used where you need to perform
69*6777b538SAndroid Build Coastguard Worker // other operations against the standard scheme list.
70*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
71*6777b538SAndroid Build Coastguard Worker std::vector<std::string> GetStandardSchemes();
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker // Adds an application-defined scheme to the internal list of schemes allowed
74*6777b538SAndroid Build Coastguard Worker // for referrers.
75*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
76*6777b538SAndroid Build Coastguard Worker void AddReferrerScheme(const char* new_scheme, SchemeType scheme_type);
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker // Adds an application-defined scheme to the list of schemes that do not trigger
79*6777b538SAndroid Build Coastguard Worker // mixed content warnings.
80*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) void AddSecureScheme(const char* new_scheme);
81*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) const std::vector<std::string>& GetSecureSchemes();
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker // Adds an application-defined scheme to the list of schemes that normal pages
84*6777b538SAndroid Build Coastguard Worker // cannot link to or access (i.e., with the same security rules as those applied
85*6777b538SAndroid Build Coastguard Worker // to "file" URLs).
86*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) void AddLocalScheme(const char* new_scheme);
87*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) const std::vector<std::string>& GetLocalSchemes();
88*6777b538SAndroid Build Coastguard Worker 
89*6777b538SAndroid Build Coastguard Worker // Adds an application-defined scheme to the list of schemes that cause pages
90*6777b538SAndroid Build Coastguard Worker // loaded with them to not have access to pages loaded with any other URL
91*6777b538SAndroid Build Coastguard Worker // scheme.
92*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) void AddNoAccessScheme(const char* new_scheme);
93*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) const std::vector<std::string>& GetNoAccessSchemes();
94*6777b538SAndroid Build Coastguard Worker 
95*6777b538SAndroid Build Coastguard Worker // Adds an application-defined scheme to the list of schemes that can be sent
96*6777b538SAndroid Build Coastguard Worker // CORS requests.
97*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) void AddCorsEnabledScheme(const char* new_scheme);
98*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) const std::vector<std::string>& GetCorsEnabledSchemes();
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker // Adds an application-defined scheme to the list of web schemes that can be
101*6777b538SAndroid Build Coastguard Worker // used by web to store data (e.g. cookies, local storage, ...). This is
102*6777b538SAndroid Build Coastguard Worker // to differentiate them from schemes that can store data but are not used on
103*6777b538SAndroid Build Coastguard Worker // web (e.g. application's internal schemes) or schemes that are used on web but
104*6777b538SAndroid Build Coastguard Worker // cannot store data.
105*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) void AddWebStorageScheme(const char* new_scheme);
106*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) const std::vector<std::string>& GetWebStorageSchemes();
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker // Adds an application-defined scheme to the list of schemes that can bypass the
109*6777b538SAndroid Build Coastguard Worker // Content-Security-Policy (CSP) checks.
110*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) void AddCSPBypassingScheme(const char* new_scheme);
111*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) const std::vector<std::string>& GetCSPBypassingSchemes();
112*6777b538SAndroid Build Coastguard Worker 
113*6777b538SAndroid Build Coastguard Worker // Adds an application-defined scheme to the list of schemes that are strictly
114*6777b538SAndroid Build Coastguard Worker // empty documents, allowing them to commit synchronously.
115*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) void AddEmptyDocumentScheme(const char* new_scheme);
116*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) const std::vector<std::string>& GetEmptyDocumentSchemes();
117*6777b538SAndroid Build Coastguard Worker 
118*6777b538SAndroid Build Coastguard Worker // Adds a scheme with a predefined default handler.
119*6777b538SAndroid Build Coastguard Worker //
120*6777b538SAndroid Build Coastguard Worker // This pair of strings must be normalized protocol handler parameters as
121*6777b538SAndroid Build Coastguard Worker // described in the Custom Handler specification.
122*6777b538SAndroid Build Coastguard Worker // https://html.spec.whatwg.org/multipage/system-state.html#normalize-protocol-handler-parameters
123*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
124*6777b538SAndroid Build Coastguard Worker void AddPredefinedHandlerScheme(const char* new_scheme, const char* handler);
125*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
126*6777b538SAndroid Build Coastguard Worker std::vector<std::pair<std::string, std::string>> GetPredefinedHandlerSchemes();
127*6777b538SAndroid Build Coastguard Worker 
128*6777b538SAndroid Build Coastguard Worker // Sets a flag to prevent future calls to Add*Scheme from succeeding.
129*6777b538SAndroid Build Coastguard Worker //
130*6777b538SAndroid Build Coastguard Worker // This is designed to help prevent errors for multithreaded applications.
131*6777b538SAndroid Build Coastguard Worker // Normal usage would be to call Add*Scheme for your custom schemes at
132*6777b538SAndroid Build Coastguard Worker // the beginning of program initialization, and then LockSchemeRegistries. This
133*6777b538SAndroid Build Coastguard Worker // prevents future callers from mistakenly calling Add*Scheme when the
134*6777b538SAndroid Build Coastguard Worker // program is running with multiple threads, where such usage would be
135*6777b538SAndroid Build Coastguard Worker // dangerous.
136*6777b538SAndroid Build Coastguard Worker //
137*6777b538SAndroid Build Coastguard Worker // We could have had Add*Scheme use a lock instead, but that would add
138*6777b538SAndroid Build Coastguard Worker // some platform-specific dependencies we don't otherwise have now, and is
139*6777b538SAndroid Build Coastguard Worker // overkill considering the normal usage is so simple.
140*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) void LockSchemeRegistries();
141*6777b538SAndroid Build Coastguard Worker 
142*6777b538SAndroid Build Coastguard Worker // Locates the scheme in the given string and places it into |found_scheme|,
143*6777b538SAndroid Build Coastguard Worker // which may be NULL to indicate the caller does not care about the range.
144*6777b538SAndroid Build Coastguard Worker //
145*6777b538SAndroid Build Coastguard Worker // Returns whether the given |compare| scheme matches the scheme found in the
146*6777b538SAndroid Build Coastguard Worker // input (if any). The |compare| scheme must be a valid canonical scheme or
147*6777b538SAndroid Build Coastguard Worker // the result of the comparison is undefined.
148*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
149*6777b538SAndroid Build Coastguard Worker bool FindAndCompareScheme(const char* str,
150*6777b538SAndroid Build Coastguard Worker                           int str_len,
151*6777b538SAndroid Build Coastguard Worker                           const char* compare,
152*6777b538SAndroid Build Coastguard Worker                           Component* found_scheme);
153*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
154*6777b538SAndroid Build Coastguard Worker bool FindAndCompareScheme(const char16_t* str,
155*6777b538SAndroid Build Coastguard Worker                           int str_len,
156*6777b538SAndroid Build Coastguard Worker                           const char* compare,
157*6777b538SAndroid Build Coastguard Worker                           Component* found_scheme);
FindAndCompareScheme(const std::string & str,const char * compare,Component * found_scheme)158*6777b538SAndroid Build Coastguard Worker inline bool FindAndCompareScheme(const std::string& str,
159*6777b538SAndroid Build Coastguard Worker                                  const char* compare,
160*6777b538SAndroid Build Coastguard Worker                                  Component* found_scheme) {
161*6777b538SAndroid Build Coastguard Worker   return FindAndCompareScheme(str.data(), static_cast<int>(str.size()),
162*6777b538SAndroid Build Coastguard Worker                               compare, found_scheme);
163*6777b538SAndroid Build Coastguard Worker }
FindAndCompareScheme(const std::u16string & str,const char * compare,Component * found_scheme)164*6777b538SAndroid Build Coastguard Worker inline bool FindAndCompareScheme(const std::u16string& str,
165*6777b538SAndroid Build Coastguard Worker                                  const char* compare,
166*6777b538SAndroid Build Coastguard Worker                                  Component* found_scheme) {
167*6777b538SAndroid Build Coastguard Worker   return FindAndCompareScheme(str.data(), static_cast<int>(str.size()),
168*6777b538SAndroid Build Coastguard Worker                               compare, found_scheme);
169*6777b538SAndroid Build Coastguard Worker }
170*6777b538SAndroid Build Coastguard Worker 
171*6777b538SAndroid Build Coastguard Worker // Returns true if the given scheme identified by |scheme| within |spec| is in
172*6777b538SAndroid Build Coastguard Worker // the list of known standard-format schemes (see AddStandardScheme).
173*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
174*6777b538SAndroid Build Coastguard Worker bool IsStandard(const char* spec, const Component& scheme);
175*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
176*6777b538SAndroid Build Coastguard Worker bool IsStandard(const char16_t* spec, const Component& scheme);
177*6777b538SAndroid Build Coastguard Worker 
178*6777b538SAndroid Build Coastguard Worker bool IsStandardScheme(std::string_view scheme);
179*6777b538SAndroid Build Coastguard Worker 
180*6777b538SAndroid Build Coastguard Worker // Returns true if the given scheme identified by |scheme| within |spec| is in
181*6777b538SAndroid Build Coastguard Worker // the list of allowed schemes for referrers (see AddReferrerScheme).
182*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
183*6777b538SAndroid Build Coastguard Worker bool IsReferrerScheme(const char* spec, const Component& scheme);
184*6777b538SAndroid Build Coastguard Worker 
185*6777b538SAndroid Build Coastguard Worker // Returns true and sets |type| to the SchemeType of the given scheme
186*6777b538SAndroid Build Coastguard Worker // identified by |scheme| within |spec| if the scheme is in the list of known
187*6777b538SAndroid Build Coastguard Worker // standard-format schemes (see AddStandardScheme).
188*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
189*6777b538SAndroid Build Coastguard Worker bool GetStandardSchemeType(const char* spec,
190*6777b538SAndroid Build Coastguard Worker                            const Component& scheme,
191*6777b538SAndroid Build Coastguard Worker                            SchemeType* type);
192*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
193*6777b538SAndroid Build Coastguard Worker bool GetStandardSchemeType(const char16_t* spec,
194*6777b538SAndroid Build Coastguard Worker                            const Component& scheme,
195*6777b538SAndroid Build Coastguard Worker                            SchemeType* type);
196*6777b538SAndroid Build Coastguard Worker 
197*6777b538SAndroid Build Coastguard Worker // Hosts  ----------------------------------------------------------------------
198*6777b538SAndroid Build Coastguard Worker 
199*6777b538SAndroid Build Coastguard Worker // Returns true if the |canonical_host| matches or is in the same domain as the
200*6777b538SAndroid Build Coastguard Worker // given |canonical_domain| string. For example, if the canonicalized hostname
201*6777b538SAndroid Build Coastguard Worker // is "www.google.com", this will return true for "com", "google.com", and
202*6777b538SAndroid Build Coastguard Worker // "www.google.com" domains.
203*6777b538SAndroid Build Coastguard Worker //
204*6777b538SAndroid Build Coastguard Worker // If either of the input StringPieces is empty, the return value is false. The
205*6777b538SAndroid Build Coastguard Worker // input domain should match host canonicalization rules. i.e. it should be
206*6777b538SAndroid Build Coastguard Worker // lowercase except for escape chars.
207*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
208*6777b538SAndroid Build Coastguard Worker bool DomainIs(std::string_view canonical_host,
209*6777b538SAndroid Build Coastguard Worker               std::string_view canonical_domain);
210*6777b538SAndroid Build Coastguard Worker 
211*6777b538SAndroid Build Coastguard Worker // Returns true if the hostname is an IP address. Note: this function isn't very
212*6777b538SAndroid Build Coastguard Worker // cheap, as it must re-parse the host to verify.
213*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL) bool HostIsIPAddress(std::string_view host);
214*6777b538SAndroid Build Coastguard Worker 
215*6777b538SAndroid Build Coastguard Worker // URL library wrappers --------------------------------------------------------
216*6777b538SAndroid Build Coastguard Worker 
217*6777b538SAndroid Build Coastguard Worker // Parses the given spec according to the extracted scheme type. Normal users
218*6777b538SAndroid Build Coastguard Worker // should use the URL object, although this may be useful if performance is
219*6777b538SAndroid Build Coastguard Worker // critical and you don't want to do the heap allocation for the std::string.
220*6777b538SAndroid Build Coastguard Worker //
221*6777b538SAndroid Build Coastguard Worker // As with the Canonicalize* functions, the charset converter can
222*6777b538SAndroid Build Coastguard Worker // be NULL to use UTF-8 (it will be faster in this case).
223*6777b538SAndroid Build Coastguard Worker //
224*6777b538SAndroid Build Coastguard Worker // Returns true if a valid URL was produced, false if not. On failure, the
225*6777b538SAndroid Build Coastguard Worker // output and parsed structures will still be filled and will be consistent,
226*6777b538SAndroid Build Coastguard Worker // but they will not represent a loadable URL.
227*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
228*6777b538SAndroid Build Coastguard Worker bool Canonicalize(const char* spec,
229*6777b538SAndroid Build Coastguard Worker                   int spec_len,
230*6777b538SAndroid Build Coastguard Worker                   bool trim_path_end,
231*6777b538SAndroid Build Coastguard Worker                   CharsetConverter* charset_converter,
232*6777b538SAndroid Build Coastguard Worker                   CanonOutput* output,
233*6777b538SAndroid Build Coastguard Worker                   Parsed* output_parsed);
234*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
235*6777b538SAndroid Build Coastguard Worker bool Canonicalize(const char16_t* spec,
236*6777b538SAndroid Build Coastguard Worker                   int spec_len,
237*6777b538SAndroid Build Coastguard Worker                   bool trim_path_end,
238*6777b538SAndroid Build Coastguard Worker                   CharsetConverter* charset_converter,
239*6777b538SAndroid Build Coastguard Worker                   CanonOutput* output,
240*6777b538SAndroid Build Coastguard Worker                   Parsed* output_parsed);
241*6777b538SAndroid Build Coastguard Worker 
242*6777b538SAndroid Build Coastguard Worker // Resolves a potentially relative URL relative to the given parsed base URL.
243*6777b538SAndroid Build Coastguard Worker // The base MUST be valid. The resulting canonical URL and parsed information
244*6777b538SAndroid Build Coastguard Worker // will be placed in to the given out variables.
245*6777b538SAndroid Build Coastguard Worker //
246*6777b538SAndroid Build Coastguard Worker // The relative need not be relative. If we discover that it's absolute, this
247*6777b538SAndroid Build Coastguard Worker // will produce a canonical version of that URL. See Canonicalize() for more
248*6777b538SAndroid Build Coastguard Worker // about the charset_converter.
249*6777b538SAndroid Build Coastguard Worker //
250*6777b538SAndroid Build Coastguard Worker // Returns true if the output is valid, false if the input could not produce
251*6777b538SAndroid Build Coastguard Worker // a valid URL.
252*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
253*6777b538SAndroid Build Coastguard Worker bool ResolveRelative(const char* base_spec,
254*6777b538SAndroid Build Coastguard Worker                      int base_spec_len,
255*6777b538SAndroid Build Coastguard Worker                      const Parsed& base_parsed,
256*6777b538SAndroid Build Coastguard Worker                      const char* relative,
257*6777b538SAndroid Build Coastguard Worker                      int relative_length,
258*6777b538SAndroid Build Coastguard Worker                      CharsetConverter* charset_converter,
259*6777b538SAndroid Build Coastguard Worker                      CanonOutput* output,
260*6777b538SAndroid Build Coastguard Worker                      Parsed* output_parsed);
261*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
262*6777b538SAndroid Build Coastguard Worker bool ResolveRelative(const char* base_spec,
263*6777b538SAndroid Build Coastguard Worker                      int base_spec_len,
264*6777b538SAndroid Build Coastguard Worker                      const Parsed& base_parsed,
265*6777b538SAndroid Build Coastguard Worker                      const char16_t* relative,
266*6777b538SAndroid Build Coastguard Worker                      int relative_length,
267*6777b538SAndroid Build Coastguard Worker                      CharsetConverter* charset_converter,
268*6777b538SAndroid Build Coastguard Worker                      CanonOutput* output,
269*6777b538SAndroid Build Coastguard Worker                      Parsed* output_parsed);
270*6777b538SAndroid Build Coastguard Worker 
271*6777b538SAndroid Build Coastguard Worker // Replaces components in the given VALID input URL. The new canonical URL info
272*6777b538SAndroid Build Coastguard Worker // is written to output and out_parsed.
273*6777b538SAndroid Build Coastguard Worker //
274*6777b538SAndroid Build Coastguard Worker // Returns true if the resulting URL is valid.
275*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
276*6777b538SAndroid Build Coastguard Worker bool ReplaceComponents(const char* spec,
277*6777b538SAndroid Build Coastguard Worker                        int spec_len,
278*6777b538SAndroid Build Coastguard Worker                        const Parsed& parsed,
279*6777b538SAndroid Build Coastguard Worker                        const Replacements<char>& replacements,
280*6777b538SAndroid Build Coastguard Worker                        CharsetConverter* charset_converter,
281*6777b538SAndroid Build Coastguard Worker                        CanonOutput* output,
282*6777b538SAndroid Build Coastguard Worker                        Parsed* out_parsed);
283*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
284*6777b538SAndroid Build Coastguard Worker bool ReplaceComponents(const char* spec,
285*6777b538SAndroid Build Coastguard Worker                        int spec_len,
286*6777b538SAndroid Build Coastguard Worker                        const Parsed& parsed,
287*6777b538SAndroid Build Coastguard Worker                        const Replacements<char16_t>& replacements,
288*6777b538SAndroid Build Coastguard Worker                        CharsetConverter* charset_converter,
289*6777b538SAndroid Build Coastguard Worker                        CanonOutput* output,
290*6777b538SAndroid Build Coastguard Worker                        Parsed* out_parsed);
291*6777b538SAndroid Build Coastguard Worker 
292*6777b538SAndroid Build Coastguard Worker // String helper functions -----------------------------------------------------
293*6777b538SAndroid Build Coastguard Worker 
294*6777b538SAndroid Build Coastguard Worker enum class DecodeURLMode {
295*6777b538SAndroid Build Coastguard Worker   // UTF-8 decode only. Invalid byte sequences are replaced with U+FFFD.
296*6777b538SAndroid Build Coastguard Worker   kUTF8,
297*6777b538SAndroid Build Coastguard Worker   // Try UTF-8 decoding. If the input contains byte sequences invalid
298*6777b538SAndroid Build Coastguard Worker   // for UTF-8, apply byte to Unicode mapping.
299*6777b538SAndroid Build Coastguard Worker   kUTF8OrIsomorphic,
300*6777b538SAndroid Build Coastguard Worker };
301*6777b538SAndroid Build Coastguard Worker 
302*6777b538SAndroid Build Coastguard Worker // Unescapes the given string using URL escaping rules.
303*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
304*6777b538SAndroid Build Coastguard Worker void DecodeURLEscapeSequences(std::string_view input,
305*6777b538SAndroid Build Coastguard Worker                               DecodeURLMode mode,
306*6777b538SAndroid Build Coastguard Worker                               CanonOutputW* output);
307*6777b538SAndroid Build Coastguard Worker 
308*6777b538SAndroid Build Coastguard Worker // Escapes the given string as defined by the JS method encodeURIComponent. See
309*6777b538SAndroid Build Coastguard Worker // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/encodeURIComponent
310*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
311*6777b538SAndroid Build Coastguard Worker void EncodeURIComponent(std::string_view input, CanonOutput* output);
312*6777b538SAndroid Build Coastguard Worker 
313*6777b538SAndroid Build Coastguard Worker // Returns true if `c` is a character that does not require escaping in
314*6777b538SAndroid Build Coastguard Worker // encodeURIComponent.
315*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/1481056): Remove this when event-level reportEvent is removed
316*6777b538SAndroid Build Coastguard Worker // (if it is still this function's only consumer).
317*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
318*6777b538SAndroid Build Coastguard Worker bool IsURIComponentChar(char c);
319*6777b538SAndroid Build Coastguard Worker 
320*6777b538SAndroid Build Coastguard Worker // Checks an arbitrary string for invalid escape sequences.
321*6777b538SAndroid Build Coastguard Worker //
322*6777b538SAndroid Build Coastguard Worker // A valid percent-encoding is '%' followed by exactly two hex-digits. This
323*6777b538SAndroid Build Coastguard Worker // function returns true if an occurrence of '%' is found and followed by
324*6777b538SAndroid Build Coastguard Worker // anything other than two hex-digits.
325*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT(URL)
326*6777b538SAndroid Build Coastguard Worker bool HasInvalidURLEscapeSequences(std::string_view input);
327*6777b538SAndroid Build Coastguard Worker 
328*6777b538SAndroid Build Coastguard Worker // Check if a scheme is affected by the Android WebView Hack.
329*6777b538SAndroid Build Coastguard Worker bool IsAndroidWebViewHackEnabledScheme(std::string_view scheme);
330*6777b538SAndroid Build Coastguard Worker }  // namespace url
331*6777b538SAndroid Build Coastguard Worker 
332*6777b538SAndroid Build Coastguard Worker #endif  // URL_URL_UTIL_H_
333