diff options
author | Anthony Ramine <nox@nox.paris> | 2020-04-04 14:39:53 +0200 |
---|---|---|
committer | Anthony Ramine <nox@nox.paris> | 2020-04-04 15:00:04 +0200 |
commit | 8a0775fc8906a796668d68f85543ff9613eac7fd (patch) | |
tree | d4cba76dd0c0545a98ff37085875ecf52dcd60db | |
parent | 9972aee81f0e80d34157325a5e13b3b1a7ef417a (diff) | |
download | servo-8a0775fc8906a796668d68f85543ff9613eac7fd.tar.gz servo-8a0775fc8906a796668d68f85543ff9613eac7fd.zip |
Kill ServoLayoutElement::note_dirty_descendant
There is no need to set the dirty descendants flag unsafely from the layout side
for elements with pending restyles, we can do that on the DOM side when draining
the restyles from the Document.
-rw-r--r-- | components/layout_thread/dom_wrapper.rs | 15 | ||||
-rw-r--r-- | components/layout_thread/lib.rs | 8 | ||||
-rw-r--r-- | components/layout_thread_2020/dom_wrapper.rs | 15 | ||||
-rw-r--r-- | components/layout_thread_2020/lib.rs | 8 | ||||
-rw-r--r-- | components/script/dom/document.rs | 10 |
5 files changed, 8 insertions, 48 deletions
diff --git a/components/layout_thread/dom_wrapper.rs b/components/layout_thread/dom_wrapper.rs index 9237e9d47e7..dc4f8c0c262 100644 --- a/components/layout_thread/dom_wrapper.rs +++ b/components/layout_thread/dom_wrapper.rs @@ -712,21 +712,6 @@ impl<'le> ServoLayoutElement<'le> { pub unsafe fn set_has_snapshot(&self) { self.as_node().node.set_flag(NodeFlags::HAS_SNAPSHOT, true); } - - pub unsafe fn note_dirty_descendant(&self) { - use selectors::Element; - - let mut current = Some(*self); - while let Some(el) = current { - // FIXME(bholley): Ideally we'd have the invariant that any element - // with has_dirty_descendants also has the bit set on all its - // ancestors. However, there are currently some corner-cases where - // we get that wrong. I have in-flight patches to fix all this - // stuff up, so we just always propagate this bit for now. - el.set_dirty_descendants(); - current = el.parent_element(); - } - } } fn as_element<'dom>(node: LayoutDom<'dom, Node>) -> Option<ServoLayoutElement<'dom>> { diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs index 54f1ec8d656..4cd7dad813e 100644 --- a/components/layout_thread/lib.rs +++ b/components/layout_thread/lib.rs @@ -87,7 +87,6 @@ use script_traits::{ConstellationControlMsg, LayoutControlMsg, LayoutMsg as Cons use script_traits::{DrawAPaintImageResult, IFrameSizeMsg, PaintWorkletError, WindowSizeType}; use script_traits::{Painter, WebrenderIpcSender}; use script_traits::{ScrollState, UntrustedNodeAddress, WindowSizeData}; -use selectors::Element; use servo_arc::Arc as ServoArc; use servo_atoms::Atom; use servo_config::opts; @@ -1463,13 +1462,6 @@ impl LayoutThread { for (el, restyle) in restyles { let el = unsafe { ServoLayoutNode::new(&el).as_element().unwrap() }; - // Propagate the descendant bit up the ancestors. Do this before - // the restyle calculation so that we can also do it for new - // unstyled nodes, which the descendants bit helps us find. - if let Some(parent) = el.parent_element() { - unsafe { parent.note_dirty_descendant() }; - } - // If we haven't styled this node yet, we don't need to track a // restyle. let style_data = match el.get_data() { diff --git a/components/layout_thread_2020/dom_wrapper.rs b/components/layout_thread_2020/dom_wrapper.rs index 5a722cd82b8..f3199dffc80 100644 --- a/components/layout_thread_2020/dom_wrapper.rs +++ b/components/layout_thread_2020/dom_wrapper.rs @@ -719,21 +719,6 @@ impl<'le> ServoLayoutElement<'le> { pub unsafe fn set_has_snapshot(&self) { self.as_node().node.set_flag(NodeFlags::HAS_SNAPSHOT, true); } - - pub unsafe fn note_dirty_descendant(&self) { - use selectors::Element; - - let mut current = Some(*self); - while let Some(el) = current { - // FIXME(bholley): Ideally we'd have the invariant that any element - // with has_dirty_descendants also has the bit set on all its - // ancestors. However, there are currently some corner-cases where - // we get that wrong. I have in-flight patches to fix all this - // stuff up, so we just always propagate this bit for now. - el.set_dirty_descendants(); - current = el.parent_element(); - } - } } fn as_element<'dom>(node: LayoutDom<'dom, Node>) -> Option<ServoLayoutElement<'dom>> { diff --git a/components/layout_thread_2020/lib.rs b/components/layout_thread_2020/lib.rs index 05663f7d68b..7a7acff8bb7 100644 --- a/components/layout_thread_2020/lib.rs +++ b/components/layout_thread_2020/lib.rs @@ -70,7 +70,6 @@ use script_traits::{ConstellationControlMsg, LayoutControlMsg, LayoutMsg as Cons use script_traits::{DrawAPaintImageResult, PaintWorkletError}; use script_traits::{Painter, WebrenderIpcSender}; use script_traits::{ScrollState, UntrustedNodeAddress, WindowSizeData}; -use selectors::Element; use servo_arc::Arc as ServoArc; use servo_atoms::Atom; use servo_config::opts; @@ -1109,13 +1108,6 @@ impl LayoutThread { for (el, restyle) in restyles { let el = unsafe { ServoLayoutNode::new(&el).as_element().unwrap() }; - // Propagate the descendant bit up the ancestors. Do this before - // the restyle calculation so that we can also do it for new - // unstyled nodes, which the descendants bit helps us find. - if let Some(parent) = el.parent_element() { - unsafe { parent.note_dirty_descendant() }; - } - // If we haven't styled this node yet, we don't need to track a // restyle. let style_data = match el.get_data() { diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 8e05be1fb11..2d0f2ce1c26 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -3587,8 +3587,14 @@ impl Document { self.pending_restyles .borrow_mut() .drain() - .filter(|(k, _)| k.upcast::<Node>().get_flag(NodeFlags::IS_CONNECTED)) - .map(|(k, v)| (k.upcast::<Node>().to_trusted_node_address(), v)) + .filter_map(|(elem, restyle)| { + let node = elem.upcast::<Node>(); + if !node.get_flag(NodeFlags::IS_CONNECTED) { + return None; + } + node.note_dirty_descendants(); + Some((node.to_trusted_node_address(), restyle)) + }) .collect() } } |