From ed139bee7faf0c918b6fa57a1f9160ad19036155 Mon Sep 17 00:00:00 2001 From: Luke Date: Sat, 6 Mar 2021 17:06:25 +0000 Subject: [PATCH] LibWeb: Add a couple child node operations to Node and add node types --- Userland/Libraries/LibWeb/DOM/Node.cpp | 11 +++++++++++ Userland/Libraries/LibWeb/DOM/Node.h | 15 ++++++++++++++- Userland/Libraries/LibWeb/DOM/Node.idl | 20 +++++++++++++++++++- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibWeb/DOM/Node.cpp b/Userland/Libraries/LibWeb/DOM/Node.cpp index d66c33e138..f2bdbff321 100644 --- a/Userland/Libraries/LibWeb/DOM/Node.cpp +++ b/Userland/Libraries/LibWeb/DOM/Node.cpp @@ -266,4 +266,15 @@ ParentNode* Node::parent_or_shadow_host() return downcast(parent()); } +NonnullRefPtrVector Node::child_nodes() const +{ + NonnullRefPtrVector nodes; + + for_each_child([&](auto& child) { + nodes.append(child); + }); + + return nodes; +} + } diff --git a/Userland/Libraries/LibWeb/DOM/Node.h b/Userland/Libraries/LibWeb/DOM/Node.h index 4b1797e0ff..d9fc88687a 100644 --- a/Userland/Libraries/LibWeb/DOM/Node.h +++ b/Userland/Libraries/LibWeb/DOM/Node.h @@ -37,14 +37,20 @@ namespace Web::DOM { -enum class NodeType : unsigned { +enum class NodeType : u16 { INVALID = 0, ELEMENT_NODE = 1, + ATTRIBUTE_NODE = 2, TEXT_NODE = 3, + CDATA_SECTION_NODE = 4, + ENTITY_REFERENCE_NODE = 5, + ENTITY_NODE = 6, + PROCESSING_INSTRUCTION_NODE = 7, COMMENT_NODE = 8, DOCUMENT_NODE = 9, DOCUMENT_TYPE_NODE = 10, DOCUMENT_FRAGMENT_NODE = 11, + NOTATION_NODE = 12 }; class Node @@ -81,12 +87,19 @@ public: bool is_parent_node() const { return is_element() || is_document() || is_document_fragment(); } bool is_slottable() const { return is_element() || is_text(); } + // NOTE: This is intended for the JS bindings. + u16 node_type() const { return (u16)m_type; } + virtual bool is_editable() const; RefPtr append_child(NonnullRefPtr, bool notify = true); RefPtr insert_before(NonnullRefPtr node, RefPtr child, bool notify = true); RefPtr remove_child(NonnullRefPtr); + // NOTE: This is intended for the JS bindings. + bool has_child_nodes() const { return has_children(); } + NonnullRefPtrVector child_nodes() const; + virtual RefPtr create_layout_node(); virtual FlyString node_name() const = 0; diff --git a/Userland/Libraries/LibWeb/DOM/Node.idl b/Userland/Libraries/LibWeb/DOM/Node.idl index 3165b3131d..c79b34f2bf 100644 --- a/Userland/Libraries/LibWeb/DOM/Node.idl +++ b/Userland/Libraries/LibWeb/DOM/Node.idl @@ -1,6 +1,11 @@ interface Node : EventTarget { + readonly attribute unsigned short nodeType; readonly attribute DOMString nodeName; + + boolean hasChildNodes(); + // FIXME: This should be a NodeList + readonly attribute ArrayFromVector childNodes; readonly attribute Node? firstChild; readonly attribute Node? lastChild; readonly attribute Node? previousSibling; @@ -12,5 +17,18 @@ interface Node : EventTarget { Node appendChild(Node node); Node insertBefore(Node node, Node? child); Node removeChild(Node child); -}; + const unsigned short ELEMENT_NODE = 1; + const unsigned short ATTRIBUTE_NODE = 2; + const unsigned short TEXT_NODE = 3; + const unsigned short CDATA_SECTION_NODE = 4; + const unsigned short ENTITY_REFERENCE_NODE = 5; + const unsigned short ENTITY_NODE = 6; + const unsigned short PROCESSING_INSTRUCTION_NODE = 7; + const unsigned short COMMENT_NODE = 8; + const unsigned short DOCUMENT_NODE = 9; + const unsigned short DOCUMENT_TYPE_NODE = 10; + const unsigned short DOCUMENT_FRAGMENT_NODE = 11; + const unsigned short NOTATION_NODE = 12; + +};