/* * Copyright (c) 2025, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include namespace DevTools { class WalkerActor final : public Actor { public: static constexpr auto base_name = "walker"sv; static NonnullRefPtr create(DevToolsServer&, String name, WeakPtr, JsonObject dom_tree); virtual ~WalkerActor() override; static bool is_suitable_for_dom_inspection(JsonValue const&); JsonValue serialize_root() const; struct DOMNode { JsonObject const& node; NodeIdentifier identifier; NonnullRefPtr tab; }; static Optional dom_node_for(WeakPtr const&, StringView actor); Optional dom_node(StringView actor); private: WalkerActor(DevToolsServer&, String name, WeakPtr, JsonObject dom_tree); virtual void handle_message(Message const&) override; JsonValue serialize_node(JsonObject const&) const; Optional find_node_by_selector(JsonObject const& node, StringView selector); Optional previous_sibling_for_node(JsonObject const& node); Optional next_sibling_for_node(JsonObject const& node); Optional remove_node(JsonObject const& node); void new_dom_node_mutation(WebView::Mutation); JsonValue serialize_mutations(); bool replace_node_in_tree(JsonObject replacement); void populate_dom_tree_cache(); void populate_dom_tree_cache(JsonObject& node, JsonObject const* parent); NodeActor const& actor_for_node(JsonObject const& node); WeakPtr m_tab; WeakPtr m_layout_inspector; JsonObject m_dom_tree; Vector m_dom_node_mutations; bool m_has_new_mutations_since_last_mutations_request { false }; HashMap m_dom_node_to_parent_map; HashMap m_actor_to_dom_node_map; HashMap m_dom_node_id_to_actor_map; HashMap> m_node_actors; }; }