From c6a11a77b553f79141d43ac56ef1d19056b73113 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Thu, 7 Dec 2023 11:12:43 -0500 Subject: [PATCH] LibWebView+WebContent: Add a WebContent IPC to clone a DOM node --- Userland/Libraries/LibWebView/ViewImplementation.cpp | 5 +++++ Userland/Libraries/LibWebView/ViewImplementation.h | 1 + .../Services/WebContent/ConnectionFromClient.cpp | 12 ++++++++++++ Userland/Services/WebContent/ConnectionFromClient.h | 1 + Userland/Services/WebContent/WebContentServer.ipc | 1 + 5 files changed, 20 insertions(+) diff --git a/Userland/Libraries/LibWebView/ViewImplementation.cpp b/Userland/Libraries/LibWebView/ViewImplementation.cpp index d98ff6e0bf..840114b854 100644 --- a/Userland/Libraries/LibWebView/ViewImplementation.cpp +++ b/Userland/Libraries/LibWebView/ViewImplementation.cpp @@ -211,6 +211,11 @@ Optional ViewImplementation::create_child_text_node(i32 node_id) return client().create_child_text_node(node_id); } +Optional ViewImplementation::clone_dom_node(i32 node_id) +{ + return client().clone_dom_node(node_id); +} + void ViewImplementation::remove_dom_node(i32 node_id) { client().async_remove_dom_node(node_id); diff --git a/Userland/Libraries/LibWebView/ViewImplementation.h b/Userland/Libraries/LibWebView/ViewImplementation.h index 6ab741344c..4f9d5770a6 100644 --- a/Userland/Libraries/LibWebView/ViewImplementation.h +++ b/Userland/Libraries/LibWebView/ViewImplementation.h @@ -69,6 +69,7 @@ public: void replace_dom_node_attribute(i32 node_id, String name, Vector replacement_attributes); Optional create_child_element(i32 node_id); Optional create_child_text_node(i32 node_id); + Optional clone_dom_node(i32 node_id); void remove_dom_node(i32 node_id); Optional get_dom_node_html(i32 node_id); diff --git a/Userland/Services/WebContent/ConnectionFromClient.cpp b/Userland/Services/WebContent/ConnectionFromClient.cpp index 77dd57efb2..4fcafa7bad 100644 --- a/Userland/Services/WebContent/ConnectionFromClient.cpp +++ b/Userland/Services/WebContent/ConnectionFromClient.cpp @@ -745,6 +745,18 @@ Messages::WebContentServer::CreateChildTextNodeResponse ConnectionFromClient::cr return text_node->unique_id(); } +Messages::WebContentServer::CloneDomNodeResponse ConnectionFromClient::clone_dom_node(i32 node_id) +{ + auto* dom_node = Web::DOM::Node::from_unique_id(node_id); + if (!dom_node || !dom_node->parent_node()) + return OptionalNone {}; + + auto dom_node_clone = dom_node->clone_node(nullptr, true); + dom_node->parent_node()->insert_before(dom_node_clone, dom_node->next_sibling()); + + return dom_node_clone->unique_id(); +} + void ConnectionFromClient::remove_dom_node(i32 node_id) { auto* active_document = page().page().top_level_browsing_context().active_document(); diff --git a/Userland/Services/WebContent/ConnectionFromClient.h b/Userland/Services/WebContent/ConnectionFromClient.h index 5902ac711f..cf2fc794ad 100644 --- a/Userland/Services/WebContent/ConnectionFromClient.h +++ b/Userland/Services/WebContent/ConnectionFromClient.h @@ -82,6 +82,7 @@ private: virtual void replace_dom_node_attribute(i32 node_id, String const& name, Vector const& replacement_attributes) override; virtual Messages::WebContentServer::CreateChildElementResponse create_child_element(i32 node_id) override; virtual Messages::WebContentServer::CreateChildTextNodeResponse create_child_text_node(i32 node_id) override; + virtual Messages::WebContentServer::CloneDomNodeResponse clone_dom_node(i32 node_id) override; virtual void remove_dom_node(i32 node_id) override; virtual Messages::WebContentServer::GetDomNodeHtmlResponse get_dom_node_html(i32 node_id) override; diff --git a/Userland/Services/WebContent/WebContentServer.ipc b/Userland/Services/WebContent/WebContentServer.ipc index 135739be44..5926171255 100644 --- a/Userland/Services/WebContent/WebContentServer.ipc +++ b/Userland/Services/WebContent/WebContentServer.ipc @@ -52,6 +52,7 @@ endpoint WebContentServer replace_dom_node_attribute(i32 node_id, String name, Vector replacement_attributes) =| create_child_element(i32 node_id) => (Optional node_id) create_child_text_node(i32 node_id) => (Optional node_id) + clone_dom_node(i32 node_id) => (Optional node_id) remove_dom_node(i32 node_id) =| get_dom_node_html(i32 node_id) => (Optional html)