diff --git a/Userland/Libraries/LibWeb/DOM/Range.cpp b/Userland/Libraries/LibWeb/DOM/Range.cpp index 7d4178f601..28b7097efe 100644 --- a/Userland/Libraries/LibWeb/DOM/Range.cpp +++ b/Userland/Libraries/LibWeb/DOM/Range.cpp @@ -448,4 +448,29 @@ bool Range::intersects_node(Node const& node) const return false; } +// https://dom.spec.whatwg.org/#dom-range-ispointinrange +ExceptionOr Range::is_point_in_range(Node const& node, u32 offset) const +{ + // 1. If node’s root is different from this’s root, return false. + if (&node.root() != &root()) + return false; + + // 2. If node is a doctype, then throw an "InvalidNodeTypeError" DOMException. + if (is(node)) + return InvalidNodeTypeError::create("Node cannot be a DocumentType."); + + // 3. If offset is greater than node’s length, then throw an "IndexSizeError" DOMException. + if (offset > node.length()) + return IndexSizeError::create(String::formatted("Node does not contain a child at offset {}", offset)); + + // 4. If (node, offset) is before start or after end, return false. + auto relative_position_to_start = position_of_boundary_point_relative_to_other_boundary_point(node, offset, m_start_container, m_start_offset); + auto relative_position_to_end = position_of_boundary_point_relative_to_other_boundary_point(node, offset, m_end_container, m_end_offset); + if (relative_position_to_start == RelativeBoundaryPointPosition::Before || relative_position_to_end == RelativeBoundaryPointPosition::After) + return false; + + // 5. Return true. + return true; +} + } diff --git a/Userland/Libraries/LibWeb/DOM/Range.h b/Userland/Libraries/LibWeb/DOM/Range.h index 2d2b986d34..0b28978e8c 100644 --- a/Userland/Libraries/LibWeb/DOM/Range.h +++ b/Userland/Libraries/LibWeb/DOM/Range.h @@ -58,6 +58,7 @@ public: } bool intersects_node(Node const&) const; + ExceptionOr is_point_in_range(Node const&, u32 offset) const; private: explicit Range(Document&); diff --git a/Userland/Libraries/LibWeb/DOM/Range.idl b/Userland/Libraries/LibWeb/DOM/Range.idl index 17595288bf..750ed462e1 100644 --- a/Userland/Libraries/LibWeb/DOM/Range.idl +++ b/Userland/Libraries/LibWeb/DOM/Range.idl @@ -27,6 +27,8 @@ interface Range : AbstractRange { Range cloneRange(); undefined detach(); + boolean isPointInRange(Node node, unsigned long offset); + boolean intersectsNode(Node node); };