зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1728754 - Add layer_order to rules. r=boris
I want to land this separately because we might want to get smarter with the size of the Rule struct (maybe restricting layer order to a u8 per scope and packing it with the source order, since 255 layers seem plenty), but I'd rather do the obvious thing for now. Depends on D124336 Differential Revision: https://phabricator.services.mozilla.com/D124337
This commit is contained in:
Родитель
30f1b8637e
Коммит
13245e72d6
|
@ -2004,7 +2004,7 @@ impl CascadeData {
|
||||||
selectors_for_cache_revalidation: SelectorMap::new_without_attribute_bucketing(),
|
selectors_for_cache_revalidation: SelectorMap::new_without_attribute_bucketing(),
|
||||||
animations: Default::default(),
|
animations: Default::default(),
|
||||||
layer_order: Default::default(),
|
layer_order: Default::default(),
|
||||||
next_layer_order: 0,
|
next_layer_order: 1, // 0 reserved for the root scope.
|
||||||
extra_data: ExtraStyleData::default(),
|
extra_data: ExtraStyleData::default(),
|
||||||
effective_media_query_results: EffectiveMediaQueryResults::new(),
|
effective_media_query_results: EffectiveMediaQueryResults::new(),
|
||||||
rules_source_order: 0,
|
rules_source_order: 0,
|
||||||
|
@ -2168,6 +2168,7 @@ impl CascadeData {
|
||||||
guard: &SharedRwLockReadGuard,
|
guard: &SharedRwLockReadGuard,
|
||||||
rebuild_kind: SheetRebuildKind,
|
rebuild_kind: SheetRebuildKind,
|
||||||
current_layer: &mut LayerName,
|
current_layer: &mut LayerName,
|
||||||
|
current_layer_order: u32,
|
||||||
mut precomputed_pseudo_element_decls: Option<&mut PrecomputedPseudoElementDeclarations>,
|
mut precomputed_pseudo_element_decls: Option<&mut PrecomputedPseudoElementDeclarations>,
|
||||||
) -> Result<(), FailedAllocationError>
|
) -> Result<(), FailedAllocationError>
|
||||||
where
|
where
|
||||||
|
@ -2215,6 +2216,7 @@ impl CascadeData {
|
||||||
hashes,
|
hashes,
|
||||||
locked.clone(),
|
locked.clone(),
|
||||||
self.rules_source_order,
|
self.rules_source_order,
|
||||||
|
current_layer_order,
|
||||||
);
|
);
|
||||||
|
|
||||||
if rebuild_kind.should_rebuild_invalidation() {
|
if rebuild_kind.should_rebuild_invalidation() {
|
||||||
|
@ -2352,6 +2354,7 @@ impl CascadeData {
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut layer_names_to_pop = 0;
|
let mut layer_names_to_pop = 0;
|
||||||
|
let mut children_layer_order = current_layer_order;
|
||||||
match *rule {
|
match *rule {
|
||||||
CssRule::Import(ref lock) => {
|
CssRule::Import(ref lock) => {
|
||||||
if rebuild_kind.should_rebuild_invalidation() {
|
if rebuild_kind.should_rebuild_invalidation() {
|
||||||
|
@ -2370,15 +2373,17 @@ impl CascadeData {
|
||||||
CssRule::Layer(ref lock) => {
|
CssRule::Layer(ref lock) => {
|
||||||
use crate::stylesheets::layer_rule::LayerRuleKind;
|
use crate::stylesheets::layer_rule::LayerRuleKind;
|
||||||
|
|
||||||
fn maybe_register_layer(data: &mut CascadeData, layer: &LayerName) {
|
fn maybe_register_layer(data: &mut CascadeData, layer: &LayerName) -> u32 {
|
||||||
// TODO: Measure what's more common / expensive, if
|
// TODO: Measure what's more common / expensive, if
|
||||||
// layer.clone() or the double hash lookup in the insert
|
// layer.clone() or the double hash lookup in the insert
|
||||||
// case.
|
// case.
|
||||||
if data.layer_order.get(layer).is_some() {
|
if let Some(order) = data.layer_order.get(layer) {
|
||||||
return;
|
return *order;
|
||||||
}
|
}
|
||||||
data.layer_order.insert(layer.clone(), data.next_layer_order);
|
let order = data.next_layer_order;
|
||||||
|
data.layer_order.insert(layer.clone(), order);
|
||||||
data.next_layer_order += 1;
|
data.next_layer_order += 1;
|
||||||
|
order
|
||||||
}
|
}
|
||||||
|
|
||||||
let layer_rule = lock.read_with(guard);
|
let layer_rule = lock.read_with(guard);
|
||||||
|
@ -2386,7 +2391,7 @@ impl CascadeData {
|
||||||
LayerRuleKind::Block { ref name, .. } => {
|
LayerRuleKind::Block { ref name, .. } => {
|
||||||
for name in name.layer_names() {
|
for name in name.layer_names() {
|
||||||
current_layer.0.push(name.clone());
|
current_layer.0.push(name.clone());
|
||||||
maybe_register_layer(self, ¤t_layer);
|
children_layer_order = maybe_register_layer(self, ¤t_layer);
|
||||||
layer_names_to_pop += 1;
|
layer_names_to_pop += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2414,6 +2419,7 @@ impl CascadeData {
|
||||||
guard,
|
guard,
|
||||||
rebuild_kind,
|
rebuild_kind,
|
||||||
current_layer,
|
current_layer,
|
||||||
|
children_layer_order,
|
||||||
precomputed_pseudo_element_decls.as_deref_mut(),
|
precomputed_pseudo_element_decls.as_deref_mut(),
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
|
@ -2458,6 +2464,7 @@ impl CascadeData {
|
||||||
guard,
|
guard,
|
||||||
rebuild_kind,
|
rebuild_kind,
|
||||||
&mut current_layer,
|
&mut current_layer,
|
||||||
|
/* current_layer_order = */ 0,
|
||||||
precomputed_pseudo_element_decls.as_deref_mut(),
|
precomputed_pseudo_element_decls.as_deref_mut(),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
@ -2576,7 +2583,7 @@ impl CascadeData {
|
||||||
}
|
}
|
||||||
self.animations.clear();
|
self.animations.clear();
|
||||||
self.layer_order.clear();
|
self.layer_order.clear();
|
||||||
self.next_layer_order = 0;
|
self.next_layer_order = 1;
|
||||||
self.extra_data.clear();
|
self.extra_data.clear();
|
||||||
self.rules_source_order = 0;
|
self.rules_source_order = 0;
|
||||||
self.num_selectors = 0;
|
self.num_selectors = 0;
|
||||||
|
@ -2665,6 +2672,9 @@ pub struct Rule {
|
||||||
/// we could repurpose that storage here if we needed to.
|
/// we could repurpose that storage here if we needed to.
|
||||||
pub source_order: u32,
|
pub source_order: u32,
|
||||||
|
|
||||||
|
/// The current layer order of this style rule.
|
||||||
|
pub layer_order: u32,
|
||||||
|
|
||||||
/// The actual style rule.
|
/// The actual style rule.
|
||||||
#[cfg_attr(
|
#[cfg_attr(
|
||||||
feature = "gecko",
|
feature = "gecko",
|
||||||
|
@ -2702,12 +2712,14 @@ impl Rule {
|
||||||
hashes: AncestorHashes,
|
hashes: AncestorHashes,
|
||||||
style_rule: Arc<Locked<StyleRule>>,
|
style_rule: Arc<Locked<StyleRule>>,
|
||||||
source_order: u32,
|
source_order: u32,
|
||||||
|
layer_order: u32,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Rule {
|
Rule {
|
||||||
selector: selector,
|
selector,
|
||||||
hashes: hashes,
|
hashes,
|
||||||
style_rule: style_rule,
|
style_rule,
|
||||||
source_order: source_order,
|
source_order,
|
||||||
|
layer_order,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ size_of_test!(size_of_pseudo_class, selector_parser::NonTSPseudoClass, 16);
|
||||||
// The size of this is critical to performance on the bloom-basic microbenchmark.
|
// The size of this is critical to performance on the bloom-basic microbenchmark.
|
||||||
// When iterating over a large Rule array, we want to be able to fast-reject
|
// When iterating over a large Rule array, we want to be able to fast-reject
|
||||||
// selectors (with the inline hashes) with as few cache misses as possible.
|
// selectors (with the inline hashes) with as few cache misses as possible.
|
||||||
size_of_test!(test_size_of_rule, style::stylist::Rule, 32);
|
size_of_test!(test_size_of_rule, style::stylist::Rule, 40);
|
||||||
|
|
||||||
// Large pages generate tens of thousands of ComputedValues.
|
// Large pages generate tens of thousands of ComputedValues.
|
||||||
size_of_test!(test_size_of_cv, ComputedValues, 232);
|
size_of_test!(test_size_of_cv, ComputedValues, 232);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче