mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-06-09 09:34:57 +09:00
LibDevTools: Add a helper to extract a DOM node JSON object more easily
The pattern of: auto tab = get_tab(); auto walker = get_walker(); if (tab && walker) { if (auto node = walker->dom_node(node_id)) { delegate().do_something(tab->description(), node); } } Is getting a bit unergonomic and is often repeated. This patch just adds a helper to WalkerActor to do most of this work, so now we have: if (auto node = WalkerActor::dom_node_for(get_walker(), node_id)) { delegate().do_something(node->tab->description(), node); }
This commit is contained in:
parent
1fc5744aa4
commit
ee88edc750
Notes:
github-actions[bot]
2025-03-08 00:28:09 +00:00
Author: https://github.com/trflynn89
Commit: ee88edc750
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/3850
5 changed files with 22 additions and 19 deletions
|
@ -39,15 +39,11 @@ void HighlighterActor::handle_message(StringView type, JsonObject const& message
|
|||
return;
|
||||
}
|
||||
|
||||
auto tab = InspectorActor::tab_for(m_inspector);
|
||||
auto walker = InspectorActor::walker_for(m_inspector);
|
||||
response.set("value"sv, false);
|
||||
|
||||
if (tab && walker) {
|
||||
if (auto const& dom_node = walker->dom_node(*node); dom_node.has_value()) {
|
||||
devtools().delegate().highlight_dom_node(tab->description(), dom_node->id, dom_node->pseudo_element);
|
||||
response.set("value"sv, true);
|
||||
}
|
||||
if (auto dom_node = WalkerActor::dom_node_for(InspectorActor::walker_for(m_inspector), *node); dom_node.has_value()) {
|
||||
devtools().delegate().highlight_dom_node(dom_node->tab->description(), dom_node->id, dom_node->pseudo_element);
|
||||
response.set("value"sv, true);
|
||||
}
|
||||
|
||||
send_message(move(response));
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include <AK/JsonObject.h>
|
||||
#include <LibDevTools/Actors/NodeActor.h>
|
||||
#include <LibDevTools/Actors/TabActor.h>
|
||||
#include <LibDevTools/Actors/WalkerActor.h>
|
||||
|
||||
namespace DevTools {
|
||||
|
@ -29,10 +30,8 @@ void NodeActor::handle_message(StringView type, JsonObject const&)
|
|||
response.set("from"sv, name());
|
||||
|
||||
if (type == "getUniqueSelector"sv) {
|
||||
if (auto walker = m_walker.strong_ref()) {
|
||||
if (auto const& dom_node = walker->dom_node(name()); dom_node.has_value())
|
||||
response.set("value"sv, dom_node->node.get_string("name"sv)->to_ascii_lowercase());
|
||||
}
|
||||
if (auto dom_node = WalkerActor::dom_node_for(m_walker, name()); dom_node.has_value())
|
||||
response.set("value"sv, dom_node->node.get_string("name"sv)->to_ascii_lowercase());
|
||||
|
||||
send_message(move(response));
|
||||
return;
|
||||
|
|
|
@ -95,19 +95,14 @@ JsonValue PageStyleActor::serialize_style() const
|
|||
template<typename Callback>
|
||||
void PageStyleActor::inspect_dom_node(StringView node_actor, Callback&& callback)
|
||||
{
|
||||
auto tab = InspectorActor::tab_for(m_inspector);
|
||||
auto walker = InspectorActor::walker_for(m_inspector);
|
||||
if (!tab || !walker)
|
||||
return;
|
||||
|
||||
auto const& dom_node = walker->dom_node(node_actor);
|
||||
auto dom_node = WalkerActor::dom_node_for(InspectorActor::walker_for(m_inspector), node_actor);
|
||||
if (!dom_node.has_value())
|
||||
return;
|
||||
|
||||
auto block_token = block_responses();
|
||||
|
||||
devtools().delegate().inspect_dom_node(
|
||||
tab->description(), dom_node->id, dom_node->pseudo_element,
|
||||
dom_node->tab->description(), dom_node->id, dom_node->pseudo_element,
|
||||
[weak_self = make_weak_ptr<PageStyleActor>(), block_token = move(block_token), callback = forward<Callback>(callback)](ErrorOr<DOMNodeProperties> properties) mutable {
|
||||
if (properties.is_error()) {
|
||||
dbgln_if(DEVTOOLS_DEBUG, "Unable to inspect DOM node: {}", properties.error());
|
||||
|
|
|
@ -249,8 +249,19 @@ JsonValue WalkerActor::serialize_node(JsonObject const& node) const
|
|||
return serialized;
|
||||
}
|
||||
|
||||
Optional<WalkerActor::DOMNode> WalkerActor::dom_node_for(WeakPtr<WalkerActor> const& weak_walker, StringView actor)
|
||||
{
|
||||
if (auto walker = weak_walker.strong_ref())
|
||||
return walker->dom_node(actor);
|
||||
return {};
|
||||
}
|
||||
|
||||
Optional<WalkerActor::DOMNode> WalkerActor::dom_node(StringView actor)
|
||||
{
|
||||
auto tab = m_tab.strong_ref();
|
||||
if (!tab)
|
||||
return {};
|
||||
|
||||
auto maybe_dom_node = m_actor_to_dom_node_map.get(actor);
|
||||
if (!maybe_dom_node.has_value() || !maybe_dom_node.value())
|
||||
return {};
|
||||
|
@ -268,7 +279,7 @@ Optional<WalkerActor::DOMNode> WalkerActor::dom_node(StringView actor)
|
|||
else
|
||||
node_id = dom_node.get_integer<Web::UniqueNodeID::Type>("id"sv).value();
|
||||
|
||||
return DOMNode { .node = dom_node, .id = node_id, .pseudo_element = pseudo_element };
|
||||
return DOMNode { .node = dom_node, .id = node_id, .pseudo_element = pseudo_element, .tab = tab.release_nonnull() };
|
||||
}
|
||||
|
||||
Optional<JsonObject const&> WalkerActor::find_node_by_selector(JsonObject const& node, StringView selector)
|
||||
|
|
|
@ -32,7 +32,9 @@ public:
|
|||
JsonObject const& node;
|
||||
Web::UniqueNodeID id { 0 };
|
||||
Optional<Web::CSS::Selector::PseudoElement::Type> pseudo_element;
|
||||
NonnullRefPtr<TabActor> tab;
|
||||
};
|
||||
static Optional<DOMNode> dom_node_for(WeakPtr<WalkerActor> const&, StringView actor);
|
||||
Optional<DOMNode> dom_node(StringView actor);
|
||||
|
||||
private:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue