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

We need to get rid of BindingHolder to handle properly the case of an invalid
binding URL.

Bug: 1420496
Reviewed-by: heycam
MozReview-Commit-ID: 3sIGtcVOt0r
This commit is contained in:
Emilio Cobos Álvarez 2017-11-24 15:15:38 +01:00
parent 0df51515c3
commit d61c9a8d31
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C
2 changed files with 19 additions and 3 deletions

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 {