From a44d54f19596f00627b43e26df2bc06d70ee7e78 Mon Sep 17 00:00:00 2001 From: ldm0 Date: Fri, 17 Jul 2026 11:59:11 +0800 Subject: [PATCH] fix(domparser): align XML parse documents with HTML --- .../wpt-cross-current/failed-cases.txt | 1 - .../wpt-cross-current/passed-cases.txt | 1 + moli-renderer-v8/src/dom_parser.rs | 31 +++++++++---------- .../script_vm/tests/dom_elements/detached.rs | 20 +++++++++--- 4 files changed, 31 insertions(+), 22 deletions(-) diff --git a/moli-benchmark/wpt-cross-current/failed-cases.txt b/moli-benchmark/wpt-cross-current/failed-cases.txt index 7d23fa5091..0c998778c0 100644 --- a/moli-benchmark/wpt-cross-current/failed-cases.txt +++ b/moli-benchmark/wpt-cross-current/failed-cases.txt @@ -2556,7 +2556,6 @@ domparsing/DOMParser-parseFromString-url-moretests.html domparsing/DOMParser-parseFromString-url-pushstate.html domparsing/DOMParser-parseFromString-url.html domparsing/DOMParser-parseFromString-xml-internal-subset.html -domparsing/DOMParser-parseFromString-xml.html domparsing/XMLSerializer-serializeToString.html domparsing/insert_adjacent_html.html domparsing/tentative/all-stream-methods-with-trusted-types-no-policy.html diff --git a/moli-benchmark/wpt-cross-current/passed-cases.txt b/moli-benchmark/wpt-cross-current/passed-cases.txt index 57aec96c19..ff9ba31081 100644 --- a/moli-benchmark/wpt-cross-current/passed-cases.txt +++ b/moli-benchmark/wpt-cross-current/passed-cases.txt @@ -4102,6 +4102,7 @@ domparsing/DOMParser-parseFromString-html.html domparsing/DOMParser-parseFromString-stylesheets.html domparsing/DOMParser-parseFromString-xml-doctype.html domparsing/DOMParser-parseFromString-xml-parsererror.html +domparsing/DOMParser-parseFromString-xml.html domparsing/createContextualFragment-in-detached-xml-document-crash.html domparsing/createContextualFragment.html domparsing/domparser-spurious-attributes.html diff --git a/moli-renderer-v8/src/dom_parser.rs b/moli-renderer-v8/src/dom_parser.rs index f1703887c6..02ec8c7270 100644 --- a/moli-renderer-v8/src/dom_parser.rs +++ b/moli-renderer-v8/src/dom_parser.rs @@ -25,10 +25,21 @@ const PARSER_ERROR_DETAIL_STYLE: &str = "font-family:monospace;font-size:12px"; #[derive(Clone, Copy, Debug, PartialEq, Eq)] enum DetachedDocumentKind { + Document, Html, Xml, } +impl DetachedDocumentKind { + fn bridge_kind(self) -> &'static str { + match self { + Self::Document => "plain", + Self::Html => "html", + Self::Xml => "xml", + } + } +} + #[derive(Clone, Copy, webidl::WebIdlEnum)] #[webidl(name = "SupportedType")] enum DomParserSupportedType { @@ -193,7 +204,7 @@ pub(super) fn parse_detached_document_from_string<'s>( build_detached_document_with_content_type( scope, parsed, - DetachedDocumentKind::Xml, + DetachedDocumentKind::Document, false, Some(mime), ) @@ -447,13 +458,9 @@ fn build_detached_document_with_content_type<'s>( content_type: Option<&str>, ) -> Option> { let _ = expose_declarative_shadow_roots; - let kind = match kind { - DetachedDocumentKind::Html => "html", - DetachedDocumentKind::Xml => "xml", - }; build_detached_document_object_from_dom_host_with_content_type( scope, - kind, + kind.bridge_kind(), DomHost::from_dom(parsed), content_type, None, @@ -467,11 +474,7 @@ fn build_detached_document_from_dom_host<'s>( expose_declarative_shadow_roots: bool, ) -> Option> { let _ = expose_declarative_shadow_roots; - let kind = match kind { - DetachedDocumentKind::Html => "html", - DetachedDocumentKind::Xml => "xml", - }; - build_detached_document_object_from_dom_host(scope, kind, parsed) + build_detached_document_object_from_dom_host(scope, kind.bridge_kind(), parsed) } fn build_detached_document_from_dom_host_with_content_type<'s>( @@ -483,13 +486,9 @@ fn build_detached_document_from_dom_host_with_content_type<'s>( character_set: Option<&str>, ) -> Option> { let _ = expose_declarative_shadow_roots; - let kind = match kind { - DetachedDocumentKind::Html => "html", - DetachedDocumentKind::Xml => "xml", - }; build_detached_document_object_from_dom_host_with_content_type( scope, - kind, + kind.bridge_kind(), parsed, content_type, character_set, diff --git a/moli-renderer-v8/src/script_vm/tests/dom_elements/detached.rs b/moli-renderer-v8/src/script_vm/tests/dom_elements/detached.rs index 2a7b576747..c690ccc45d 100644 --- a/moli-renderer-v8/src/script_vm/tests/dom_elements/detached.rs +++ b/moli-renderer-v8/src/script_vm/tests/dom_elements/detached.rs @@ -363,7 +363,7 @@ fn offline_html_documents_parse_and_serialize_noscript_with_scripting_disabled() } #[test] -fn domparser_xml_preserves_requested_content_type_for_success_and_error_documents() { +fn domparser_xml_uses_document_interface_and_chromium_error_documents() { let mut vm = new_storage_test_vm("https://domparser-xml-content-type.test/"); let result = vm @@ -378,14 +378,24 @@ fn domparser_xml_preserves_requested_content_type_for_success_and_error_document "image/svg+xml" ].map(contentType => { const valid = parser.parseFromString("", contentType); - const invalid = parser.parseFromString( + const invalid = parser.parseFromString("", contentType); + const namespaceInvalid = parser.parseFromString( '1', contentType ); + const invalidError = invalid.getElementsByTagName("parsererror")[0]; + const namespaceError = namespaceInvalid.getElementsByTagName("parsererror")[0]; return [ valid.contentType, + Object.getPrototypeOf(valid) === Document.prototype, + valid instanceof XMLDocument, invalid.contentType, - invalid.documentElement.localName + Object.getPrototypeOf(invalid) === Document.prototype, + invalid instanceof XMLDocument, + invalid.documentElement.localName, + invalidError.namespaceURI, + namespaceInvalid.documentElement.localName, + namespaceError.namespaceURI ]; })); })() @@ -395,7 +405,7 @@ fn domparser_xml_preserves_requested_content_type_for_success_and_error_document assert_eq!( result, - r#"[["text/xml","text/xml","html"],["application/xml","application/xml","html"],["application/xhtml+xml","application/xhtml+xml","html"],["image/svg+xml","image/svg+xml","html"]]"# + r#"[["text/xml",true,false,"text/xml",true,false,"foo","http://www.w3.org/1999/xhtml","html","http://www.w3.org/1999/xhtml"],["application/xml",true,false,"application/xml",true,false,"foo","http://www.w3.org/1999/xhtml","html","http://www.w3.org/1999/xhtml"],["application/xhtml+xml",true,false,"application/xhtml+xml",true,false,"foo","http://www.w3.org/1999/xhtml","html","http://www.w3.org/1999/xhtml"],["image/svg+xml",true,false,"image/svg+xml",true,false,"foo","http://www.w3.org/1999/xhtml","html","http://www.w3.org/1999/xhtml"]]"# ); } @@ -8347,7 +8357,7 @@ fn detached_document_state_accessors_are_declared_on_prototypes() { descriptorOwner(htmlProto, "fonts") === Document.prototype, descriptorOwner(htmlProto, "implementation") === Document.prototype, htmlProto === HTMLDocument.prototype, - xmlProto === XMLDocument.prototype + xmlProto === Document.prototype ].join(","); return [