From 80d7350ee532cad5f60378105f4261f65d6d96b9 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Thu, 13 Mar 2025 16:59:38 -0400 Subject: [PATCH] LibDevTools: Ensure the walker actor only displays nodes it created The NodeIdentifier struct essentially contains the DOM node ID within its WebContent process. These will repeat across multiple processes, thus we cannot use them to search for node actors in the global actor registry. Instead, we can store a map of all node actors created by the walker itself. The NodeIdentifier is then appropriate for actor lookups on that map. This has the added benefit of not needing to search the entire actor registry many times while forming the DOM node caches. This fix allows us to inspect multiple tabs at once. --- Libraries/LibDevTools/Actors/NodeActor.h | 17 +++++++++++++++++ Libraries/LibDevTools/Actors/WalkerActor.cpp | 13 ++++++------- Libraries/LibDevTools/Actors/WalkerActor.h | 2 ++ 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/Libraries/LibDevTools/Actors/NodeActor.h b/Libraries/LibDevTools/Actors/NodeActor.h index dd081b7709f..09d4a8942d0 100644 --- a/Libraries/LibDevTools/Actors/NodeActor.h +++ b/Libraries/LibDevTools/Actors/NodeActor.h @@ -6,7 +6,9 @@ #pragma once +#include #include +#include #include #include #include @@ -30,6 +32,7 @@ public: virtual ~NodeActor() override; NodeIdentifier const& node_identifier() const { return m_node_identifier; } + WeakPtr const& walker() const { return m_walker; } private: NodeActor(DevToolsServer&, String name, NodeIdentifier, WeakPtr); @@ -42,3 +45,17 @@ private: }; } + +template<> +struct AK::Traits : public AK::DefaultTraits { + static bool equals(DevTools::NodeIdentifier const& lhs, DevTools::NodeIdentifier const& rhs) + { + return lhs == rhs; + } + + static unsigned hash(DevTools::NodeIdentifier const& node_identifier) + { + auto pseudo_element = node_identifier.pseudo_element.value_or(Web::CSS::Selector::PseudoElement::Type::KnownPseudoElementCount); + return pair_int_hash(node_identifier.id.value(), to_underlying(pseudo_element)); + } +}; diff --git a/Libraries/LibDevTools/Actors/WalkerActor.cpp b/Libraries/LibDevTools/Actors/WalkerActor.cpp index 98e4153c1f9..83230edb150 100644 --- a/Libraries/LibDevTools/Actors/WalkerActor.cpp +++ b/Libraries/LibDevTools/Actors/WalkerActor.cpp @@ -728,16 +728,15 @@ NodeActor const& WalkerActor::actor_for_node(JsonObject const& node) { auto identifier = NodeIdentifier::for_node(node); - for (auto const& actor : devtools().actor_registry()) { - auto const* node_actor = as_if(*actor.value); - if (!node_actor) - continue; - - if (node_actor->node_identifier() == identifier) + if (auto it = m_node_actors.find(identifier); it != m_node_actors.end()) { + if (auto node_actor = it->value.strong_ref()) return *node_actor; } - return devtools().register_actor(move(identifier), *this); + auto& node_actor = devtools().register_actor(move(identifier), *this); + m_node_actors.set(identifier, node_actor); + + return node_actor; } } diff --git a/Libraries/LibDevTools/Actors/WalkerActor.h b/Libraries/LibDevTools/Actors/WalkerActor.h index 617bbeca948..552e832d10c 100644 --- a/Libraries/LibDevTools/Actors/WalkerActor.h +++ b/Libraries/LibDevTools/Actors/WalkerActor.h @@ -68,6 +68,8 @@ private: 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; }; }