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.
This commit is contained in:
Kemal Zebari 2023-09-12 08:50:15 -07:00 committed by Andrew Kaster
parent a2810d3cf8
commit b6b4e59bf7
Notes: sideshowbarker 2024-07-17 01:11:48 +09:00
2 changed files with 20 additions and 7 deletions

View file

@ -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 urls 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 urls 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

View file

@ -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(); }