// Copyright 2013 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef URL_GURL_H_ #define URL_GURL_H_ #include <stddef.h> #include <iosfwd> #include <memory> #include <string> #include <string_view> #include "base/component_export.h" #include "base/debug/alias.h" #include "base/debug/crash_logging.h" #include "base/trace_event/base_tracing_forward.h" #include "url/third_party/mozilla/url_parse.h" #include "url/url_canon.h" #include "url/url_canon_stdstring.h" #include "url/url_constants.h" // Represents a URL. GURL is Google's URL parsing library. // // A parsed canonicalized URL is guaranteed to be UTF-8. Any non-ASCII input // characters are UTF-8 encoded and % escaped to ASCII. // // The string representation of a URL is called the spec(). Getting the // spec will assert if the URL is invalid to help protect against malicious // URLs. If you want the "best effort" canonicalization of an invalid URL, you // can use possibly_invalid_spec(). Test validity with is_valid(). Data and // javascript URLs use GetContent() to extract the data. // // This class has existence checkers and getters for the various components of // a URL. Existence is different than being nonempty. "http://www.google.com/?" // has a query that just happens to be empty, and has_query() will return true // while the query getters will return the empty string. // // Prefer not to modify a URL using string operations (though sometimes this is // unavoidable). Instead, use ReplaceComponents which can replace or delete // multiple parts of a URL in one step, doesn't re-canonicalize unchanged // sections, and avoids some screw-ups. An example is creating a URL with a // path that contains a literal '#'. Using string concatenation will generate a // URL with a truncated path and a reference fragment, while ReplaceComponents // will know to escape this and produce the desired result. // // WARNING: While there is no length limit on GURLs, the Mojo serialization // code will replace any very long URL with an invalid GURL. // See url::mojom::kMaxURLChars for more details. class COMPONENT_EXPORT(URL) GURL { … }; // Stream operator so GURL can be used in assertion statements. COMPONENT_EXPORT(…) std::ostream& operator<<(std::ostream& out, const GURL& url); COMPONENT_EXPORT(…) bool operator==(const GURL& x, const GURL& y); // Equality operator for comparing raw spec_. This should be used in place of // url == GURL(spec) where |spec| is known (i.e. constants). This is to prevent // needlessly re-parsing |spec| into a temporary GURL. COMPONENT_EXPORT(…) bool operator==(const GURL& x, std::string_view spec); // DEBUG_ALIAS_FOR_GURL(var_name, url) copies |url| into a new stack-allocated // variable named |<var_name>|. This helps ensure that the value of |url| gets // preserved in crash dumps. #define DEBUG_ALIAS_FOR_GURL(var_name, url) … namespace url::debug { class COMPONENT_EXPORT(URL) ScopedUrlCrashKey { … }; } // namespace url::debug #endif // URL_GURL_H_