Update googleurl with the latest code from upstream This updates to Chromium revision 08e460691f1e6de2b7432b527c71f0de94553643 from Tue Sep 05 16:36:25 2023 Change-Id: If47cb6c0c87f2926735d5680b652a7e1b71f7dab
diff --git a/AUTHORS b/AUTHORS index a0f5060..6714ac1 100644 --- a/AUTHORS +++ b/AUTHORS
@@ -45,6 +45,7 @@ Aiden Grossman <aidengrossmanpso@gmail.com> Ajay Berwal <a.berwal@samsung.com> Ajay Berwal <ajay.berwal@samsung.com> +Ajay Sharma <ajay.sh@samsung.com> Ajith Kumar V <ajith.v@samsung.com> Akos Kiss <akiss@inf.u-szeged.hu> Aku Kotkavuo <a.kotkavuo@partner.samsung.com> @@ -63,6 +64,7 @@ Alex Scheele <alexscheele@gmail.com> Alexander Douglas <agdoug@amazon.com> Alexander Forrence <alex.forrence@gmail.com> +Alexander Frick <alex313031@gmail.com> Alexander Guettler <alexander@guettler.io> Alexander Rezepkin <etu@vivaldi.net> Alexander Shalamov <alexander.shalamov@intel.com> @@ -161,6 +163,7 @@ Ashutosh <codingtosh@gmail.com> Asish Singh <asish.singh@samsung.com> Attila Dusnoki <dati91@gmail.com> +Avi Mathur <avi.mathur009@gmail.com> Avinaash Doreswamy <avi.nitk@samsung.com> Axel Chong <haxatron1@gmail.com> Ayush Dubey <dubeyaayush07@gmail.com> @@ -246,6 +249,7 @@ Charles Vaughn <cvaughn@gmail.com> Cheng Zhao <zcbenz@gmail.com> Cheng Yu <yuzichengcode@gmail.com> +Chenguang Shao <chenguangshao1@gmail.com> Choongwoo Han <cwhan.tunz@gmail.com> Choudhury M. Shamsujjoha <choudhury.s@samsung.com> Chris Dalton <chris@rive.app> @@ -329,6 +333,7 @@ Deomid rojer Ryabkov <rojer9@gmail.com> Derek Halman <d.halman@gmail.com> Devlin Cronin <rdevlin.cronin@gmail.com> +Dheeraj Kumar <dh.kumar@samsung.com> Dhi Aurrahman <dio@rockybars.com> Di Wu <meetwudi@gmail.com> Diana Suvorova <diana.suvorova@gmail.com> @@ -470,6 +475,7 @@ Heeyoun Lee <heeyoun.lee@samsung.com> Henrique de Carvalho <decarv.henrique@gmail.com> Henrique Limas <henrique.ramos.limas@gmail.com> +Henry Lim <henry@limhenry.xyz> Hikari Fujimoto <hikari.p.fujimoto@gmail.com> Himanshu Joshi <h.joshi@samsung.com> Himanshu Nayak <himanshu.nayak@amd.corp-partner.google.com> @@ -566,6 +572,7 @@ Jared Wein <weinjared@gmail.com> Jari Karppanen <jkarp@amazon.com> Jason Gronn <jasontopia03@gmail.com> +Javayhu <javayhu@gmail.com> Jay Oster <jay@kodewerx.org> Jay Soffian <jaysoffian@gmail.com> Jeado Ko <haibane84@gmail.com> @@ -680,6 +687,7 @@ JungJik Lee <jungjik.lee@samsung.com> Jungkee Song <jungkee.song@samsung.com> Junmin Zhu <junmin.zhu@intel.com> +Junsang Mo <mojunsang26@gmail.com> Junsong Li <ljs.darkfish@gmail.com> Jun Wang <wangjuna@uniontech.com> Jun Zeng <hjunzeng6@gmail.com> @@ -844,6 +852,7 @@ Martin Persson <mnpn03@gmail.com> Martin Rogalla <martin@martinrogalla.com> Martina Kollarova <martina.kollarova@intel.com> +Martino Fontana <tinozzo123@gmail.com> Masahiro Yado <yado.masa@gmail.com> Masaru Nishida <msr.i386@gmail.com> Masayuki Wakizaka <mwakizaka0108@gmail.com> @@ -1419,6 +1428,7 @@ Yizhou Jiang <yizhou.jiang@intel.com> Yoav Weiss <yoav@yoav.ws> Yoav Zilberberg <yoav.zilberberg@gmail.com> +Yogesh <yogesh.dabas@samsung.com> Yoichiro Hibara <hibarayoichiro871@gmail.com> Yong Ling <yongling@tencent.com> Yong Shin <sy3620@gmail.com> @@ -1482,6 +1492,7 @@ Zsolt Borbely <zsborbely.u-szeged@partner.samsung.com> 方觉 (Fang Jue) <fangjue23303@gmail.com> 迷渡 <justjavac@gmail.com> +郑苏波 (Super Zheng) <superzheng@tencent.com> # Please DO NOT APPEND here. See comments at the top of the file. # END individuals section. @@ -1559,6 +1570,7 @@ Torchmobile Inc. Upwork <*@cloud.upwork.com> Venture 3 Systems LLC <*@venture3systems.com> Vewd Software AS <*@vewd.com> +Vikas Mundra <vikas.mundra@samsung.com> Vivaldi Technologies AS <*@vivaldi.com> Wacom <*@wacom.com> Whist Technologies <*@whist.com>
diff --git a/base/containers/span.h b/base/containers/span.h index a218045..83069d6 100644 --- a/base/containers/span.h +++ b/base/containers/span.h
@@ -248,9 +248,6 @@ using reference = T&; using const_reference = const T&; using iterator = CheckedContiguousIterator<T>; - // TODO(https://crbug.com/828324): Drop the const_iterator typedef once gMock - // supports containers without this nested type. - using const_iterator = iterator; using reverse_iterator = std::reverse_iterator<iterator>; static constexpr size_t extent = Extent;
diff --git a/base/strings/string_piece.h b/base/strings/string_piece.h index 6e4ea0f..31feafc 100644 --- a/base/strings/string_piece.h +++ b/base/strings/string_piece.h
@@ -10,8 +10,6 @@ #ifndef BASE_STRINGS_STRING_PIECE_H_ #define BASE_STRINGS_STRING_PIECE_H_ -#include <functional> - // Many files including this header rely on these being included due to IWYU // violations. Preserve the includes for now. As code is migrated away from this // header, we can incrementally fix the IWYU violations. @@ -24,13 +22,4 @@ #include "base/strings/utf_ostream_operators.h" #include "build/build_config.h" -namespace gurl_base { - -// Historically, `std::hash` did not support `gurl_base::StringPiece`. Now -// `gurl_base::StringPiece` is `std::string_view`, so this is no longer necessary. -// Replace uses of this type with the default hasher. -using StringPieceHash = std::hash<StringPiece>; - -} // namespace base - #endif // BASE_STRINGS_STRING_PIECE_H_
diff --git a/base/strings/string_piece_unittest.cc b/base/strings/string_piece_unittest.cc index b77edbd..a6fcbbb 100644 --- a/base/strings/string_piece_unittest.cc +++ b/base/strings/string_piece_unittest.cc
@@ -684,6 +684,7 @@ } } +#if defined(_LIBCPP_ENABLE_ASSERTIONS) TEST(StringPieceTest, OutOfBoundsDeath) { { constexpr StringPiece piece; @@ -725,6 +726,7 @@ int length = -1; ASSERT_DEATH_IF_SUPPORTED({ StringPiece piece("hello", length); }, ""); } +#endif // defined(_LIBCPP_ENABLE_ASSERTIONS) TEST(StringPieceTest, ConstexprData) { {
diff --git a/base/strings/string_util.cc b/base/strings/string_util.cc index 4a7638b..1633f7f 100644 --- a/base/strings/string_util.cc +++ b/base/strings/string_util.cc
@@ -4,7 +4,6 @@ #include "base/strings/string_util.h" -#include <ctype.h> #include <errno.h> #include <math.h> #include <stdarg.h> @@ -14,7 +13,6 @@ #include <string.h> #include <time.h> #include <wchar.h> -#include <wctype.h> #include <limits> #include <type_traits>
diff --git a/base/strings/string_util.h b/base/strings/string_util.h index d40c11b..29936fa 100644 --- a/base/strings/string_util.h +++ b/base/strings/string_util.h
@@ -7,7 +7,6 @@ #ifndef BASE_STRINGS_STRING_UTIL_H_ #define BASE_STRINGS_STRING_UTIL_H_ -#include <ctype.h> #include <stdarg.h> // va_list #include <stddef.h> #include <stdint.h>
diff --git a/base/strings/string_util_impl_helpers.h b/base/strings/string_util_impl_helpers.h index fb15c87..948463b 100644 --- a/base/strings/string_util_impl_helpers.h +++ b/base/strings/string_util_impl_helpers.h
@@ -519,7 +519,7 @@ const bool is_strict_mode, std::vector<size_t>* offsets) { size_t substitutions = subst.size(); - GURL_DCHECK_LT(substitutions, 11U); + GURL_DCHECK_LT(substitutions, 10U); size_t sub_length = 0; for (const auto& cur : subst) {
diff --git a/base/strings/stringprintf.cc b/base/strings/stringprintf.cc index 9509aff..1913fdc 100644 --- a/base/strings/stringprintf.cc +++ b/base/strings/stringprintf.cc
@@ -38,13 +38,6 @@ va_list argptr) { return gurl_base::vswprintf(buffer, buf_size, format, argptr); } -inline int vsnprintfT(char16_t* buffer, - size_t buf_size, - const char16_t* format, - va_list argptr) { - return gurl_base::vswprintf(reinterpret_cast<wchar_t*>(buffer), buf_size, - reinterpret_cast<const wchar_t*>(format), argptr); -} #endif // Templatized backend for StringPrintF/StringAppendF. This does not finalize @@ -135,15 +128,6 @@ va_end(ap); return result; } - -std::u16string StringPrintf(const char16_t* format, ...) { - va_list ap; - va_start(ap, format); - std::u16string result; - StringAppendV(&result, format, ap); - va_end(ap); - return result; -} #endif std::string StringPrintV(const char* format, va_list ap) { @@ -152,38 +136,6 @@ return result; } -const std::string& SStringPrintf(std::string* dst, const char* format, ...) { - va_list ap; - va_start(ap, format); - dst->clear(); - StringAppendV(dst, format, ap); - va_end(ap); - return *dst; -} - -#if BUILDFLAG(IS_WIN) -const std::wstring& SStringPrintf(std::wstring* dst, - const wchar_t* format, ...) { - va_list ap; - va_start(ap, format); - dst->clear(); - StringAppendV(dst, format, ap); - va_end(ap); - return *dst; -} - -const std::u16string& SStringPrintf(std::u16string* dst, - const char16_t* format, - ...) { - va_list ap; - va_start(ap, format); - dst->clear(); - StringAppendV(dst, format, ap); - va_end(ap); - return *dst; -} -#endif - void StringAppendF(std::string* dst, const char* format, ...) { va_list ap; va_start(ap, format); @@ -198,13 +150,6 @@ StringAppendV(dst, format, ap); va_end(ap); } - -void StringAppendF(std::u16string* dst, const char16_t* format, ...) { - va_list ap; - va_start(ap, format); - StringAppendV(dst, format, ap); - va_end(ap); -} #endif void StringAppendV(std::string* dst, const char* format, va_list ap) { @@ -215,10 +160,6 @@ void StringAppendV(std::wstring* dst, const wchar_t* format, va_list ap) { StringAppendVT(dst, format, ap); } - -void StringAppendV(std::u16string* dst, const char16_t* format, va_list ap) { - StringAppendVT(dst, format, ap); -} #endif } // namespace base
diff --git a/base/strings/stringprintf.h b/base/strings/stringprintf.h index b393c93..5266a13 100644 --- a/base/strings/stringprintf.h +++ b/base/strings/stringprintf.h
@@ -21,12 +21,9 @@ #if BUILDFLAG(IS_WIN) // Note: Unfortunately compile time checking of the format string for UTF-16 // strings is not supported by any compiler, thus these functions should be used -// carefully and sparingly. Also applies to SStringPrintf and StringAppendV -// below. +// carefully and sparingly. Also applies to StringAppendV below. [[nodiscard]] BASE_EXPORT std::wstring StringPrintf(const wchar_t* format, ...) WPRINTF_FORMAT(1, 2); -[[nodiscard]] BASE_EXPORT std::u16string StringPrintf(const char16_t* format, - ...) WPRINTF_FORMAT(1, 2); #endif // Return a C++ string given vprintf-like input. @@ -34,27 +31,12 @@ va_list ap) PRINTF_FORMAT(1, 0); -// Store result into a supplied string and return it. -BASE_EXPORT const std::string& SStringPrintf(std::string* dst, - const char* format, - ...) PRINTF_FORMAT(2, 3); -#if BUILDFLAG(IS_WIN) -BASE_EXPORT const std::wstring& SStringPrintf(std::wstring* dst, - const wchar_t* format, - ...) WPRINTF_FORMAT(2, 3); -BASE_EXPORT const std::u16string& SStringPrintf(std::u16string* dst, - const char16_t* format, - ...) WPRINTF_FORMAT(2, 3); -#endif - // Append result to a supplied string. BASE_EXPORT void StringAppendF(std::string* dst, const char* format, ...) PRINTF_FORMAT(2, 3); #if BUILDFLAG(IS_WIN) BASE_EXPORT void StringAppendF(std::wstring* dst, const wchar_t* format, ...) WPRINTF_FORMAT(2, 3); -BASE_EXPORT void StringAppendF(std::u16string* dst, const char16_t* format, ...) - WPRINTF_FORMAT(2, 3); #endif // Lower-level routine that takes a va_list and appends to a specified @@ -65,9 +47,6 @@ BASE_EXPORT void StringAppendV(std::wstring* dst, const wchar_t* format, va_list ap) WPRINTF_FORMAT(2, 0); -BASE_EXPORT void StringAppendV(std::u16string* dst, - const char16_t* format, - va_list ap) WPRINTF_FORMAT(2, 0); #endif } // namespace base
diff --git a/base/strings/stringprintf_unittest.cc b/base/strings/stringprintf_unittest.cc index c137095..45fa9c6 100644 --- a/base/strings/stringprintf_unittest.cc +++ b/base/strings/stringprintf_unittest.cc
@@ -37,7 +37,6 @@ EXPECT_EQ("123hello w", StringPrintf("%3d%2s %1c", 123, "hello", 'w')); #if BUILDFLAG(IS_WIN) EXPECT_EQ(L"123hello w", StringPrintf(L"%3d%2ls %1lc", 123, L"hello", 'w')); - EXPECT_EQ(u"123hello w", StringPrintf(u"%3d%2ls %1lc", 123, u"hello", 'w')); #endif } @@ -50,10 +49,6 @@ std::wstring valuew(L"Hello"); StringAppendF(&valuew, L"%ls", L""); EXPECT_EQ(L"Hello", valuew); - - std::u16string value16(u"Hello"); - StringAppendF(&value16, u"%ls", u""); - EXPECT_EQ(u"Hello", value16); #endif } @@ -66,10 +61,6 @@ std::wstring valuew(L"Hello"); StringAppendF(&valuew, L" %ls", L"World"); EXPECT_EQ(L"Hello World", valuew); - - std::u16string value16(u"Hello"); - StringAppendF(&value16, u" %ls", u"World"); - EXPECT_EQ(u"Hello World", value16); #endif } @@ -82,10 +73,6 @@ std::wstring valuew(L"Hello"); StringAppendF(&valuew, L" %d", 123); EXPECT_EQ(L"Hello 123", valuew); - - std::u16string value16(u"Hello"); - StringAppendF(&value16, u" %d", 123); - EXPECT_EQ(u"Hello 123", value16); #endif } @@ -105,22 +92,11 @@ for (int i = 1; i < 3; i++) { src[kSrcLen - i] = 0; std::string out; - SStringPrintf(&out, "%s", src); - EXPECT_STREQ(src, out.c_str()); + EXPECT_EQ(src, StringPrintf("%s", src)); #if BUILDFLAG(IS_WIN) srcw[kSrcLen - i] = 0; - std::wstring outw; - SStringPrintf(&outw, L"%ls", srcw); - EXPECT_STREQ(srcw, outw.c_str()); - - src16[kSrcLen - i] = 0; - std::u16string out16; - SStringPrintf(&out16, u"%ls", src16); - // EXPECT_STREQ does not support const char16_t* strings yet. - // Dispatch to the const wchar_t* overload instead. - EXPECT_STREQ(reinterpret_cast<const wchar_t*>(src16), - reinterpret_cast<const wchar_t*>(out16.c_str())); + EXPECT_EQ(srcw, StringPrintf(L"%ls", srcw)); #endif } } @@ -134,9 +110,6 @@ const char fmt[] = "%sB%sB%sB%sB%sB%sB%s"; - std::string out; - SStringPrintf(&out, fmt, src, src, src, src, src, src, src); - const int kRefSize = 320000; char* ref = new char[kRefSize]; #if BUILDFLAG(IS_WIN) @@ -145,7 +118,7 @@ snprintf(ref, kRefSize, fmt, src, src, src, src, src, src, src); #endif - EXPECT_STREQ(ref, out.c_str()); + EXPECT_EQ(ref, StringPrintf(fmt, src, src, src, src, src, src, src)); delete[] ref; } @@ -158,10 +131,6 @@ std::wstring outw; StringAppendVTestHelper(&outw, L"%d foo %ls", 1, L"bar"); EXPECT_EQ(L"1 foo bar", outw); - - std::u16string out16; - StringAppendVTestHelper(&out16, u"%d foo %ls", 1, u"bar"); - EXPECT_EQ(u"1 foo bar", out16); #endif } @@ -178,10 +147,7 @@ src[i] = 'a'; src[kBufLen - 1] = 0; - std::string out; - SStringPrintf(&out, "%s", src); - - EXPECT_STREQ(src, out.c_str()); + EXPECT_EQ(src, StringPrintf("%s", src)); } #if BUILDFLAG(IS_WIN) @@ -190,9 +156,7 @@ invalid[0] = 0xffff; invalid[1] = 0; - std::wstring out; - SStringPrintf(&out, L"%ls", invalid); - EXPECT_STREQ(invalid, out.c_str()); + EXPECT_EQ(invalid, StringPrintf(L"%ls", invalid)); } #endif
diff --git a/base/strings/sys_string_conversions.h b/base/strings/sys_string_conversions.h index 37f5455..38f89f8 100644 --- a/base/strings/sys_string_conversions.h +++ b/base/strings/sys_string_conversions.h
@@ -20,7 +20,7 @@ #if BUILDFLAG(IS_APPLE) #include <CoreFoundation/CoreFoundation.h> -#include "base/mac/scoped_cftyperef.h" +#include "base/apple/scoped_cftyperef.h" #ifdef __OBJC__ @class NSString; @@ -63,10 +63,10 @@ // Converts between strings and CFStringRefs/NSStrings. // Converts a string to a CFStringRef. Returns null on failure. -[[nodiscard]] BASE_EXPORT ScopedCFTypeRef<CFStringRef> SysUTF8ToCFStringRef( - StringPiece utf8); -[[nodiscard]] BASE_EXPORT ScopedCFTypeRef<CFStringRef> SysUTF16ToCFStringRef( - StringPiece16 utf16); +[[nodiscard]] BASE_EXPORT apple::ScopedCFTypeRef<CFStringRef> +SysUTF8ToCFStringRef(StringPiece utf8); +[[nodiscard]] BASE_EXPORT apple::ScopedCFTypeRef<CFStringRef> +SysUTF16ToCFStringRef(StringPiece16 utf16); // Converts a CFStringRef to a string. Returns an empty string on failure. It is // not valid to call these with a null `ref`.
diff --git a/base/strings/to_string.h b/base/strings/to_string.h index 79c6b7d..26ff960 100644 --- a/base/strings/to_string.h +++ b/base/strings/to_string.h
@@ -9,13 +9,18 @@ #include <memory> #include <sstream> #include <string> +#include <tuple> #include <type_traits> +#include <utility> #include "base/template_util.h" #include "base/types/supports_ostream_operator.h" namespace gurl_base { +template <typename... Ts> +std::string ToString(const Ts&... values); + namespace internal { template <typename T> @@ -91,6 +96,23 @@ } }; +// Tuples. Will recursively apply `ToString()` to each value in the tuple. +template <typename... T> +struct ToStringHelper<std::tuple<T...>> { + template <size_t... I> + static void StringifyHelper(const std::tuple<T...>& values, + std::index_sequence<I...>, + std::ostringstream& ss) { + ss << "<"; + (..., (ss << (I == 0 ? "" : ", "), ss << ToString(std::get<I>(values)))); + ss << ">"; + } + + static void Stringify(const std::tuple<T...>& v, std::ostringstream& ss) { + StringifyHelper(v, std::make_index_sequence<sizeof...(T)>(), ss); + } +}; + } // namespace internal // Converts any type to a string, preferring defined operator<<() or ToString() @@ -98,9 +120,8 @@ template <typename... Ts> std::string ToString(const Ts&... values) { std::ostringstream ss; - (internal::ToStringHelper<remove_cvref_t<decltype(values)>>::Stringify(values, - ss), - ...); + (..., internal::ToStringHelper<remove_cvref_t<decltype(values)>>::Stringify( + values, ss)); return ss.str(); }
diff --git a/base/strings/to_string_test.cc b/base/strings/to_string_unittest.cc similarity index 93% rename from base/strings/to_string_test.cc rename to base/strings/to_string_unittest.cc index f0c32b2..840b301 100644 --- a/base/strings/to_string_test.cc +++ b/base/strings/to_string_unittest.cc
@@ -91,6 +91,13 @@ EXPECT_EQ(ToString("42 in hex is ", std::hex, 42), "42 in hex is 2a"); } +TEST(ToStringTest, Tuple) { + // Tuples should correctly format the contained types. + EXPECT_EQ(ToString(std::make_tuple(StreamableTestEnum::kGreeting, + HasToString(), "a string")), + "<hello, yay!, a string>"); +} + void Func() {} TEST(ToStringTest, FunctionPointer) {
diff --git a/base/third_party/icu/README.chromium b/base/third_party/icu/README.chromium index b738af6..c514fc5 100644 --- a/base/third_party/icu/README.chromium +++ b/base/third_party/icu/README.chromium
@@ -14,5 +14,5 @@ ICU macros should ICU be in use on the system. For the same reason, the functions and types have been put in the "base_icu" namespace. -Note that this license file is marked as NOT_SHIPPED, since a more complete +Note that this license file is marked as not shipped, since a more complete ICU license is included from //third_party/icu/README.chromium
diff --git a/copy.bara.sky b/copy.bara.sky index fd4034f..72fde7e 100644 --- a/copy.bara.sky +++ b/copy.bara.sky
@@ -108,7 +108,6 @@ # iOS version of url_idna is ASCII-only, but it uses .mm extension; rename # it to a .cc file. core.move("url/url_idna_icu_alternatives_ios.mm", "url/url_idna_ascii_only.cc"), - core.replace("!defined(__has_feature) || !__has_feature(objc_arc)", "false"), # Fix some Perfetto includes. core.replace("base/trace_event/base_tracing.h", "polyfills/third_party/perfetto/include/perfetto/tracing/traced_value.h"),
diff --git a/url/origin.cc b/url/origin.cc index 06119ba..0274f34 100644 --- a/url/origin.cc +++ b/url/origin.cc
@@ -22,6 +22,7 @@ #include "base/strings/strcat.h" #include "base/strings/string_piece.h" #include "polyfills/third_party/perfetto/include/perfetto/tracing/traced_value.h" +#include "polyfills/base/trace_event/memory_usage_estimator.h" #include "base/unguessable_token.h" #include "url/gurl.h" #include "url/scheme_host_port.h" @@ -393,6 +394,10 @@ std::move(context).WriteString(GetDebugString()); } +size_t Origin::EstimateMemoryUsage() const { + return gurl_base::trace_event::EstimateMemoryUsage(tuple_); +} + std::ostream& operator<<(std::ostream& out, const url::Origin& origin) { out << origin.GetDebugString(); return out;
diff --git a/url/origin.h b/url/origin.h index d08229d..a49cbca 100644 --- a/url/origin.h +++ b/url/origin.h
@@ -329,6 +329,10 @@ void WriteIntoTrace(perfetto::TracedValue context) const; + // Estimates dynamic memory usage. + // See base/trace_event/memory_usage_estimator.h for more info. + size_t EstimateMemoryUsage() const; + private: friend class blink::SecurityOrigin; friend class blink::SecurityOriginTest;
diff --git a/url/scheme_host_port.cc b/url/scheme_host_port.cc index db23d39..2db80a8 100644 --- a/url/scheme_host_port.cc +++ b/url/scheme_host_port.cc
@@ -16,6 +16,7 @@ #include "base/numerics/safe_conversions.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_piece.h" +#include "polyfills/base/trace_event/memory_usage_estimator.h" #include "url/gurl.h" #include "url/third_party/mozilla/url_parse.h" #include "url/url_canon.h" @@ -229,6 +230,11 @@ return GURL(std::move(serialized), parsed, true); } +size_t SchemeHostPort::EstimateMemoryUsage() const { + return gurl_base::trace_event::EstimateMemoryUsage(scheme_) + + gurl_base::trace_event::EstimateMemoryUsage(host_); +} + bool SchemeHostPort::operator<(const SchemeHostPort& other) const { return std::tie(port_, scheme_, host_) < std::tie(other.port_, other.scheme_, other.host_);
diff --git a/url/scheme_host_port.h b/url/scheme_host_port.h index 88013dd..0798fec 100644 --- a/url/scheme_host_port.h +++ b/url/scheme_host_port.h
@@ -139,6 +139,10 @@ // For example, see crrev.com/c/3637099/comments/782360d0_e14757be. GURL GetURL() const; + // Estimates dynamic memory usage. + // See base/trace_event/memory_usage_estimator.h for more info. + size_t EstimateMemoryUsage() const; + // Two SchemeHostPort objects are "equal" iff their schemes, hosts, and ports // are exact matches. //
diff --git a/url/url_canon_path.cc b/url/url_canon_path.cc index ce28682..7f917db 100644 --- a/url/url_canon_path.cc +++ b/url/url_canon_path.cc
@@ -6,10 +6,12 @@ #include "polyfills/base/check.h" #include "polyfills/base/check_op.h" +#include "polyfills/base/feature_list.h" #include "polyfills/base/metrics/histogram_functions.h" #include "absl/types/optional.h" #include "url/url_canon.h" #include "url/url_canon_internal.h" +#include "url/url_features.h" #include "url/url_parse_internal.h" namespace url { @@ -37,6 +39,7 @@ // This character must be unescaped in canonical output. Not valid with // ESCAPE or PASS. We DON'T set the SPECIAL flag since if we encounter these // characters unescaped, they should just be copied. + // TODO(https://crbug.com/1252531): This is guarded by a feature flag. UNESCAPE = 4, }; @@ -333,7 +336,9 @@ // the last character of the escape sequence. char unescaped_flags = kPathCharLookup[unescaped_value]; - if (unescaped_flags & UNESCAPE) { + if (!gurl_base::FeatureList::IsEnabled( + url::kDontDecodeAsciiPercentEncodedURLPath) && + (unescaped_flags & UNESCAPE)) { // This escaped value shouldn't be escaped. Try to copy it. unescape_escaped_char = true;
diff --git a/url/url_canon_unittest.cc b/url/url_canon_unittest.cc index d4bfbdb..c1b19d2 100644 --- a/url/url_canon_unittest.cc +++ b/url/url_canon_unittest.cc
@@ -1275,13 +1275,13 @@ {"/foo%2\xc2\xa9zbar", nullptr, "/foo%2%C2%A9zbar", Component(0, 16), true}, {nullptr, L"/foo%2\xc2\xa9zbar", "/foo%2%C3%82%C2%A9zbar", Component(0, 22), true}, - // Regular characters that are escaped should be unescaped - {"/foo%41%7a", L"/foo%41%7a", "/fooAz", Component(0, 6), true}, + // Regular characters that are escaped should remain escaped + {"/foo%41%7a", L"/foo%41%7a", "/foo%41%7a", Component(0, 10), true}, // Funny characters that are unescaped should be escaped {"/foo\x09\x91%91", nullptr, "/foo%09%91%91", Component(0, 13), true}, {nullptr, L"/foo\x09\x91%91", "/foo%09%C2%91%91", Component(0, 16), true}, // %00 should not cause failures. - {"/foo%00%51", L"/foo%00%51", "/foo%00Q", Component(0, 8), true}, + {"/foo%00%51", L"/foo%00%51", "/foo%00%51", Component(0, 10), true}, // Some characters should be passed through unchanged regardless of esc. {"/(%28:%3A%29)", L"/(%28:%3A%29)", "/(%28:%3A%29)", Component(0, 13), true}, @@ -1302,21 +1302,20 @@ "/%7Ffp3%3Eju%3Dduvgw%3Dd", Component(0, 24), true}, // @ should be passed through unchanged (escaped or unescaped). {"/@asdf%40", L"/@asdf%40", "/@asdf%40", Component(0, 9), true}, - // Nested escape sequences should result in escaping the leading '%' if - // unescaping would result in a new escape sequence. - {"/%A%42", L"/%A%42", "/%25AB", Component(0, 6), true}, - {"/%%41B", L"/%%41B", "/%25AB", Component(0, 6), true}, - {"/%%41%42", L"/%%41%42", "/%25AB", Component(0, 6), true}, + // Nested escape sequences no longer happen. See https://crbug.com/1252531. + {"/%A%42", L"/%A%42", "/%A%42", Component(0, 6), true}, + {"/%%41B", L"/%%41B", "/%%41B", Component(0, 6), true}, + {"/%%41%42", L"/%%41%42", "/%%41%42", Component(0, 8), true}, // Make sure truncated "nested" escapes don't result in reading off the // string end. - {"/%%41", L"/%%41", "/%A", Component(0, 3), true}, + {"/%%41", L"/%%41", "/%%41", Component(0, 5), true}, // Don't unescape the leading '%' if unescaping doesn't result in a valid // new escape sequence. - {"/%%470", L"/%%470", "/%G0", Component(0, 4), true}, - {"/%%2D%41", L"/%%2D%41", "/%-A", Component(0, 4), true}, + {"/%%470", L"/%%470", "/%%470", Component(0, 6), true}, + {"/%%2D%41", L"/%%2D%41", "/%%2D%41", Component(0, 8), true}, // Don't erroneously downcast a UTF-16 character in a way that makes it // look like part of an escape sequence. - {nullptr, L"/%%41\x0130", "/%A%C4%B0", Component(0, 9), true}, + {nullptr, L"/%%41\x0130", "/%%41%C4%B0", Component(0, 11), true}, // ----- encoding tests ----- // Basic conversions @@ -1622,7 +1621,7 @@ "ws://%29w%1ew%81/", false}, // Regression test for the last_invalid_percent_index bug described in // https://crbug.com/1080890#c10. - {R"(HTTP:S/5%\../>%41)", "http://s/%3EA", true}, + {R"(HTTP:S/5%\../>%41)", "http://s/%3E%41", true}, }; for (size_t i = 0; i < std::size(cases); i++) { @@ -2742,7 +2741,29 @@ output.set_length(0); } -TEST(URLCanonTest, UnescapePathCharHistogram) { +class URLCanonAsciiPercentEncodePathTest + : public ::testing::Test, + public ::testing::WithParamInterface<bool> { + public: + URLCanonAsciiPercentEncodePathTest() { + if (GetParam()) { + scoped_feature_list_.InitAndEnableFeature( + url::kDontDecodeAsciiPercentEncodedURLPath); + } else { + scoped_feature_list_.InitAndDisableFeature( + url::kDontDecodeAsciiPercentEncodedURLPath); + } + } + + private: + gurl_base::test::ScopedFeatureList scoped_feature_list_; +}; + +INSTANTIATE_TEST_SUITE_P(All, + URLCanonAsciiPercentEncodePathTest, + ::testing::Bool()); + +TEST_P(URLCanonAsciiPercentEncodePathTest, UnescapePathCharHistogram) { struct TestCase { gurl_base::StringPiece path; gurl_base::HistogramBase::Count cnt; @@ -2760,8 +2781,13 @@ StdStringCanonOutput output(&out_str); bool success = CanonicalizePath(c.path.data(), in_comp, &output, &out_comp); ASSERT_TRUE(success); - histogram_tester.ExpectBucketCount("URL.Path.UnescapeEscapedChar", 1, - c.cnt); + if (gurl_base::FeatureList::IsEnabled( + url::kDontDecodeAsciiPercentEncodedURLPath)) { + histogram_tester.ExpectBucketCount("URL.Path.UnescapeEscapedChar", 1, 0); + } else { + histogram_tester.ExpectBucketCount("URL.Path.UnescapeEscapedChar", 1, + c.cnt); + } } }
diff --git a/url/url_features.cc b/url/url_features.cc index d033755..e046f60 100644 --- a/url/url_features.cc +++ b/url/url_features.cc
@@ -25,6 +25,11 @@ "ResolveBareFragmentWithColonOnNonHierarchical", gurl_base::FEATURE_ENABLED_BY_DEFAULT); +// Kill switch for crbug.com/1252531. +BASE_FEATURE(kDontDecodeAsciiPercentEncodedURLPath, + "DontDecodeAsciiPercentEncodedURLPath", + gurl_base::FEATURE_ENABLED_BY_DEFAULT); + bool IsUsingIDNA2008NonTransitional() { // If the FeatureList isn't available yet, fall back to the feature's default // state. This may happen during early startup, see crbug.com/1441956.
diff --git a/url/url_features.h b/url/url_features.h index 41f689b..3dfb383 100644 --- a/url/url_features.h +++ b/url/url_features.h
@@ -28,6 +28,11 @@ COMPONENT_EXPORT(URL) BASE_DECLARE_FEATURE(kResolveBareFragmentWithColonOnNonHierarchical); +// When enabled, percent-encoded ASCII characters in URL path are not decoded +// automatically. See https://crbug.com/125231. +COMPONENT_EXPORT(URL) +BASE_DECLARE_FEATURE(kDontDecodeAsciiPercentEncodedURLPath); + } // namespace url #endif // URL_URL_FEATURES_H_
diff --git a/url/url_idna_ascii_only.cc b/url/url_idna_ascii_only.cc index 921858a..2a4f0d3 100644 --- a/url/url_idna_ascii_only.cc +++ b/url/url_idna_ascii_only.cc
@@ -12,10 +12,6 @@ #include "base/strings/utf_string_conversions.h" #include "url/url_canon_internal.h" -#if false -#error "This file requires ARC support." -#endif - namespace url { // Only allow ASCII to avoid ICU dependency. Use NSString+IDN