diff --git a/Tests/LibWeb/Text/expected/DOM/update-live-ranges-on-node-insertion.txt b/Tests/LibWeb/Text/expected/DOM/update-live-ranges-on-node-insertion.txt
new file mode 100644
index 0000000000..0d1d20b1c4
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/DOM/update-live-ranges-on-node-insertion.txt
@@ -0,0 +1,5 @@
+ 1
+
+2
+
+2
diff --git a/Tests/LibWeb/Text/input/DOM/update-live-ranges-on-node-insertion.html b/Tests/LibWeb/Text/input/DOM/update-live-ranges-on-node-insertion.html
new file mode 100644
index 0000000000..8153a93e2e
--- /dev/null
+++ b/Tests/LibWeb/Text/input/DOM/update-live-ranges-on-node-insertion.html
@@ -0,0 +1,14 @@
+
+
diff --git a/Userland/Libraries/LibWeb/DOM/Node.cpp b/Userland/Libraries/LibWeb/DOM/Node.cpp
index 9c6bfc6493..a421847411 100644
--- a/Userland/Libraries/LibWeb/DOM/Node.cpp
+++ b/Userland/Libraries/LibWeb/DOM/Node.cpp
@@ -427,13 +427,13 @@ void Node::insert_before(JS::NonnullGCPtr node, JS::GCPtr child, boo
// 1. For each live range whose start node is parent and start offset is greater than child’s index, increase its start offset by count.
for (auto& range : Range::live_ranges()) {
if (range->start_container() == this && range->start_offset() > child->index())
- MUST(range->set_start(*range->start_container(), range->start_offset() + count));
+ range->increase_start_offset({}, count);
}
// 2. For each live range whose end node is parent and end offset is greater than child’s index, increase its end offset by count.
for (auto& range : Range::live_ranges()) {
if (range->end_container() == this && range->end_offset() > child->index())
- MUST(range->set_end(*range->end_container(), range->end_offset() + count));
+ range->increase_end_offset({}, count);
}
}
@@ -601,13 +601,13 @@ void Node::remove(bool suppress_observers)
// 6. For each live range whose start node is parent and start offset is greater than index, decrease its start offset by 1.
for (auto& range : Range::live_ranges()) {
if (range->start_container() == parent && range->start_offset() > index)
- MUST(range->set_start(*range->start_container(), range->start_offset() - 1));
+ range->decrease_start_offset({}, 1);
}
// 7. For each live range whose end node is parent and end offset is greater than index, decrease its end offset by 1.
for (auto& range : Range::live_ranges()) {
if (range->end_container() == parent && range->end_offset() > index)
- MUST(range->set_end(*range->end_container(), range->end_offset() - 1));
+ range->decrease_end_offset({}, 1);
}
// 8. For each NodeIterator object iterator whose root’s node document is node’s node document, run the NodeIterator pre-removing steps given node and iterator.
diff --git a/Userland/Libraries/LibWeb/DOM/Range.cpp b/Userland/Libraries/LibWeb/DOM/Range.cpp
index 75183ddaaf..ef13773e1f 100644
--- a/Userland/Libraries/LibWeb/DOM/Range.cpp
+++ b/Userland/Libraries/LibWeb/DOM/Range.cpp
@@ -1230,4 +1230,24 @@ WebIDL::ExceptionOr> Range::create_contextual
return fragment_node;
}
+void Range::increase_start_offset(Badge, WebIDL::UnsignedLong count)
+{
+ m_start_offset += count;
+}
+
+void Range::increase_end_offset(Badge, WebIDL::UnsignedLong count)
+{
+ m_end_offset += count;
+}
+
+void Range::decrease_start_offset(Badge, WebIDL::UnsignedLong count)
+{
+ m_start_offset -= count;
+}
+
+void Range::decrease_end_offset(Badge, WebIDL::UnsignedLong count)
+{
+ m_end_offset -= count;
+}
+
}
diff --git a/Userland/Libraries/LibWeb/DOM/Range.h b/Userland/Libraries/LibWeb/DOM/Range.h
index 239bfc246d..0fc2461af2 100644
--- a/Userland/Libraries/LibWeb/DOM/Range.h
+++ b/Userland/Libraries/LibWeb/DOM/Range.h
@@ -47,6 +47,11 @@ public:
void collapse(bool to_start);
WebIDL::ExceptionOr select_node_contents(Node&);
+ void increase_start_offset(Badge, WebIDL::UnsignedLong);
+ void increase_end_offset(Badge, WebIDL::UnsignedLong);
+ void decrease_start_offset(Badge, WebIDL::UnsignedLong);
+ void decrease_end_offset(Badge, WebIDL::UnsignedLong);
+
// https://dom.spec.whatwg.org/#dom-range-start_to_start
enum HowToCompareBoundaryPoints : WebIDL::UnsignedShort {
START_TO_START = 0,