diff --git a/experiments/WebScene.NativeEngine.Probe/native/webscene_native_dom.h b/experiments/WebScene.NativeEngine.Probe/native/webscene_native_dom.h index 159c6ecc..c102491e 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 3dcde820..0965f135 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 390b802c..268fa920 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 6cc8af0e..88cef060 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()); }