Explorar o código

LibWeb: Use a stable sort for searching URLSearchParams

Quick sort is not a stable sort. This meant we had a subtle issue
implementing this portion of the spec comment:

 > The relative order between name-value pairs with equal names must
 > be preserved.

Switch to insertion sort which is a stable sort, and properly handles
keys which are the same.

Fixes 8 tests on  https://wpt.live/url/urlsearchparams-sort.any.html
Shannon Booth hai 11 meses
pai
achega
1ba6dbd86c

+ 5 - 0
Tests/LibWeb/Text/expected/URL/url-search-params-sort-order-stable.txt

@@ -0,0 +1,5 @@
+=f&=t&=x&z=z
+'' => 'f'
+'' => 't'
+'' => 'x'
+'z' => 'z'

+ 11 - 0
Tests/LibWeb/Text/input/URL/url-search-params-sort-order-stable.html

@@ -0,0 +1,11 @@
+<script src="../include.js"></script>
+<script>
+    test(() => {
+        let params = new URLSearchParams("z=z&=f&=t&=x");
+        params.sort();
+        println(params.toString())
+        for (const [key, value] of params) {
+            println(`'${key}' => '${value}'`);
+        }
+    })
+</script>

+ 1 - 1
Userland/Libraries/LibWeb/DOMURL/URLSearchParams.cpp

@@ -323,7 +323,7 @@ void URLSearchParams::set(String const& name, String const& value)
 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.
-    quick_sort(m_list.begin(), m_list.end(), [](auto& a, auto& b) {
+    insertion_sort(m_list, [](auto& a, auto& b) {
         Utf8View a_code_points { a.name };
         Utf8View b_code_points { b.name };