Make traverse_preorder follow shadow roots (#34503)

* script: Ensure shadow-inclusve preorder traversals follow hosted shadow roots.

Signed-off-by: Josh Matthews <josh@joshmatthews.net>

* script: Handle unregistering element id/name values inside of a shadow root.

Signed-off-by: Josh Matthews <josh@joshmatthews.net>

* script: Merge shadow root tree iteration logic.

Signed-off-by: Josh Matthews <josh@joshmatthews.net>

---------

Signed-off-by: Josh Matthews <josh@joshmatthews.net>
This commit is contained in:
Josh Matthews 2024-12-06 23:28:34 -05:00 committed by GitHub
parent ad48ab7ec3
commit 4242ff9626
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 20733 additions and 123 deletions

View file

@ -492,7 +492,7 @@ impl Element {
self.ScrollWidth(can_gc) > self.ClientWidth(can_gc)
}
fn shadow_root(&self) -> Option<DomRoot<ShadowRoot>> {
pub(crate) fn shadow_root(&self) -> Option<DomRoot<ShadowRoot>> {
self.rare_data()
.as_ref()?
.shadow_root
@ -3632,19 +3632,21 @@ impl VirtualMethods for Element {
let doc = document_from_node(self);
if let Some(ref shadow_root) = self.shadow_root() {
shadow_root.unbind_from_tree(context);
}
let fullscreen = doc.GetFullscreenElement();
if fullscreen.as_deref() == Some(self) {
doc.exit_fullscreen(CanGc::note());
}
if let Some(ref value) = *self.id_attribute.borrow() {
doc.unregister_element_id(self, value.clone());
if let Some(ref shadow_root) = self.upcast::<Node>().containing_shadow_root() {
shadow_root.unregister_element_id(self, value.clone());
} else {
doc.unregister_element_id(self, value.clone());
}
}
if let Some(ref value) = self.name_attribute() {
doc.unregister_element_name(self, value.clone());
if self.upcast::<Node>().containing_shadow_root().is_none() {
doc.unregister_element_name(self, value.clone());
}
}
// This is used for layout optimization.
doc.decrement_dom_count();