From c88ca7dcd01fe6feb56ec4ca2c8ec4a363c031e5 Mon Sep 17 00:00:00 2001 From: Boris Chiou Date: Tue, 4 Apr 2017 18:45:11 +0800 Subject: [PATCH] Bug 1341372 - Part 4: Let get_after_change_style return Option. It is possible to call get_after_change_style if there is no transition rule. In order to avoid cloning the token computed values, we just return None. The caller can use this Option to know which computed values should be used. MozReview-Commit-ID: 7fcgSVEtXWh --- components/style/matching.rs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/components/style/matching.rs b/components/style/matching.rs index 5b3774b8862..88daa198d57 100644 --- a/components/style/matching.rs +++ b/components/style/matching.rs @@ -496,32 +496,34 @@ trait PrivateMatchMethods: TElement { } } + /// get_after_change_style removes the transition rules from the ComputedValues. + /// If there is no transition rule in the ComputedValues, it returns None. #[cfg(feature = "gecko")] fn get_after_change_style(&self, context: &mut StyleContext, primary_style: &ComputedStyle, pseudo_style: &Option<(&PseudoElement, &ComputedStyle)>) - -> Arc { + -> Option> { let style = &pseudo_style.as_ref().map_or(primary_style, |p| &*p.1); let rule_node = &style.rules; let without_transition_rules = context.shared.stylist.rule_tree.remove_transition_rule_if_applicable(rule_node); if without_transition_rules == *rule_node { - // Note that unwrapping here is fine, because the style is - // only incomplete during the styling process. - return style.values.as_ref().unwrap().clone(); + // We don't have transition rule in this case, so return None to let the caller + // use the original ComputedValues. + return None; } let mut cascade_flags = CascadeFlags::empty(); if self.skip_root_and_item_based_display_fixup() { - cascade_flags.insert(SKIP_ROOT_AND_ITEM_BASED_DISPLAY_FIXUP) + cascade_flags.insert(SKIP_ROOT_AND_ITEM_BASED_DISPLAY_FIXUP); } - self.cascade_with_rules(context.shared, - &context.thread_local.font_metrics_provider, - &without_transition_rules, - primary_style, - cascade_flags, - pseudo_style.is_some()) + Some(self.cascade_with_rules(context.shared, + &context.thread_local.font_metrics_provider, + &without_transition_rules, + primary_style, + cascade_flags, + pseudo_style.is_some())) } #[cfg(feature = "gecko")]