From 3802d9ccc4ea4428b82c6d584c3667c040cb46c7 Mon Sep 17 00:00:00 2001 From: Tim Ledbetter Date: Tue, 23 Jul 2024 21:55:48 +0100 Subject: [PATCH] LibWeb: Calculate length for all `CharacterData` type nodes correctly We now ensure that `Node::is_character_data()` returns true for all nodes of type character data. Previously, calling `Node::length()` on `CDataSection` or `ProcessingInstruction` nodes would return an incorrect value. --- .../expected/DOM/Range-containing-CDATASection.txt | 1 + .../Text/input/DOM/Range-containing-CDATASection.html | 11 +++++++++++ Userland/Libraries/LibWeb/DOM/Node.h | 3 ++- 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 Tests/LibWeb/Text/expected/DOM/Range-containing-CDATASection.txt create mode 100644 Tests/LibWeb/Text/input/DOM/Range-containing-CDATASection.html diff --git a/Tests/LibWeb/Text/expected/DOM/Range-containing-CDATASection.txt b/Tests/LibWeb/Text/expected/DOM/Range-containing-CDATASection.txt new file mode 100644 index 00000000000..762cee28558 --- /dev/null +++ b/Tests/LibWeb/Text/expected/DOM/Range-containing-CDATASection.txt @@ -0,0 +1 @@ +range start offset: 0, end offset: 3 diff --git a/Tests/LibWeb/Text/input/DOM/Range-containing-CDATASection.html b/Tests/LibWeb/Text/input/DOM/Range-containing-CDATASection.html new file mode 100644 index 00000000000..1502ae9101f --- /dev/null +++ b/Tests/LibWeb/Text/input/DOM/Range-containing-CDATASection.html @@ -0,0 +1,11 @@ + + diff --git a/Userland/Libraries/LibWeb/DOM/Node.h b/Userland/Libraries/LibWeb/DOM/Node.h index 02f7d698c25..fa5530dff3e 100644 --- a/Userland/Libraries/LibWeb/DOM/Node.h +++ b/Userland/Libraries/LibWeb/DOM/Node.h @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -69,7 +70,7 @@ public: bool is_document() const { return type() == NodeType::DOCUMENT_NODE; } bool is_document_type() const { return type() == NodeType::DOCUMENT_TYPE_NODE; } bool is_comment() const { return type() == NodeType::COMMENT_NODE; } - bool is_character_data() const { return type() == NodeType::TEXT_NODE || type() == NodeType::COMMENT_NODE; } + bool is_character_data() const { return first_is_one_of(type(), NodeType::TEXT_NODE, NodeType::COMMENT_NODE, NodeType::CDATA_SECTION_NODE, NodeType::PROCESSING_INSTRUCTION_NODE); } bool is_document_fragment() const { return type() == NodeType::DOCUMENT_FRAGMENT_NODE; } bool is_parent_node() const { return is_element() || is_document() || is_document_fragment(); } bool is_slottable() const { return is_element() || is_text() || is_cdata_section(); }