diff --git a/Tests/LibWeb/Text/expected/URL/url-search-params-sort-utf16-code-units.txt b/Tests/LibWeb/Text/expected/URL/url-search-params-sort-utf16-code-units.txt new file mode 100644 index 00000000000..26e63107b37 --- /dev/null +++ b/Tests/LibWeb/Text/expected/URL/url-search-params-sort-utf16-code-units.txt @@ -0,0 +1,4 @@ +%EF%BF%BC=&%EF%BF%BD=x&%EF%BF%BD=a +'\ufffc' => '' +'\ufffd' => '\u0078' +'\ufffd' => '\u0061' diff --git a/Tests/LibWeb/Text/input/URL/url-search-params-sort-utf16-code-units.html b/Tests/LibWeb/Text/input/URL/url-search-params-sort-utf16-code-units.html new file mode 100644 index 00000000000..1101024bcfa --- /dev/null +++ b/Tests/LibWeb/Text/input/URL/url-search-params-sort-utf16-code-units.html @@ -0,0 +1,17 @@ + + diff --git a/Userland/Libraries/LibWeb/DOMURL/URLSearchParams.cpp b/Userland/Libraries/LibWeb/DOMURL/URLSearchParams.cpp index 5a386928d0f..3a78274ae66 100644 --- a/Userland/Libraries/LibWeb/DOMURL/URLSearchParams.cpp +++ b/Userland/Libraries/LibWeb/DOMURL/URLSearchParams.cpp @@ -325,26 +325,23 @@ void URLSearchParams::set(String const& name, String const& value) update(); } +// https://url.spec.whatwg.org/#dom-urlsearchparams-sort void URLSearchParams::sort() { // 1. Sort all name-value pairs, if any, by their names. Sorting must be done by comparison of code units. The relative order between name-value pairs with equal names must be preserved. insertion_sort(m_list, [](auto& a, auto& b) { - Utf8View a_code_points { a.name }; - Utf8View b_code_points { b.name }; + // FIXME: There should be a way to do this without converting to utf16 + auto a_utf16 = MUST(utf8_to_utf16(a.name)); + auto b_utf16 = MUST(utf8_to_utf16(b.name)); - if (a_code_points.starts_with(b_code_points)) - return false; - if (b_code_points.starts_with(a_code_points)) - return true; + auto common_length = min(a_utf16.size(), b_utf16.size()); - for (auto k = a_code_points.begin(), l = b_code_points.begin(); - k != a_code_points.end() && l != b_code_points.end(); - ++k, ++l) { - if (*k != *l) { - return *k < *l; - } + for (size_t position = 0; position < common_length; ++position) { + if (a_utf16[position] != b_utf16[position]) + return a_utf16[position] < b_utf16[position]; } - VERIFY_NOT_REACHED(); + + return a_utf16.size() < b_utf16.size(); }); // 2. Update this.