diff --git a/Userland/Libraries/LibWebView/ViewImplementation.cpp b/Userland/Libraries/LibWebView/ViewImplementation.cpp index c9a0c59b82..d98ff6e0bf 100644 --- a/Userland/Libraries/LibWebView/ViewImplementation.cpp +++ b/Userland/Libraries/LibWebView/ViewImplementation.cpp @@ -201,6 +201,16 @@ void ViewImplementation::replace_dom_node_attribute(i32 node_id, String name, Ve client().async_replace_dom_node_attribute(node_id, move(name), move(replacement_attributes)); } +Optional ViewImplementation::create_child_element(i32 node_id) +{ + return client().create_child_element(node_id); +} + +Optional ViewImplementation::create_child_text_node(i32 node_id) +{ + return client().create_child_text_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 fc618f2575..6ab741344c 100644 --- a/Userland/Libraries/LibWebView/ViewImplementation.h +++ b/Userland/Libraries/LibWebView/ViewImplementation.h @@ -67,6 +67,8 @@ public: Optional set_dom_node_tag(i32 node_id, String name); void add_dom_node_attributes(i32 node_id, Vector attributes); 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); 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 69a9adfb5b..77dd57efb2 100644 --- a/Userland/Services/WebContent/ConnectionFromClient.cpp +++ b/Userland/Services/WebContent/ConnectionFromClient.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -720,6 +721,30 @@ void ConnectionFromClient::replace_dom_node_attribute(i32 node_id, String const& element.remove_attribute(name); } +Messages::WebContentServer::CreateChildElementResponse ConnectionFromClient::create_child_element(i32 node_id) +{ + auto* dom_node = Web::DOM::Node::from_unique_id(node_id); + if (!dom_node) + return OptionalNone {}; + + auto element = Web::DOM::create_element(dom_node->document(), Web::HTML::TagNames::div, Web::Namespace::HTML).release_value_but_fixme_should_propagate_errors(); + dom_node->append_child(element).release_value_but_fixme_should_propagate_errors(); + + return element->unique_id(); +} + +Messages::WebContentServer::CreateChildTextNodeResponse ConnectionFromClient::create_child_text_node(i32 node_id) +{ + auto* dom_node = Web::DOM::Node::from_unique_id(node_id); + if (!dom_node) + return OptionalNone {}; + + auto text_node = dom_node->heap().allocate(dom_node->realm(), dom_node->document(), "text"_string); + dom_node->append_child(text_node).release_value_but_fixme_should_propagate_errors(); + + return text_node->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 28350bfb3b..5902ac711f 100644 --- a/Userland/Services/WebContent/ConnectionFromClient.h +++ b/Userland/Services/WebContent/ConnectionFromClient.h @@ -80,6 +80,8 @@ private: virtual Messages::WebContentServer::SetDomNodeTagResponse set_dom_node_tag(i32 node_id, String const& name) override; virtual void add_dom_node_attributes(i32 node_id, Vector const& attributes) override; 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 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 a82b18085b..135739be44 100644 --- a/Userland/Services/WebContent/WebContentServer.ipc +++ b/Userland/Services/WebContent/WebContentServer.ipc @@ -50,6 +50,8 @@ endpoint WebContentServer set_dom_node_tag(i32 node_id, String name) => (Optional node_id) add_dom_node_attributes(i32 node_id, Vector attributes) =| 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) remove_dom_node(i32 node_id) =| get_dom_node_html(i32 node_id) => (Optional html)