From 07623887090b68979e1b6cf19cf971b6a815071f Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 7 Oct 2023 08:11:18 +0200 Subject: [PATCH] LibWeb: Make XHR.response an actual XMLDocument for XML documents Before this change, we were producing a generic DOM::Document, which was not distinguishable from an XMLDocument by IDL interface type. --- ...pRequest-responseXML-gives-XMLDocument.txt | 1 + ...Request-responseXML-gives-XMLDocument.html | 19 +++++++++++++++++++ Userland/Libraries/LibWeb/DOM/XMLDocument.cpp | 5 +++++ Userland/Libraries/LibWeb/DOM/XMLDocument.h | 1 + .../Libraries/LibWeb/XHR/XMLHttpRequest.cpp | 5 +++-- 5 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 Tests/LibWeb/Text/expected/XMLHttpRequest-responseXML-gives-XMLDocument.txt create mode 100644 Tests/LibWeb/Text/input/XMLHttpRequest-responseXML-gives-XMLDocument.html diff --git a/Tests/LibWeb/Text/expected/XMLHttpRequest-responseXML-gives-XMLDocument.txt b/Tests/LibWeb/Text/expected/XMLHttpRequest-responseXML-gives-XMLDocument.txt new file mode 100644 index 0000000000..7ef22e9a43 --- /dev/null +++ b/Tests/LibWeb/Text/expected/XMLHttpRequest-responseXML-gives-XMLDocument.txt @@ -0,0 +1 @@ +PASS diff --git a/Tests/LibWeb/Text/input/XMLHttpRequest-responseXML-gives-XMLDocument.html b/Tests/LibWeb/Text/input/XMLHttpRequest-responseXML-gives-XMLDocument.html new file mode 100644 index 0000000000..2a7d0e5d70 --- /dev/null +++ b/Tests/LibWeb/Text/input/XMLHttpRequest-responseXML-gives-XMLDocument.html @@ -0,0 +1,19 @@ + + diff --git a/Userland/Libraries/LibWeb/DOM/XMLDocument.cpp b/Userland/Libraries/LibWeb/DOM/XMLDocument.cpp index 8655b8ac5f..28c824ba2d 100644 --- a/Userland/Libraries/LibWeb/DOM/XMLDocument.cpp +++ b/Userland/Libraries/LibWeb/DOM/XMLDocument.cpp @@ -9,6 +9,11 @@ namespace Web::DOM { +JS::NonnullGCPtr XMLDocument::create(JS::Realm& realm, AK::URL const& url) +{ + return realm.heap().allocate(realm, realm, url); +} + XMLDocument::XMLDocument(JS::Realm& realm, AK::URL const& url) : Document(realm, url) { diff --git a/Userland/Libraries/LibWeb/DOM/XMLDocument.h b/Userland/Libraries/LibWeb/DOM/XMLDocument.h index 6a1fb3f8cd..60a019e4be 100644 --- a/Userland/Libraries/LibWeb/DOM/XMLDocument.h +++ b/Userland/Libraries/LibWeb/DOM/XMLDocument.h @@ -14,6 +14,7 @@ class XMLDocument final : public Document { WEB_PLATFORM_OBJECT(XMLDocument, Document); public: + static JS::NonnullGCPtr create(JS::Realm&, AK::URL const&); virtual ~XMLDocument() override = default; private: diff --git a/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp b/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp index 677a824d6b..840f67f7db 100644 --- a/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp +++ b/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Andreas Kling + * Copyright (c) 2020-2023, Andreas Kling * Copyright (c) 2021-2023, Linus Groh * Copyright (c) 2022-2023, Luke Wilde * Copyright (c) 2022, Ali Mohammad Pur @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -317,7 +318,7 @@ void XMLHttpRequest::set_document_response() // 6. Otherwise, let document be a document that represents the result of running the XML parser with XML scripting support disabled on xhr’s received bytes. If that fails (unsupported character encoding, namespace well-formedness error, etc.), then return null. else { - document = DOM::Document::create(realm()); + document = DOM::XMLDocument::create(realm(), m_response->url().value_or({})); if (!Web::build_xml_document(*document, m_received_bytes)) { m_response_object = Empty {}; return;