Przeglądaj źródła

LibWebView+WebContent: Add WebContent IPC to create children DOM nodes

This adds IPC to create append a child <div> element or a text node to
a DOM node.
Timothy Flynn 1 rok temu
rodzic
commit
111e53a2f6

+ 10 - 0
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<i32> ViewImplementation::create_child_element(i32 node_id)
+{
+    return client().create_child_element(node_id);
+}
+
+Optional<i32> 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);

+ 2 - 0
Userland/Libraries/LibWebView/ViewImplementation.h

@@ -67,6 +67,8 @@ public:
     Optional<i32> set_dom_node_tag(i32 node_id, String name);
     void add_dom_node_attributes(i32 node_id, Vector<Attribute> attributes);
     void replace_dom_node_attribute(i32 node_id, String name, Vector<Attribute> replacement_attributes);
+    Optional<i32> create_child_element(i32 node_id);
+    Optional<i32> create_child_text_node(i32 node_id);
     void remove_dom_node(i32 node_id);
     Optional<String> get_dom_node_html(i32 node_id);
 

+ 25 - 0
Userland/Services/WebContent/ConnectionFromClient.cpp

@@ -27,6 +27,7 @@
 #include <LibWeb/DOM/Document.h>
 #include <LibWeb/DOM/Element.h>
 #include <LibWeb/DOM/ElementFactory.h>
+#include <LibWeb/DOM/Text.h>
 #include <LibWeb/Dump.h>
 #include <LibWeb/HTML/BrowsingContext.h>
 #include <LibWeb/HTML/Scripting/ClassicScript.h>
@@ -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<Web::DOM::Text>(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();

+ 2 - 0
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<WebView::Attribute> const& attributes) override;
     virtual void replace_dom_node_attribute(i32 node_id, String const& name, Vector<WebView::Attribute> 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;
 

+ 2 - 0
Userland/Services/WebContent/WebContentServer.ipc

@@ -50,6 +50,8 @@ endpoint WebContentServer
     set_dom_node_tag(i32 node_id, String name) => (Optional<i32> node_id)
     add_dom_node_attributes(i32 node_id, Vector<WebView::Attribute> attributes) =|
     replace_dom_node_attribute(i32 node_id, String name, Vector<WebView::Attribute> replacement_attributes) =|
+    create_child_element(i32 node_id) => (Optional<i32> node_id)
+    create_child_text_node(i32 node_id) => (Optional<i32> node_id)
     remove_dom_node(i32 node_id) =|
     get_dom_node_html(i32 node_id) => (Optional<String> html)