From 3c4d198ad7e2fecd967a3e40331b542357c87316 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 26 Oct 2022 14:37:34 +0000 Subject: [PATCH] style: Don't propagate bits for children invalidated under display:none/not in the flat tree Much like invalidated_descendants. This preserves our invariant that we only visit elements with data in the post-traversal. Differential Revision: https://phabricator.services.mozilla.com/D160338 --- .../invalidation/element/state_and_attributes.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/components/style/invalidation/element/state_and_attributes.rs b/components/style/invalidation/element/state_and_attributes.rs index 5a462c6942c..f659d81b0d1 100644 --- a/components/style/invalidation/element/state_and_attributes.rs +++ b/components/style/invalidation/element/state_and_attributes.rs @@ -152,13 +152,16 @@ where /// Sets the appropriate restyle hint after invalidating the style of a given /// element. -pub fn invalidated_self(element: E) +pub fn invalidated_self(element: E) -> bool where E: TElement, { - if let Some(mut data) = element.mutate_data() { - data.hint.insert(RestyleHint::RESTYLE_SELF); - } + let mut data = match element.mutate_data() { + Some(data) => data, + None => return false, + }; + data.hint.insert(RestyleHint::RESTYLE_SELF); + true } /// Sets the appropriate hint after invalidating the style of a sibling. @@ -167,7 +170,9 @@ where E: TElement, { debug_assert_eq!(element.as_node().parent_node(), of.as_node().parent_node(), "Should be siblings"); - invalidated_self(element); + if !invalidated_self(element) { + return; + } if element.traversal_parent() != of.traversal_parent() { let parent = element.as_node().parent_element_or_host(); debug_assert!(parent.is_some(), "How can we have siblings without parent nodes?");