/* * Copyright (c) 2025, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #include #include #include namespace DevTools { NonnullRefPtr InspectorActor::create(DevToolsServer& devtools, String name, WeakPtr tab) { return adopt_ref(*new InspectorActor(devtools, move(name), move(tab))); } InspectorActor::InspectorActor(DevToolsServer& devtools, String name, WeakPtr tab) : Actor(devtools, move(name)) , m_tab(move(tab)) { } InspectorActor::~InspectorActor() = default; void InspectorActor::handle_message(StringView type, JsonObject const&) { JsonObject response; response.set("from"sv, name()); if (type == "getPageStyle"sv) { if (!m_page_style) m_page_style = devtools().register_actor(); response.set("pageStyle"sv, m_page_style->serialize_style()); send_message(move(response)); return; } if (type == "getHighlighterByType"sv) { if (!m_highlighter) m_highlighter = devtools().register_actor(); response.set("highlighter"sv, m_highlighter->serialize_highlighter()); send_message(move(response)); return; } if (type == "getWalker"sv) { if (auto tab = m_tab.strong_ref()) { auto block_token = block_responses(); devtools().delegate().inspect_tab(tab->description(), [weak_self = make_weak_ptr(), block_token = move(block_token)](ErrorOr dom_tree) mutable { if (dom_tree.is_error()) { dbgln_if(DEVTOOLS_DEBUG, "Unable to retrieve DOM tree: {}", dom_tree.error()); return; } if (!WalkerActor::is_suitable_for_dom_inspection(dom_tree.value())) { dbgln_if(DEVTOOLS_DEBUG, "Did not receive a suitable DOM tree: {}", dom_tree); return; } if (auto self = weak_self.strong_ref()) self->received_dom_tree(move(dom_tree.release_value().as_object()), move(block_token)); }); } return; } send_unrecognized_packet_type_error(type); } void InspectorActor::received_dom_tree(JsonObject dom_tree, BlockToken block_token) { auto& walker_actor = devtools().register_actor(m_tab, move(dom_tree)); JsonObject walker; walker.set("actor"sv, walker_actor.name()); walker.set("root"sv, walker_actor.serialize_root()); JsonObject message; message.set("from"sv, name()); message.set("walker"sv, move(walker)); send_message(move(message), move(block_token)); } }