Преглед на файлове

LibWeb: Implement Range.comparePoint

Luke Wilde преди 3 години
родител
ревизия
ad5fb1fd7e
променени са 3 файла, в които са добавени 31 реда и са изтрити 0 реда
  1. 29 0
      Userland/Libraries/LibWeb/DOM/Range.cpp
  2. 1 0
      Userland/Libraries/LibWeb/DOM/Range.h
  3. 1 0
      Userland/Libraries/LibWeb/DOM/Range.idl

+ 29 - 0
Userland/Libraries/LibWeb/DOM/Range.cpp

@@ -473,4 +473,33 @@ ExceptionOr<bool> Range::is_point_in_range(Node const& node, u32 offset) const
     return true;
     return true;
 }
 }
 
 
+// https://dom.spec.whatwg.org/#dom-range-comparepoint
+ExceptionOr<i16> Range::compare_point(Node const& node, u32 offset) const
+{
+    // 1. If node’s root is different from this’s root, then throw a "WrongDocumentError" DOMException.
+    if (&node.root() != &root())
+        return WrongDocumentError::create("Given node is not in the same document as the range.");
+
+    // 2. If node is a doctype, then throw an "InvalidNodeTypeError" DOMException.
+    if (is<DocumentType>(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, return −1.
+    auto relative_position_to_start = position_of_boundary_point_relative_to_other_boundary_point(node, offset, m_start_container, m_start_offset);
+    if (relative_position_to_start == RelativeBoundaryPointPosition::Before)
+        return -1;
+
+    // 5. If (node, offset) is after end, return 1.
+    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_end == RelativeBoundaryPointPosition::After)
+        return 1;
+
+    // 6. Return 0.
+    return 0;
+}
+
 }
 }

+ 1 - 0
Userland/Libraries/LibWeb/DOM/Range.h

@@ -59,6 +59,7 @@ public:
 
 
     bool intersects_node(Node const&) const;
     bool intersects_node(Node const&) const;
     ExceptionOr<bool> is_point_in_range(Node const&, u32 offset) const;
     ExceptionOr<bool> is_point_in_range(Node const&, u32 offset) const;
+    ExceptionOr<i16> compare_point(Node const&, u32 offset) const;
 
 
 private:
 private:
     explicit Range(Document&);
     explicit Range(Document&);

+ 1 - 0
Userland/Libraries/LibWeb/DOM/Range.idl

@@ -28,6 +28,7 @@ interface Range : AbstractRange {
     undefined detach();
     undefined detach();
 
 
     boolean isPointInRange(Node node, unsigned long offset);
     boolean isPointInRange(Node node, unsigned long offset);
+    short comparePoint(Node node, unsigned long offset);
 
 
     boolean intersectsNode(Node node);
     boolean intersectsNode(Node node);