From dfdc2ddb9eb45aa305a13511eed9dd417455e5a8 Mon Sep 17 00:00:00 2001 From: Luke Wilde Date: Mon, 31 Jan 2022 18:33:41 +0000 Subject: [PATCH] LibWeb: Implement Range.selectNode --- Userland/Libraries/LibWeb/DOM/Range.cpp | 31 +++++++++++++++++++++++++ Userland/Libraries/LibWeb/DOM/Range.h | 2 ++ Userland/Libraries/LibWeb/DOM/Range.idl | 1 + 3 files changed, 34 insertions(+) diff --git a/Userland/Libraries/LibWeb/DOM/Range.cpp b/Userland/Libraries/LibWeb/DOM/Range.cpp index 9c4c25ca8d..e30c2b519e 100644 --- a/Userland/Libraries/LibWeb/DOM/Range.cpp +++ b/Userland/Libraries/LibWeb/DOM/Range.cpp @@ -314,6 +314,37 @@ ExceptionOr Range::compare_boundary_points(u16 how, Range const& source_ran } } +// https://dom.spec.whatwg.org/#concept-range-select +ExceptionOr Range::select(Node& node) +{ + // 1. Let parent be node’s parent. + auto* parent = node.parent(); + + // 2. If parent is null, then throw an "InvalidNodeTypeError" DOMException. + if (!parent) + return InvalidNodeTypeError::create("Given node has no parent."); + + // 3. Let index be node’s index. + auto index = node.index(); + + // 4. Set range’s start to boundary point (parent, index). + m_start_container = *parent; + m_start_offset = index; + + // 5. Set range’s end to boundary point (parent, index plus 1). + m_end_container = *parent; + m_end_offset = index + 1; + + return {}; +} + +// https://dom.spec.whatwg.org/#dom-range-selectnode +ExceptionOr Range::select_node(Node& node) +{ + // The selectNode(node) method steps are to select node within this. + return select(node); +} + NonnullRefPtr Range::clone_range() const { return adopt_ref(*new Range(const_cast(*m_start_container), m_start_offset, const_cast(*m_end_container), m_end_offset)); diff --git a/Userland/Libraries/LibWeb/DOM/Range.h b/Userland/Libraries/LibWeb/DOM/Range.h index e23814e428..9b10cf2f4c 100644 --- a/Userland/Libraries/LibWeb/DOM/Range.h +++ b/Userland/Libraries/LibWeb/DOM/Range.h @@ -30,6 +30,7 @@ public: ExceptionOr set_start_after(Node& node); ExceptionOr set_end_before(Node& node); ExceptionOr set_end_after(Node& node); + ExceptionOr select_node(Node& node); // https://dom.spec.whatwg.org/#dom-range-start_to_start enum HowToCompareBoundaryPoints : u16 { @@ -61,6 +62,7 @@ private: }; ExceptionOr set_start_or_end(Node& node, u32 offset, StartOrEnd start_or_end); + ExceptionOr select(Node& node); }; } diff --git a/Userland/Libraries/LibWeb/DOM/Range.idl b/Userland/Libraries/LibWeb/DOM/Range.idl index 0faaddfcc9..d5fb24f1a7 100644 --- a/Userland/Libraries/LibWeb/DOM/Range.idl +++ b/Userland/Libraries/LibWeb/DOM/Range.idl @@ -14,6 +14,7 @@ interface Range : AbstractRange { undefined setStartAfter(Node node); undefined setEndBefore(Node node); undefined setEndAfter(Node node); + undefined selectNode(Node node); const unsigned short START_TO_START = 0; const unsigned short START_TO_END = 1;