aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnthony Ramine <nox@nox.paris>2020-04-04 14:39:53 +0200
committerAnthony Ramine <nox@nox.paris>2020-04-04 15:00:04 +0200
commit8a0775fc8906a796668d68f85543ff9613eac7fd (patch)
treed4cba76dd0c0545a98ff37085875ecf52dcd60db
parent9972aee81f0e80d34157325a5e13b3b1a7ef417a (diff)
downloadservo-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.rs15
-rw-r--r--components/layout_thread/lib.rs8
-rw-r--r--components/layout_thread_2020/dom_wrapper.rs15
-rw-r--r--components/layout_thread_2020/lib.rs8
-rw-r--r--components/script/dom/document.rs10
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()
}
}