From 9540af64893e3196613feb3a77a9cbc92209c2f9 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Sat, 20 Apr 2024 12:50:14 +0200 Subject: [PATCH] LibWeb: Fix nodesToRemove collecting traversal in Range::delete_contents With this change children are no longer skipped in tree traversal when start node of range equals to end node of range. Fixes https://github.com/SerenityOS/serenity/issues/24036 --- .../Text/expected/DOM/Range-deleteContents.txt | 1 + .../Text/input/DOM/Range-deleteContents.html | 17 +++++++++++++++++ Userland/Libraries/LibWeb/DOM/Range.cpp | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 Tests/LibWeb/Text/expected/DOM/Range-deleteContents.txt create mode 100644 Tests/LibWeb/Text/input/DOM/Range-deleteContents.html diff --git a/Tests/LibWeb/Text/expected/DOM/Range-deleteContents.txt b/Tests/LibWeb/Text/expected/DOM/Range-deleteContents.txt new file mode 100644 index 00000000000..f238bad6799 --- /dev/null +++ b/Tests/LibWeb/Text/expected/DOM/Range-deleteContents.txt @@ -0,0 +1 @@ +before after diff --git a/Tests/LibWeb/Text/input/DOM/Range-deleteContents.html b/Tests/LibWeb/Text/input/DOM/Range-deleteContents.html new file mode 100644 index 00000000000..d2ff71d2ee6 --- /dev/null +++ b/Tests/LibWeb/Text/input/DOM/Range-deleteContents.html @@ -0,0 +1,17 @@ + +before +
+
should
+
be
+
gone
+
+after + + diff --git a/Userland/Libraries/LibWeb/DOM/Range.cpp b/Userland/Libraries/LibWeb/DOM/Range.cpp index 49d49f1c41f..4be85f536ff 100644 --- a/Userland/Libraries/LibWeb/DOM/Range.cpp +++ b/Userland/Libraries/LibWeb/DOM/Range.cpp @@ -1118,7 +1118,7 @@ WebIDL::ExceptionOr Range::delete_contents() // 4. Let nodes to remove be a list of all the nodes that are contained in this, in tree order, omitting any node whose parent is also contained in this. JS::MarkedVector nodes_to_remove(heap()); - for (Node const* node = start_container(); node != end_container()->next_in_pre_order(); node = node->next_in_pre_order()) { + for (Node const* node = start_container(); node != end_container()->next_sibling(); node = node->next_in_pre_order()) { if (contains_node(*node) && (!node->parent_node() || !contains_node(*node->parent_node()))) nodes_to_remove.append(const_cast(node)); }