Просмотр исходного кода

LibWeb: Allow changing the query of file:// URL via history.pushState()

The spec didn't match how other browsers behave, and we dutifully did
what the spec said. A spec bug has been filed, so let's fix this locally
for now with a FIXME.
Andreas Kling 11 месяцев назад
Родитель
Сommit
e3408c4a7f

+ 3 - 0
Tests/LibWeb/Text/expected/HTML/History-pushState-change-query.txt

@@ -0,0 +1,3 @@
+Good: changing the query via pushState()
+Good: threw on changing the filename via pushState()
+Good: going back to the original filename

+ 24 - 0
Tests/LibWeb/Text/input/HTML/History-pushState-change-query.html

@@ -0,0 +1,24 @@
+<script src="../include.js"></script>
+<script>
+    asyncTest((done) => {
+        try {
+            history.pushState({}, null, "?tweaked");
+            println("Good: changing the query via pushState()");
+        } catch (e) {
+            println("FAIL: Threw!");
+        }
+        try {
+            history.pushState({}, null, "other.html");
+            println("FAIL: Should have thrown!");
+        } catch (e) {
+            println("Good: threw on changing the filename via pushState()");
+        }
+        try {
+            history.pushState({}, null, "History-pushState-change-query.html");
+            println("Good: going back to the original filename");
+        } catch (e) {
+            println("FAIL: threw on going back to original filename");
+        }
+        done();
+    });
+</script>

+ 5 - 2
Userland/Libraries/LibWeb/HTML/History.cpp

@@ -148,9 +148,12 @@ bool can_have_its_url_rewritten(DOM::Document const& document, URL::URL const& t
 
 
     // 4. If targetURL's scheme is "file", and targetURL and documentURL differ in their path component,
     // 4. If targetURL's scheme is "file", and targetURL and documentURL differ in their path component,
     //    then return false. (Differences in query and fragment are allowed for file: URLs.)
     //    then return false. (Differences in query and fragment are allowed for file: URLs.)
+    // FIXME: There's a bug in the spec here. We should return true if the scheme is "file" and the path components don't differ.
+    //        Spec bug: https://github.com/whatwg/html/issues/10551
     bool path_components_match = target_url.paths() == document_url.paths();
     bool path_components_match = target_url.paths() == document_url.paths();
-    if (target_url.scheme() == "file"sv && !path_components_match)
-        return false;
+    if (target_url.scheme() == "file"sv) {
+        return path_components_match;
+    }
 
 
     // 5. If targetURL and documentURL differ in their path component or query components, then return false.
     // 5. If targetURL and documentURL differ in their path component or query components, then return false.
     //    (Only differences in fragment are allowed for other types of URLs.)
     //    (Only differences in fragment are allowed for other types of URLs.)