From 51188b1b0afd96c6e59f02cb4fb34b99f382296a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Sat, 19 Sep 2026 17:17:17 +0200 Subject: [PATCH] Preserve const cascade roots in base lookup (#694) --- .../native/webscene_native_dom.h | 7 +++++++ .../native/webscene_native_dom_css_values.inc | 11 +++++++++++ .../native/webscene_native_dom_tree.inc | 9 +++++++++ .../native/webscene_v8_runtime_dom_core.inc | 3 +-- 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/experiments/WebScene.NativeEngine.Probe/native/webscene_native_dom.h b/experiments/WebScene.NativeEngine.Probe/native/webscene_native_dom.h index 159c6ecc9..c102491e5 100644 --- a/experiments/WebScene.NativeEngine.Probe/native/webscene_native_dom.h +++ b/experiments/WebScene.NativeEngine.Probe/native/webscene_native_dom.h @@ -2108,6 +2108,9 @@ class native_document final { dom_node* find_by_native_id(uint32_t id) noexcept; dom_node* find_by_id(const std::string& id) noexcept; std::vector query_selector_all(dom_node& root, const std::string& selector); + std::vector query_selector_all( + const dom_node& root, + const std::string& selector) const; bool register_modal_dialog(dom_node& scope, dom_node& dialog); void unregister_modal_dialog(const dom_node& dialog); void unregister_modal_subtree(const dom_node& root); @@ -2508,6 +2511,10 @@ class native_document final { dom_node& node, const std::string& selector, std::vector& result); + static void collect_matches( + const dom_node& node, + const std::string& selector, + std::vector& result); dom_node* hit_test_node( dom_node& node, float x, diff --git a/experiments/WebScene.NativeEngine.Probe/native/webscene_native_dom_css_values.inc b/experiments/WebScene.NativeEngine.Probe/native/webscene_native_dom_css_values.inc index 3dcde8207..0965f1351 100644 --- a/experiments/WebScene.NativeEngine.Probe/native/webscene_native_dom_css_values.inc +++ b/experiments/WebScene.NativeEngine.Probe/native/webscene_native_dom_css_values.inc @@ -648,3 +648,14 @@ void native_document::collect_matches( collect_matches(*child, selector, result); } } + +void native_document::collect_matches( + const dom_node& node, + const std::string& selector, + std::vector& result) +{ + if (matches_selector(node, selector)) result.push_back(&node); + for (const auto* child : node.children) { + collect_matches(*child, selector, result); + } +} diff --git a/experiments/WebScene.NativeEngine.Probe/native/webscene_native_dom_tree.inc b/experiments/WebScene.NativeEngine.Probe/native/webscene_native_dom_tree.inc index 390b802c8..268fa9208 100644 --- a/experiments/WebScene.NativeEngine.Probe/native/webscene_native_dom_tree.inc +++ b/experiments/WebScene.NativeEngine.Probe/native/webscene_native_dom_tree.inc @@ -676,6 +676,15 @@ std::vector native_document::query_selector_all( return result; } +std::vector native_document::query_selector_all( + const dom_node& root, + const std::string& selector) const +{ + std::vector result; + collect_matches(root, selector, result); + return result; +} + bool native_document::register_modal_dialog(dom_node& scope, dom_node& dialog) { if (&scope == &dialog || find_by_native_id(scope.id) != &scope || find_by_native_id(dialog.id) != &dialog diff --git a/experiments/WebScene.NativeEngine.Probe/native/webscene_v8_runtime_dom_core.inc b/experiments/WebScene.NativeEngine.Probe/native/webscene_v8_runtime_dom_core.inc index 6cc8af0e5..88cef0600 100644 --- a/experiments/WebScene.NativeEngine.Probe/native/webscene_v8_runtime_dom_core.inc +++ b/experiments/WebScene.NativeEngine.Probe/native/webscene_v8_runtime_dom_core.inc @@ -1259,8 +1259,7 @@ current_context->GetAlignedPointerFromEmbedderData( 1, v8::kEmbedderDataTypeTagDefault)); - if (root != nullptr) return effective_document_base( - const_cast(root)); + if (root != nullptr) return effective_document_base(root); } return effective_document_base(&document.body()); }