script Exclude CDATASection nodes from Node::normalize() (#37550)

Exclude CDATASection nodes from Node::normalize. I made it under the
assumption that CDATAs can't have children so we don't need to go into
the `else node.Normalize()` branch on line 3485 with them, hope this is
correct.

Testing: covered by `dom/nodes/Node-normalize.html`
Fixes: https://github.com/servo/servo/issues/37006

---------

Signed-off-by: Rodion Borovyk <rodion.borovyk@gmail.com>
This commit is contained in:
Rodion Borovyk 2025-06-19 12:08:07 +02:00 committed by GitHub
parent 06b5422abf
commit 3a54ddd034
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 9 additions and 9 deletions

View file

@ -50,6 +50,7 @@ use style::stylesheets::{Stylesheet, UrlExtraData};
use uuid::Uuid;
use xml5ever::{local_name, serialize as xml_serialize};
use super::types::CDATASection;
use crate::conversions::Convert;
use crate::document_loader::DocumentLoader;
use crate::dom::attr::Attr;
@ -3458,16 +3459,18 @@ impl NodeMethods<crate::DomTypeHolder> for Node {
let mut children = self.children().enumerate().peekable();
while let Some((_, node)) = children.next() {
if let Some(text) = node.downcast::<Text>() {
if text.is::<CDATASection>() {
continue;
}
let cdata = text.upcast::<CharacterData>();
let mut length = cdata.Length();
if length == 0 {
Node::remove(&node, self, SuppressObserver::Unsuppressed, can_gc);
continue;
}
while children
.peek()
.is_some_and(|(_, sibling)| sibling.is::<Text>())
{
while children.peek().is_some_and(|(_, sibling)| {
sibling.is::<Text>() && !sibling.is::<CDATASection>()
}) {
let (index, sibling) = children.next().unwrap();
sibling
.ranges()

View file

@ -1260,7 +1260,7 @@ impl WeakRangeVec {
.extend(ranges.drain(..));
}
/// Used for steps 7.1-2. when normalizing a node.
/// Used for steps 6.1-2. when normalizing a node.
/// <https://dom.spec.whatwg.org/#dom-node-normalize>
pub(crate) fn drain_to_preceding_text_sibling(&self, node: &Node, sibling: &Node, length: u32) {
if self.is_empty() {
@ -1287,7 +1287,7 @@ impl WeakRangeVec {
sibling.ranges().cell.borrow_mut().extend(ranges.drain(..));
}
/// Used for steps 7.3-4. when normalizing a node.
/// Used for steps 6.3-4. when normalizing a node.
/// <https://dom.spec.whatwg.org/#dom-node-normalize>
pub(crate) fn move_to_text_child_at(
&self,