diff --git a/Userland/Libraries/LibWeb/DOM/Node.cpp b/Userland/Libraries/LibWeb/DOM/Node.cpp index b33dd01881..29f3cfc7aa 100644 --- a/Userland/Libraries/LibWeb/DOM/Node.cpp +++ b/Userland/Libraries/LibWeb/DOM/Node.cpp @@ -890,4 +890,14 @@ bool Node::in_a_document_tree() const return root().is_document(); } +// https://dom.spec.whatwg.org/#dom-node-getrootnode +NonnullRefPtr Node::get_root_node(GetRootNodeOptions const& options) +{ + // The getRootNode(options) method steps are to return this’s shadow-including root if options["composed"] is true; otherwise this’s root. + if (options.composed) + return shadow_including_root(); + + return root(); +} + } diff --git a/Userland/Libraries/LibWeb/DOM/Node.h b/Userland/Libraries/LibWeb/DOM/Node.h index a19bad0546..c1e02624f1 100644 --- a/Userland/Libraries/LibWeb/DOM/Node.h +++ b/Userland/Libraries/LibWeb/DOM/Node.h @@ -35,6 +35,10 @@ enum class NodeType : u16 { NOTATION_NODE = 12 }; +struct GetRootNodeOptions { + bool composed { false }; +}; + class Node : public TreeNode , public EventTarget @@ -195,6 +199,8 @@ public: bool is_same_node(Node const*) const; bool is_equal_node(Node const*) const; + NonnullRefPtr get_root_node(GetRootNodeOptions const& options = {}); + protected: Node(Document&, NodeType); diff --git a/Userland/Libraries/LibWeb/DOM/Node.idl b/Userland/Libraries/LibWeb/DOM/Node.idl index 619164e8d7..7e069f39d7 100644 --- a/Userland/Libraries/LibWeb/DOM/Node.idl +++ b/Userland/Libraries/LibWeb/DOM/Node.idl @@ -13,6 +13,7 @@ interface Node : EventTarget { readonly attribute Element? parentElement; readonly attribute boolean isConnected; readonly attribute Document? ownerDocument; + Node getRootNode(optional GetRootNodeOptions options = {}); // FIXME: [LegacyNullToEmptyString] is not allowed on nullable types as per the Web IDL spec. // However, we only apply it to setters, so this works as a stop gap. @@ -50,3 +51,7 @@ interface Node : EventTarget { const unsigned short DOCUMENT_POSITION_CONTAINED_BY = 16; const unsigned short DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 32; }; + +dictionary GetRootNodeOptions { + boolean composed = false; +};