Auto merge of #19380 - emilio:my-existence-seems-a-continuous-fight-with-xbl, r=heycam

style: Bring back the optimization to avoid traversing XBL subtrees that will likely change.

Bug: 1420496
Reviewed-by: heycam
MozReview-Commit-ID: 3sIGtcVOt0r

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/19380)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2017-11-27 13:35:28 -06:00 committed by GitHub
commit 769b643c0f
3 changed files with 24 additions and 8 deletions

File diff suppressed because one or more lines are too long

View file

@ -296,7 +296,7 @@ impl ComputedValuesInner {
#[allow(non_snake_case)]
pub fn has_moz_binding(&self) -> bool {
!self.get_box().gecko.mBinding.mPtr.mRawPtr.is_null()
!self.get_box().gecko.mBinding.mRawPtr.is_null()
}
// FIXME(bholley): Implement this properly.
@ -3290,7 +3290,7 @@ fn static_assert() {
longhands::scroll_snap_coordinate::computed_value::T(vec)
}
${impl_css_url('_moz_binding', 'mBinding.mPtr')}
${impl_css_url('_moz_binding', 'mBinding')}
${impl_transition_time_value('delay', 'Delay')}
${impl_transition_time_value('duration', 'Duration')}

View file

@ -255,6 +255,7 @@ pub trait DomTraversal<E: TElement> : Sync {
context: &mut StyleContext<E>,
parent: E,
parent_data: &ElementData,
is_initial_style: bool,
) -> bool {
debug_assert!(parent.has_current_styles_for_traversal(
parent_data,
@ -267,6 +268,21 @@ pub trait DomTraversal<E: TElement> : Sync {
return true;
}
// Gecko-only XBL handling.
//
// When we apply the XBL binding during frame construction, we restyle
// the whole subtree again if the binding is valid, so assuming it's
// likely to load valid bindings, we avoid wasted work here, which may
// be a very big perf hit when elements with bindings are nested
// heavily.
if cfg!(feature = "gecko") &&
is_initial_style &&
parent_data.styles.primary().has_moz_binding()
{
debug!("Parent {:?} has XBL binding, deferring traversal", parent);
return true;
}
return false;
}
@ -476,7 +492,7 @@ where
traverse_children =
traverse_children &&
!traversal.should_cull_subtree(context, element, &data);
!traversal.should_cull_subtree(context, element, &data, is_initial_style);
// Examine our children, and enqueue the appropriate ones for traversal.
if traverse_children {