From 0ddca7ecce321160b2e42feb5bd2182c7d27cd8e Mon Sep 17 00:00:00 2001 From: ldm0 Date: Wed, 16 Sep 2026 20:02:27 +0800 Subject: [PATCH] fix(dom): preserve isolated realms in document factories --- .../src/native_bridge/element/query.rs | 8 ++++++- .../tests/dom_elements/wrapper_identity.rs | 23 ++++++++++++++----- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/moli-renderer-v8/src/native_bridge/element/query.rs b/moli-renderer-v8/src/native_bridge/element/query.rs index e8ed22f8d..af882a7f6 100644 --- a/moli-renderer-v8/src/native_bridge/element/query.rs +++ b/moli-renderer-v8/src/native_bridge/element/query.rs @@ -133,7 +133,13 @@ pub(in crate::native_bridge) fn node_query_selector_callback<'s>( None => unsafe { &*runtime_ptr }.query_selector(Some(handle), &parsed.selectors), }; match result { - Ok(handle) => set_wrapped_handle_or_null_for_receiver(scope, &mut rv, runtime_ptr, args.this(), handle), + Ok(handle) => set_wrapped_handle_or_null_for_receiver( + scope, + &mut rv, + runtime_ptr, + args.this(), + handle, + ), Err(error) => throw_native_selector_error_for_selector(scope, &parsed.selectors, &error), } } diff --git a/moli-renderer-v8/src/script_vm/tests/dom_elements/wrapper_identity.rs b/moli-renderer-v8/src/script_vm/tests/dom_elements/wrapper_identity.rs index 6ea87b013..5a91262ae 100644 --- a/moli-renderer-v8/src/script_vm/tests/dom_elements/wrapper_identity.rs +++ b/moli-renderer-v8/src/script_vm/tests/dom_elements/wrapper_identity.rs @@ -457,14 +457,25 @@ fn isolated_child_dom_wrappers_use_isolated_intrinsic_prototypes() { (() => { const element = document.getElementById("shared-node"); const created = document.createElement("span"); - const traversed = document.createTreeWalker(document, NodeFilter.SHOW_ELEMENT).nextNode(); - const correct = Object.getPrototypeOf(document) === HTMLDocument.prototype && - Object.getPrototypeOf(element) === HTMLDivElement.prototype && - Object.getPrototypeOf(created) === HTMLSpanElement.prototype && - Object.getPrototypeOf(traversed) === HTMLHtmlElement.prototype; + const walker = document.createTreeWalker(document, NodeFilter.SHOW_ELEMENT); + const iterator = document.createNodeIterator(document, NodeFilter.SHOW_ELEMENT); + const checks = { + document: Object.getPrototypeOf(document) === HTMLDocument.prototype, + element: Object.getPrototypeOf(element) === HTMLDivElement.prototype, + created: Object.getPrototypeOf(created) === HTMLSpanElement.prototype, + walker: Object.getPrototypeOf(walker) === TreeWalker.prototype, + traversed: Object.getPrototypeOf(walker.nextNode()) === HTMLHtmlElement.prototype, + iterator: Object.getPrototypeOf(iterator) === NodeIterator.prototype, + iterated: Object.getPrototypeOf(iterator.nextNode()) === HTMLHtmlElement.prototype, + attribute: Object.getPrototypeOf(document.createAttribute("test")) === Attr.prototype, + attributeNS: Object.getPrototypeOf(document.createAttributeNS(null, "test")) === Attr.prototype, + }; + for (const [name, passed] of Object.entries(checks)) { + if (!passed) throw new Error(`wrong isolated-world prototype: ${name}`); + } element.isolatedMarker = true; Object.setPrototypeOf(element, null); - return correct && document.getElementById("shared-node") === element && + return document.getElementById("shared-node") === element && Object.getPrototypeOf(element) === null; })() "#,