From dee02ab30a4a950ab5ea8e1ab29e274057696d3f Mon Sep 17 00:00:00 2001 From: Vyacheslav Pukhanov Date: Wed, 24 Nov 2021 20:05:39 +0300 Subject: [PATCH] WebContent: Support inspection of DOM in nested browsing contexts This lets user select a node from a nested browsing context in the Inspector (e.g. a node inside an `iframe` document) to highlight it on the page. --- .../Services/WebContent/ClientConnection.cpp | 56 ++++++++++--------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/Userland/Services/WebContent/ClientConnection.cpp b/Userland/Services/WebContent/ClientConnection.cpp index 8ec0806c77..982e54700a 100644 --- a/Userland/Services/WebContent/ClientConnection.cpp +++ b/Userland/Services/WebContent/ClientConnection.cpp @@ -235,36 +235,42 @@ void ClientConnection::inspect_dom_tree() Messages::WebContentServer::InspectDomNodeResponse ClientConnection::inspect_dom_node(i32 node_id) { - if (auto* doc = page().top_level_browsing_context().active_document()) { - Web::DOM::Node* node = Web::DOM::Node::from_id(node_id); - if (!node || (&node->document() != doc)) { - doc->set_inspected_node(nullptr); + auto& top_context = page().top_level_browsing_context(); + + top_context.for_each_in_inclusive_subtree([&](auto& ctx) { + if (ctx.active_document() != nullptr) { + ctx.active_document()->set_inspected_node(nullptr); + } + return IterationDecision::Continue; + }); + + Web::DOM::Node* node = Web::DOM::Node::from_id(node_id); + if (!node) { + return { false, "", "" }; + } + + node->document().set_inspected_node(node); + + if (node->is_element()) { + auto& element = verify_cast(*node); + if (!element.specified_css_values()) return { false, "", "" }; - } - doc->set_inspected_node(node); + auto serialize_json = [](Web::CSS::StyleProperties const& properties) -> String { + StringBuilder builder; - if (node->is_element()) { - auto& element = verify_cast(*node); - if (!element.specified_css_values()) - return { false, "", "" }; + JsonObjectSerializer serializer(builder); + properties.for_each_property([&](auto property_id, auto& value) { + serializer.add(Web::CSS::string_from_property_id(property_id), value.to_string()); + }); + serializer.finish(); - auto serialize_json = [](Web::CSS::StyleProperties const& properties) -> String { - StringBuilder builder; + return builder.to_string(); + }; - JsonObjectSerializer serializer(builder); - properties.for_each_property([&](auto property_id, auto& value) { - serializer.add(Web::CSS::string_from_property_id(property_id), value.to_string()); - }); - serializer.finish(); - - return builder.to_string(); - }; - - String specified_values_json = serialize_json(*element.specified_css_values()); - String computed_values_json = serialize_json(element.computed_style()); - return { true, specified_values_json, computed_values_json }; - } + String specified_values_json = serialize_json(*element.specified_css_values()); + String computed_values_json = serialize_json(element.computed_style()); + return { true, specified_values_json, computed_values_json }; } return { false, "", "" };