Jelajahi Sumber

LibWeb: Expose Node.appendChild() to the web

This is a very barebones implementation of appendChild() that doesn't
take any of the idiosyncratic DOM behaviors into account yet.

Also teach the wrapper generator how to turn an Interpreter argument
into a Node&.
Andreas Kling 5 tahun lalu
induk
melakukan
bc4fa7a3c9

+ 7 - 0
Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp

@@ -473,6 +473,13 @@ void generate_implementation(const IDL::Interface& interface)
                 out() << "    auto " << snake_name(parameter.name) << " = interpreter.argument(" << argument_index << ").to_string(interpreter);";
                 out() << "    if (interpreter.exception())";
                 out() << "        return {};";
+            } else if (parameter.type.name == "Node") {
+                out() << "    auto " << snake_name(parameter.name) << "_object = interpreter.argument(" << argument_index << ").to_object(interpreter, global_object);";
+                out() << "    if (interpreter.exception())";
+                out() << "        return {};";
+                out() << "    if (!" << snake_name(parameter.name) << "_object->is_web_wrapper() || !static_cast<Wrapper*>(" << snake_name(parameter.name) << "_object)->is_node_wrapper())";
+                out() << "        return interpreter.throw_exception<JS::TypeError>(JS::ErrorType::NotA, \"" << parameter.type.name << "\");";
+                out() << "    auto& " << snake_name(parameter.name) << " = static_cast<" << wrapper_class << "*>(" << snake_name(parameter.name) << "_object)->impl();";
             }
             ++argument_index;
         }

+ 6 - 0
Libraries/LibWeb/DOM/Node.cpp

@@ -193,4 +193,10 @@ const Element* Node::parent_element() const
     return to<Element>(parent());
 }
 
+RefPtr<Node> Node::append_child(NonnullRefPtr<Node> node, bool notify)
+{
+    TreeNode<Node>::append_child(node, notify);
+    return node;
+}
+
 }

+ 2 - 0
Libraries/LibWeb/DOM/Node.h

@@ -82,6 +82,8 @@ public:
     bool is_document_fragment() const { return type() == NodeType::DOCUMENT_FRAGMENT_NODE; }
     bool is_parent_node() const { return is_element() || is_document() || is_document_fragment(); }
 
+    RefPtr<Node> append_child(NonnullRefPtr<Node>, bool notify = true);
+
     virtual RefPtr<LayoutNode> create_layout_node(const StyleProperties* parent_style) const;
 
     virtual FlyString node_name() const = 0;

+ 1 - 0
Libraries/LibWeb/DOM/Node.idl

@@ -8,5 +8,6 @@ interface Node : EventTarget {
     readonly attribute Node? parentNode;
     readonly attribute Element? parentElement;
 
+    Node appendChild(Node node);
 }