From 2cdad0f0686fa0939d1bb709a795c8fde890e5e7 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Tue, 5 Dec 2023 16:43:14 -0500 Subject: [PATCH] LibWeb+LibWebView+WebContent: Add an Inspector IPC to add DOM attributes --- .../Libraries/LibWeb/Internals/Inspector.cpp | 5 +++++ .../Libraries/LibWeb/Internals/Inspector.h | 1 + .../Libraries/LibWeb/Internals/Inspector.idl | 1 + Userland/Libraries/LibWeb/Page/Page.h | 1 + .../Libraries/LibWebView/ViewImplementation.h | 1 + .../Libraries/LibWebView/WebContentClient.cpp | 6 ++++++ .../Libraries/LibWebView/WebContentClient.h | 1 + Userland/Services/WebContent/PageClient.cpp | 20 ++++++++++++++----- Userland/Services/WebContent/PageClient.h | 1 + .../Services/WebContent/WebContentClient.ipc | 1 + 10 files changed, 33 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibWeb/Internals/Inspector.cpp b/Userland/Libraries/LibWeb/Internals/Inspector.cpp index b90dadfe19..c21898df3f 100644 --- a/Userland/Libraries/LibWeb/Internals/Inspector.cpp +++ b/Userland/Libraries/LibWeb/Internals/Inspector.cpp @@ -56,6 +56,11 @@ void Inspector::set_dom_node_tag(i32 node_id, String const& tag) global_object().browsing_context()->page().client().inspector_did_set_dom_node_tag(node_id, tag); } +void Inspector::add_dom_node_attributes(i32 node_id, JS::NonnullGCPtr attributes) +{ + global_object().browsing_context()->page().client().inspector_did_add_dom_node_attributes(node_id, attributes); +} + void Inspector::replace_dom_node_attribute(i32 node_id, String const& name, JS::NonnullGCPtr replacement_attributes) { global_object().browsing_context()->page().client().inspector_did_replace_dom_node_attribute(node_id, name, replacement_attributes); diff --git a/Userland/Libraries/LibWeb/Internals/Inspector.h b/Userland/Libraries/LibWeb/Internals/Inspector.h index d78680b98b..a7e7ab42fd 100644 --- a/Userland/Libraries/LibWeb/Internals/Inspector.h +++ b/Userland/Libraries/LibWeb/Internals/Inspector.h @@ -23,6 +23,7 @@ public: void set_dom_node_text(i32 node_id, String const& text); void set_dom_node_tag(i32 node_id, String const& tag); + void add_dom_node_attributes(i32 node_id, JS::NonnullGCPtr attributes); void replace_dom_node_attribute(i32 node_id, String const& name, JS::NonnullGCPtr replacement_attributes); void request_dom_tree_context_menu(i32 node_id, i32 client_x, i32 client_y, String const& type, Optional const& tag_or_attribute_name); diff --git a/Userland/Libraries/LibWeb/Internals/Inspector.idl b/Userland/Libraries/LibWeb/Internals/Inspector.idl index 13dafda0e4..37e12273da 100644 --- a/Userland/Libraries/LibWeb/Internals/Inspector.idl +++ b/Userland/Libraries/LibWeb/Internals/Inspector.idl @@ -7,6 +7,7 @@ undefined setDOMNodeText(long nodeID, DOMString text); undefined setDOMNodeTag(long nodeID, DOMString tag); + undefined addDOMNodeAttributes(long nodeID, NamedNodeMap attributes); undefined replaceDOMNodeAttribute(long nodeID, DOMString name, NamedNodeMap replacementAttributes); undefined requestDOMTreeContextMenu(long nodeID, long clientX, long clientY, DOMString type, DOMString? tagOrAttributeName); diff --git a/Userland/Libraries/LibWeb/Page/Page.h b/Userland/Libraries/LibWeb/Page/Page.h index a5320759b3..84216739db 100644 --- a/Userland/Libraries/LibWeb/Page/Page.h +++ b/Userland/Libraries/LibWeb/Page/Page.h @@ -274,6 +274,7 @@ public: virtual void inspector_did_select_dom_node([[maybe_unused]] i32 node_id, [[maybe_unused]] Optional const& pseudo_element) { } virtual void inspector_did_set_dom_node_text([[maybe_unused]] i32 node_id, [[maybe_unused]] String const& text) { } virtual void inspector_did_set_dom_node_tag([[maybe_unused]] i32 node_id, [[maybe_unused]] String const& tag) { } + virtual void inspector_did_add_dom_node_attributes([[maybe_unused]] i32 node_id, [[maybe_unused]] JS::NonnullGCPtr attributes) { } virtual void inspector_did_replace_dom_node_attribute([[maybe_unused]] i32 node_id, [[maybe_unused]] String const& name, [[maybe_unused]] JS::NonnullGCPtr replacement_attributes) { } virtual void inspector_did_request_dom_tree_context_menu([[maybe_unused]] i32 node_id, [[maybe_unused]] CSSPixelPoint position, [[maybe_unused]] String const& type, [[maybe_unused]] Optional const& tag_or_attribute_name) { } virtual void inspector_did_execute_console_script([[maybe_unused]] String const& script) { } diff --git a/Userland/Libraries/LibWebView/ViewImplementation.h b/Userland/Libraries/LibWebView/ViewImplementation.h index a2eda69420..e8677e0f78 100644 --- a/Userland/Libraries/LibWebView/ViewImplementation.h +++ b/Userland/Libraries/LibWebView/ViewImplementation.h @@ -155,6 +155,7 @@ public: Function const&)> on_inspector_selected_dom_node; Function on_inspector_set_dom_node_text; Function on_inspector_set_dom_node_tag; + Function const&)> on_inspector_added_dom_node_attributes; Function const&)> on_inspector_replaced_dom_node_attribute; Function const&)> on_inspector_requested_dom_tree_context_menu; Function on_inspector_executed_console_script; diff --git a/Userland/Libraries/LibWebView/WebContentClient.cpp b/Userland/Libraries/LibWebView/WebContentClient.cpp index 5ea9e9da82..c1ada606d5 100644 --- a/Userland/Libraries/LibWebView/WebContentClient.cpp +++ b/Userland/Libraries/LibWebView/WebContentClient.cpp @@ -426,6 +426,12 @@ void WebContentClient::inspector_did_set_dom_node_tag(i32 node_id, String const& m_view.on_inspector_set_dom_node_tag(node_id, tag); } +void WebContentClient::inspector_did_add_dom_node_attributes(i32 node_id, Vector const& attributes) +{ + if (m_view.on_inspector_added_dom_node_attributes) + m_view.on_inspector_added_dom_node_attributes(node_id, attributes); +} + void WebContentClient::inspector_did_replace_dom_node_attribute(i32 node_id, String const& name, Vector const& replacement_attributes) { if (m_view.on_inspector_replaced_dom_node_attribute) diff --git a/Userland/Libraries/LibWebView/WebContentClient.h b/Userland/Libraries/LibWebView/WebContentClient.h index 20accc15e1..5471db0566 100644 --- a/Userland/Libraries/LibWebView/WebContentClient.h +++ b/Userland/Libraries/LibWebView/WebContentClient.h @@ -90,6 +90,7 @@ private: virtual void inspector_did_select_dom_node(i32 node_id, Optional const& pseudo_element) override; virtual void inspector_did_set_dom_node_text(i32 node_id, String const& text) override; virtual void inspector_did_set_dom_node_tag(i32 node_id, String const& tag) override; + virtual void inspector_did_add_dom_node_attributes(i32 node_id, Vector const& attributes) override; virtual void inspector_did_replace_dom_node_attribute(i32 node_id, String const& name, Vector const& replacement_attributes) override; virtual void inspector_did_request_dom_tree_context_menu(i32 node_id, Gfx::IntPoint position, String const& type, Optional const& tag_or_attribute_name) override; virtual void inspector_did_execute_console_script(String const& script) override; diff --git a/Userland/Services/WebContent/PageClient.cpp b/Userland/Services/WebContent/PageClient.cpp index 35c6f653c8..6cd2a1a908 100644 --- a/Userland/Services/WebContent/PageClient.cpp +++ b/Userland/Services/WebContent/PageClient.cpp @@ -533,19 +533,29 @@ void PageClient::inspector_did_set_dom_node_tag(i32 node_id, String const& tag) client().async_inspector_did_set_dom_node_tag(node_id, tag); } -void PageClient::inspector_did_replace_dom_node_attribute(i32 node_id, String const& name, JS::NonnullGCPtr replacement_attributes) +static Vector named_node_map_to_vector(JS::NonnullGCPtr map) { Vector attributes; - attributes.ensure_capacity(replacement_attributes->length()); + attributes.ensure_capacity(map->length()); - for (size_t i = 0; i < replacement_attributes->length(); ++i) { - auto const* attribute = replacement_attributes->item(i); + for (size_t i = 0; i < map->length(); ++i) { + auto const* attribute = map->item(i); VERIFY(attribute); attributes.empend(attribute->name().to_string(), attribute->value()); } - client().async_inspector_did_replace_dom_node_attribute(node_id, name, move(attributes)); + return attributes; +} + +void PageClient::inspector_did_add_dom_node_attributes(i32 node_id, JS::NonnullGCPtr attributes) +{ + client().async_inspector_did_add_dom_node_attributes(node_id, named_node_map_to_vector(attributes)); +} + +void PageClient::inspector_did_replace_dom_node_attribute(i32 node_id, String const& name, JS::NonnullGCPtr replacement_attributes) +{ + client().async_inspector_did_replace_dom_node_attribute(node_id, name, named_node_map_to_vector(replacement_attributes)); } void PageClient::inspector_did_request_dom_tree_context_menu(i32 node_id, Web::CSSPixelPoint position, String const& type, Optional const& tag_or_attribute_name) diff --git a/Userland/Services/WebContent/PageClient.h b/Userland/Services/WebContent/PageClient.h index 05080cb3ce..3c54f73a2a 100644 --- a/Userland/Services/WebContent/PageClient.h +++ b/Userland/Services/WebContent/PageClient.h @@ -125,6 +125,7 @@ private: virtual void inspector_did_select_dom_node(i32 node_id, Optional const& pseudo_element) override; virtual void inspector_did_set_dom_node_text(i32 node_id, String const& text) override; virtual void inspector_did_set_dom_node_tag(i32 node_id, String const& tag) override; + virtual void inspector_did_add_dom_node_attributes(i32 node_id, JS::NonnullGCPtr attributes) override; virtual void inspector_did_replace_dom_node_attribute(i32 node_id, String const& name, JS::NonnullGCPtr replacement_attributes) override; virtual void inspector_did_request_dom_tree_context_menu(i32 node_id, Web::CSSPixelPoint position, String const& type, Optional const& tag_or_attribute_name) override; virtual void inspector_did_execute_console_script(String const& script) override; diff --git a/Userland/Services/WebContent/WebContentClient.ipc b/Userland/Services/WebContent/WebContentClient.ipc index 7fb7fa0d09..1c8b1d474b 100644 --- a/Userland/Services/WebContent/WebContentClient.ipc +++ b/Userland/Services/WebContent/WebContentClient.ipc @@ -75,6 +75,7 @@ endpoint WebContentClient inspector_did_select_dom_node(i32 node_id, Optional pseudo_element) =| inspector_did_set_dom_node_text(i32 node_id, String text) =| inspector_did_set_dom_node_tag(i32 node_id, String tag) =| + inspector_did_add_dom_node_attributes(i32 node_id, Vector attributes) =| inspector_did_replace_dom_node_attribute(i32 node_id, String name, Vector replacement_attributes) =| inspector_did_request_dom_tree_context_menu(i32 node_id, Gfx::IntPoint position, String type, Optional tag_or_attribute_name) =| inspector_did_execute_console_script(String script) =|