From f4cf6c49f3511d3a580ea4ec635e1118c447b35d Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Wed, 15 Jan 2025 17:15:25 +1300 Subject: [PATCH] LibWeb/HTML: Scroll to the fragment before loading the document Otherwise nowhere may end up scrolling to the fragment to set the target element for a document before script can observe it. --- Libraries/LibWeb/HTML/Parser/HTMLParser.cpp | 3 ++ .../nodes/ParentNode-querySelector-All.txt | 12 +++---- .../wpt-import/url/data-uri-fragment.txt | 6 ++++ .../wpt-import/url/data-uri-fragment.html | 34 +++++++++++++++++++ 4 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 Tests/LibWeb/Text/expected/wpt-import/url/data-uri-fragment.txt create mode 100644 Tests/LibWeb/Text/input/wpt-import/url/data-uri-fragment.html diff --git a/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp b/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp index be21f5b48e058..4b03470829a6e 100644 --- a/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp +++ b/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp @@ -338,6 +338,9 @@ void HTMLParser::the_end(GC::Ref document, GC::Ptr pa return !document->anything_is_delaying_the_load_event(); })); + // FIXME: Spec bug: https://github.com/whatwg/html/issues/10914 + document->scroll_to_the_fragment(); + // 9. Queue a global task on the DOM manipulation task source given the Document's relevant global object to run the following steps: queue_global_task(HTML::Task::Source::DOMManipulation, *document, GC::create_function(document->heap(), [document, parser] { // 1. Update the current document readiness to "complete". diff --git a/Tests/LibWeb/Text/expected/wpt-import/dom/nodes/ParentNode-querySelector-All.txt b/Tests/LibWeb/Text/expected/wpt-import/dom/nodes/ParentNode-querySelector-All.txt index 58b8a586545ef..aefda0483a4c4 100644 --- a/Tests/LibWeb/Text/expected/wpt-import/dom/nodes/ParentNode-querySelector-All.txt +++ b/Tests/LibWeb/Text/expected/wpt-import/dom/nodes/ParentNode-querySelector-All.txt @@ -2,8 +2,8 @@ Harness status: OK Found 1975 tests -1955 Pass -20 Fail +1959 Pass +16 Fail Pass Selectors-API Test Suite: HTML Pass Document supports querySelector Pass Document supports querySelectorAll @@ -601,8 +601,8 @@ Pass Document.querySelectorAll: :link and :visited pseudo-class selectors, match Pass Document.querySelector: :link and :visited pseudo-class selectors, matching a and area elements with href attributes: #pseudo-link :link, #pseudo-link :visited Pass Document.querySelectorAll: :link and :visited pseudo-class selectors, matching no elements: #head :link, #head :visited Pass Document.querySelector: :link and :visited pseudo-class selectors, matching no elements: #head :link, #head :visited -Fail Document.querySelectorAll: :target pseudo-class selector, matching the element referenced by the URL fragment identifier: :target -Fail Document.querySelector: :target pseudo-class selector, matching the element referenced by the URL fragment identifier: :target +Pass Document.querySelectorAll: :target pseudo-class selector, matching the element referenced by the URL fragment identifier: :target +Pass Document.querySelector: :target pseudo-class selector, matching the element referenced by the URL fragment identifier: :target Pass Document.querySelectorAll: :lang pseudo-class selector, matching inherited language: #pseudo-lang-div1:lang(en) Pass Document.querySelector: :lang pseudo-class selector, matching inherited language: #pseudo-lang-div1:lang(en) Pass Document.querySelectorAll: :lang pseudo-class selector, matching specified language with exact value: #pseudo-lang-div2:lang(fr) @@ -1893,8 +1893,8 @@ Pass In-document Element.querySelectorAll: :link and :visited pseudo-class selec Pass In-document Element.querySelector: :link and :visited pseudo-class selectors, not matching link elements with href attributes: #head :link, #head :visited Pass In-document Element.querySelectorAll: :link and :visited pseudo-class selectors, chained, mutually exclusive pseudo-classes match nothing: :link:visited Pass In-document Element.querySelector: :link and :visited pseudo-class selectors, chained, mutually exclusive pseudo-classes match nothing: :link:visited -Fail In-document Element.querySelectorAll: :target pseudo-class selector, matching the element referenced by the URL fragment identifier: :target -Fail In-document Element.querySelector: :target pseudo-class selector, matching the element referenced by the URL fragment identifier: :target +Pass In-document Element.querySelectorAll: :target pseudo-class selector, matching the element referenced by the URL fragment identifier: :target +Pass In-document Element.querySelector: :target pseudo-class selector, matching the element referenced by the URL fragment identifier: :target Pass In-document Element.querySelectorAll: :lang pseudo-class selector, matching inherited language: #pseudo-lang-div1:lang(en) Pass In-document Element.querySelector: :lang pseudo-class selector, matching inherited language: #pseudo-lang-div1:lang(en) Pass In-document Element.querySelectorAll: :lang pseudo-class selector, matching specified language with exact value: #pseudo-lang-div2:lang(fr) diff --git a/Tests/LibWeb/Text/expected/wpt-import/url/data-uri-fragment.txt b/Tests/LibWeb/Text/expected/wpt-import/url/data-uri-fragment.txt new file mode 100644 index 0000000000000..495399b301f23 --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/url/data-uri-fragment.txt @@ -0,0 +1,6 @@ +Harness status: OK + +Found 1 tests + +1 Pass +Pass Data URI parsing of fragments \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/wpt-import/url/data-uri-fragment.html b/Tests/LibWeb/Text/input/wpt-import/url/data-uri-fragment.html new file mode 100644 index 0000000000000..ac64f4dfd4598 --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/url/data-uri-fragment.html @@ -0,0 +1,34 @@ + + +Data URI parsing of fragments + + + + + + + + +