소스 검색

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.
Vyacheslav Pukhanov 3 년 전
부모
커밋
dee02ab30a
1개의 변경된 파일29개의 추가작업 그리고 23개의 파일을 삭제
  1. 29 23
      Userland/Services/WebContent/ClientConnection.cpp

+ 29 - 23
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);
-            return { false, "", "" };
+    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;
+    });
 
-        doc->set_inspected_node(node);
+    Web::DOM::Node* node = Web::DOM::Node::from_id(node_id);
+    if (!node) {
+        return { false, "", "" };
+    }
 
-        if (node->is_element()) {
-            auto& element = verify_cast<Web::DOM::Element>(*node);
-            if (!element.specified_css_values())
-                return { false, "", "" };
+    node->document().set_inspected_node(node);
 
-            auto serialize_json = [](Web::CSS::StyleProperties const& properties) -> String {
-                StringBuilder builder;
+    if (node->is_element()) {
+        auto& element = verify_cast<Web::DOM::Element>(*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();
 
-            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 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 };
     }
 
     return { false, "", "" };