mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
Do not store composed parent node
This commit is contained in:
parent
542699691e
commit
ea1fe15dfe
2 changed files with 27 additions and 27 deletions
|
@ -53,7 +53,7 @@ use crate::dom::mutationobserver::{Mutation, MutationObserver, RegisteredObserve
|
||||||
use crate::dom::nodelist::NodeList;
|
use crate::dom::nodelist::NodeList;
|
||||||
use crate::dom::processinginstruction::ProcessingInstruction;
|
use crate::dom::processinginstruction::ProcessingInstruction;
|
||||||
use crate::dom::range::WeakRangeVec;
|
use crate::dom::range::WeakRangeVec;
|
||||||
use crate::dom::shadowroot::ShadowRoot;
|
use crate::dom::shadowroot::{LayoutShadowRootHelpers, ShadowRoot};
|
||||||
use crate::dom::stylesheetlist::StyleSheetListOwner;
|
use crate::dom::stylesheetlist::StyleSheetListOwner;
|
||||||
use crate::dom::svgsvgelement::{LayoutSVGSVGElementHelpers, SVGSVGElement};
|
use crate::dom::svgsvgelement::{LayoutSVGSVGElementHelpers, SVGSVGElement};
|
||||||
use crate::dom::text::Text;
|
use crate::dom::text::Text;
|
||||||
|
@ -109,9 +109,6 @@ pub struct Node {
|
||||||
/// The parent of this node.
|
/// The parent of this node.
|
||||||
parent_node: MutNullableDom<Node>,
|
parent_node: MutNullableDom<Node>,
|
||||||
|
|
||||||
/// The parent of this node, ignoring shadow roots.
|
|
||||||
composed_parent_node: MutNullableDom<Node>,
|
|
||||||
|
|
||||||
/// The first child of this node.
|
/// The first child of this node.
|
||||||
first_child: MutNullableDom<Node>,
|
first_child: MutNullableDom<Node>,
|
||||||
|
|
||||||
|
@ -244,7 +241,6 @@ impl Node {
|
||||||
/// Fails unless `new_child` is disconnected from the tree.
|
/// Fails unless `new_child` is disconnected from the tree.
|
||||||
fn add_child(&self, new_child: &Node, before: Option<&Node>) {
|
fn add_child(&self, new_child: &Node, before: Option<&Node>) {
|
||||||
assert!(new_child.parent_node.get().is_none());
|
assert!(new_child.parent_node.get().is_none());
|
||||||
assert!(new_child.composed_parent_node.get().is_none());
|
|
||||||
assert!(new_child.prev_sibling.get().is_none());
|
assert!(new_child.prev_sibling.get().is_none());
|
||||||
assert!(new_child.next_sibling.get().is_none());
|
assert!(new_child.next_sibling.get().is_none());
|
||||||
match before {
|
match before {
|
||||||
|
@ -280,13 +276,6 @@ impl Node {
|
||||||
}
|
}
|
||||||
|
|
||||||
new_child.parent_node.set(Some(self));
|
new_child.parent_node.set(Some(self));
|
||||||
if let Some(shadow_root) = self.downcast::<ShadowRoot>() {
|
|
||||||
new_child
|
|
||||||
.composed_parent_node
|
|
||||||
.set(Some(shadow_root.Host().upcast::<Node>()));
|
|
||||||
} else {
|
|
||||||
new_child.composed_parent_node.set(Some(self));
|
|
||||||
}
|
|
||||||
self.children_count.set(self.children_count.get() + 1);
|
self.children_count.set(self.children_count.get() + 1);
|
||||||
|
|
||||||
let parent_in_doc = self.is_in_doc();
|
let parent_in_doc = self.is_in_doc();
|
||||||
|
@ -348,7 +337,6 @@ impl Node {
|
||||||
child.prev_sibling.set(None);
|
child.prev_sibling.set(None);
|
||||||
child.next_sibling.set(None);
|
child.next_sibling.set(None);
|
||||||
child.parent_node.set(None);
|
child.parent_node.set(None);
|
||||||
child.composed_parent_node.set(None);
|
|
||||||
self.children_count.set(self.children_count.get() - 1);
|
self.children_count.set(self.children_count.get() - 1);
|
||||||
|
|
||||||
for node in child.traverse_preorder(ShadowIncluding::Yes) {
|
for node in child.traverse_preorder(ShadowIncluding::Yes) {
|
||||||
|
@ -607,13 +595,11 @@ impl Node {
|
||||||
}
|
}
|
||||||
|
|
||||||
match self.type_id() {
|
match self.type_id() {
|
||||||
NodeTypeId::CharacterData(CharacterDataTypeId::Text(TextTypeId::Text)) => self
|
NodeTypeId::CharacterData(CharacterDataTypeId::Text(TextTypeId::Text)) => {
|
||||||
.composed_parent_node
|
if let Some(parent) = self.composed_parent_node() {
|
||||||
.get()
|
parent.downcast::<Element>().unwrap().restyle(damage)
|
||||||
.unwrap()
|
}
|
||||||
.downcast::<Element>()
|
},
|
||||||
.unwrap()
|
|
||||||
.restyle(damage),
|
|
||||||
NodeTypeId::Element(_) => self.downcast::<Element>().unwrap().restyle(damage),
|
NodeTypeId::Element(_) => self.downcast::<Element>().unwrap().restyle(damage),
|
||||||
_ => {},
|
_ => {},
|
||||||
};
|
};
|
||||||
|
@ -959,6 +945,16 @@ impl Node {
|
||||||
self.is_connected() && self.owner_doc().browsing_context().is_some()
|
self.is_connected() && self.owner_doc().browsing_context().is_some()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn composed_parent_node(&self) -> Option<DomRoot<Node>> {
|
||||||
|
let parent = self.parent_node.get();
|
||||||
|
if let Some(ref parent) = parent {
|
||||||
|
if let Some(shadow_root) = parent.downcast::<ShadowRoot>() {
|
||||||
|
return Some(DomRoot::from_ref(shadow_root.Host().upcast::<Node>()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parent
|
||||||
|
}
|
||||||
|
|
||||||
pub fn children(&self) -> impl Iterator<Item = DomRoot<Node>> {
|
pub fn children(&self) -> impl Iterator<Item = DomRoot<Node>> {
|
||||||
SimpleNodeIterator {
|
SimpleNodeIterator {
|
||||||
current: self.GetFirstChild(),
|
current: self.GetFirstChild(),
|
||||||
|
@ -1224,9 +1220,13 @@ impl LayoutNodeHelpers for LayoutDom<Node> {
|
||||||
#[inline]
|
#[inline]
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
unsafe fn parent_node_ref(&self) -> Option<LayoutDom<Node>> {
|
unsafe fn parent_node_ref(&self) -> Option<LayoutDom<Node>> {
|
||||||
(*self.unsafe_get())
|
let parent = (*self.unsafe_get()).parent_node.get_inner_as_layout();
|
||||||
.composed_parent_node
|
if let Some(ref parent) = parent {
|
||||||
.get_inner_as_layout()
|
if let Some(shadow_root) = parent.downcast::<ShadowRoot>() {
|
||||||
|
return Some(shadow_root.get_host_for_layout().upcast());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parent
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -1629,7 +1629,6 @@ impl Node {
|
||||||
eventtarget: EventTarget::new_inherited(),
|
eventtarget: EventTarget::new_inherited(),
|
||||||
|
|
||||||
parent_node: Default::default(),
|
parent_node: Default::default(),
|
||||||
composed_parent_node: Default::default(),
|
|
||||||
first_child: Default::default(),
|
first_child: Default::default(),
|
||||||
last_child: Default::default(),
|
last_child: Default::default(),
|
||||||
next_sibling: Default::default(),
|
next_sibling: Default::default(),
|
||||||
|
|
|
@ -231,7 +231,7 @@ where
|
||||||
// Optimize for when the root is a document or a shadow root and the element
|
// Optimize for when the root is a document or a shadow root and the element
|
||||||
// is connected to that root.
|
// is connected to that root.
|
||||||
if root.as_document().is_some() {
|
if root.as_document().is_some() {
|
||||||
debug_assert!(element.as_node().is_connected(), "Not connected?");
|
debug_assert!(element.as_node().is_in_document(), "Not connected?");
|
||||||
debug_assert_eq!(
|
debug_assert_eq!(
|
||||||
root,
|
root,
|
||||||
root.owner_doc().as_node(),
|
root.owner_doc().as_node(),
|
||||||
|
@ -241,10 +241,11 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
if root.as_shadow_root().is_some() {
|
if root.as_shadow_root().is_some() {
|
||||||
|
debug_assert!(element.as_node().is_in_document(), "Not connected?");
|
||||||
debug_assert_eq!(
|
debug_assert_eq!(
|
||||||
element.containing_shadow().unwrap().as_node(),
|
element.containing_shadow().unwrap().as_node(),
|
||||||
root,
|
root,
|
||||||
"Not connected?"
|
"Where did this element come from?"
|
||||||
);
|
);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -275,7 +276,7 @@ where
|
||||||
return Err(());
|
return Err(());
|
||||||
}
|
}
|
||||||
|
|
||||||
if root.is_connected() {
|
if root.is_in_document() {
|
||||||
if let Some(shadow) = root.as_shadow_root() {
|
if let Some(shadow) = root.as_shadow_root() {
|
||||||
return shadow.elements_with_id(id);
|
return shadow.elements_with_id(id);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue