From fd2aef664b9291b22fe4e38e1568d543783fe689 Mon Sep 17 00:00:00 2001 From: ldm0 Date: Fri, 18 Sep 2026 23:16:36 +0800 Subject: [PATCH] fix(dom): preserve document content types for element creation Resolve the default element namespace from internal Document metadata instead of the current root element. Initialize native and detached MIME state together and preserve it when cloning, without reading overwritten public properties. Cover parser MIME types, root replacement, shallow/deep clones, explicit namespaces and getter overrides with 689 shared browser/Rust assertions. Document-createElement-namespace.html now passes all 51 subtests; all 13 related upstream cases pass (1438 subtests). Validation: cargo fmt --all; workspace/all-targets/all-features Clippy with -D warnings; cargo nextest run --no-fail-fast (19463 passed, 13 skipped). --- moli-benchmark/wpt-cross-current/passed-cases.txt | 1 + moli-renderer-v8/src/native_bridge/document.rs | 3 +++ .../src/script_vm/tests/dom_elements/detached.rs | 13 +++++++++++++ 3 files changed, 17 insertions(+) diff --git a/moli-benchmark/wpt-cross-current/passed-cases.txt b/moli-benchmark/wpt-cross-current/passed-cases.txt index 71f03753f..7d25d61a8 100644 --- a/moli-benchmark/wpt-cross-current/passed-cases.txt +++ b/moli-benchmark/wpt-cross-current/passed-cases.txt @@ -4354,6 +4354,7 @@ dom/nodes/Document-contentType/contentType/xhr_responseType_document.html dom/nodes/Document-createAttribute.html dom/nodes/Document-createCDATASection.html dom/nodes/Document-createComment.html +dom/nodes/Document-createElement-namespace.html dom/nodes/Document-createElement.html dom/nodes/Document-createElementNS.html dom/nodes/Document-createProcessingInstruction.html diff --git a/moli-renderer-v8/src/native_bridge/document.rs b/moli-renderer-v8/src/native_bridge/document.rs index cff3e5555..2f3db9050 100644 --- a/moli-renderer-v8/src/native_bridge/document.rs +++ b/moli-renderer-v8/src/native_bridge/document.rs @@ -263,6 +263,9 @@ pub(super) use detached_surface::{ detached_character_data_value, detached_text_split_text_callback, detached_text_whole_text_value, set_detached_character_data_value, }; +pub(in crate::native_bridge::document) use detached_surface::{ + detached_document_content_type_value, set_detached_document_content_type, +}; pub(in crate::native_bridge) use detached_surface::{ detached_element_local_name, detached_element_namespace_uri, detached_element_prefix, }; 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 8bb456819..bd096822e 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 @@ -12,6 +12,19 @@ fn detached_document_shallow_clones_are_empty_and_accept_a_new_root() { assert_eq!(result["checks"], 245); } +#[test] +fn detached_document_content_type_controls_element_creation_after_root_mutations_and_cloning() { + let mut vm = new_storage_test_vm("https://document-create-element-content-type.test/"); + let fixture = + include_str!("../../../../tests/fixtures/document-create-element-content-type.js"); + let result = vm + .eval(&format!("JSON.stringify({fixture})")) + .expect("Document content type and element creation probe should evaluate"); + let result: serde_json::Value = serde_json::from_str(&result).unwrap(); + assert_eq!(result["failures"], serde_json::json!([]), "{result}"); + assert_eq!(result["checks"], 689); +} + #[test] fn detached_domparser_parses_noscript_with_scripting_disabled() { let mut vm = new_storage_test_vm("https://detached-domparser-noscript.test/");