Don't recurse in Node::GetRootNode (#35725)

* Don't recurse in Node::GetRootNode

This causes servo to crash when computing
the root of deeply nested shadow roots.

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

* Add test case

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

---------

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
This commit is contained in:
Simon Wülker 2025-03-01 18:19:27 +01:00 committed by GitHub
parent ce977636f6
commit 25cc675101
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 59 additions and 13 deletions

View file

@ -2887,19 +2887,16 @@ impl NodeMethods<crate::DomTypeHolder> for Node {
/// <https://dom.spec.whatwg.org/#dom-node-getrootnode>
fn GetRootNode(&self, options: &GetRootNodeOptions) -> DomRoot<Node> {
if let Some(shadow_root) = self.containing_shadow_root() {
return if options.composed {
// shadow-including root.
shadow_root.Host().upcast::<Node>().GetRootNode(options)
} else {
DomRoot::from_ref(shadow_root.upcast::<Node>())
};
if !options.composed {
if let Some(shadow_root) = self.containing_shadow_root() {
return DomRoot::upcast(shadow_root);
}
}
if self.is_in_a_document_tree() {
if self.is_connected() {
DomRoot::from_ref(self.owner_doc().upcast::<Node>())
} else {
self.inclusive_ancestors(ShadowIncluding::No)
self.inclusive_ancestors(ShadowIncluding::Yes)
.last()
.unwrap()
}