From b6b4e59bf72b8c89b98f0e566d4ca6499eca6867 Mon Sep 17 00:00:00 2001 From: Kemal Zebari Date: Tue, 12 Sep 2023 08:50:15 -0700 Subject: [PATCH] AK: Implement `URL::serialize_path()` to spec This commit also reverts db5ad0c since code outside of the web spec expects serialized paths to be percent decoded. Also, there are issues trying to implement the concept "opaque path". For now, we still use the old cannot_be_a_base_url(), but its usage needs to be removed in favor of a has_opaque_path() as the spec has changed since then. --- AK/URL.cpp | 21 +++++++++++++++------ AK/URL.h | 6 +++++- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/AK/URL.cpp b/AK/URL.cpp index 6bc43c4af3..de14fa6110 100644 --- a/AK/URL.cpp +++ b/AK/URL.cpp @@ -260,16 +260,25 @@ bool URL::is_special_scheme(StringView scheme) return scheme.is_one_of("ftp", "file", "http", "https", "ws", "wss"); } -DeprecatedString URL::serialize_path() const +// https://url.spec.whatwg.org/#url-path-serializer +DeprecatedString URL::serialize_path(ApplyPercentDecoding apply_percent_decoding) const { + // If url has an opaque path, then return url’s path. + // FIXME: Reimplement this step once we modernize the URL implementation to meet the spec. if (cannot_be_a_base_url()) return m_paths[0]; - StringBuilder builder; - for (auto& path : m_paths) { - builder.append('/'); - builder.append(percent_decode(path)); + + // Let output be the empty string. + StringBuilder output; + + // For each segment of url’s path: append U+002F (/) followed by segment to output. + for (auto const& segment : m_paths) { + output.append('/'); + output.append(apply_percent_decoding == ApplyPercentDecoding::Yes ? percent_decode(segment) : segment); } - return builder.to_deprecated_string(); + + // Return output. + return output.to_deprecated_string(); } // https://url.spec.whatwg.org/#concept-url-serializer diff --git a/AK/URL.h b/AK/URL.h index 01221b3004..8d77a67661 100644 --- a/AK/URL.h +++ b/AK/URL.h @@ -107,7 +107,11 @@ public: m_paths.append(""); } - DeprecatedString serialize_path() const; + enum class ApplyPercentDecoding { + Yes, + No + }; + DeprecatedString serialize_path(ApplyPercentDecoding = ApplyPercentDecoding::Yes) const; DeprecatedString serialize(ExcludeFragment = ExcludeFragment::No) const; DeprecatedString serialize_for_display() const; DeprecatedString to_deprecated_string() const { return serialize(); }