style: Implement @import layer|layer(<name>)

This works modulo the existing nested layer order bug. Will be covered
by WPT /css/css-cascade/layer-import.html once the feature is enabled (I
can probably enable it right away for those tests, but I'd rather fix
the obvious bugs first).

Differential Revision: https://phabricator.services.mozilla.com/D124538
This commit is contained in:
Emilio Cobos Álvarez 2023-05-27 06:09:24 +02:00 committed by Oriol Brufau
parent 3dc3fb9412
commit 6bc198b757
4 changed files with 98 additions and 25 deletions

View file

@ -2329,15 +2329,36 @@ impl CascadeData {
continue;
}
fn maybe_register_layer(data: &mut CascadeData, layer: &LayerName) -> u32 {
// TODO: Measure what's more common / expensive, if
// layer.clone() or the double hash lookup in the insert
// case.
if let Some(order) = data.layer_order.get(layer) {
return *order;
}
let order = data.next_layer_order;
data.layer_order.insert(layer.clone(), order);
data.next_layer_order += 1;
order
}
let mut layer_names_to_pop = 0;
let mut children_layer_order = current_layer_order;
match *rule {
CssRule::Import(ref lock) => {
let import_rule = lock.read_with(guard);
if rebuild_kind.should_rebuild_invalidation() {
let import_rule = lock.read_with(guard);
self.effective_media_query_results
.saw_effective(import_rule);
}
if let Some(ref layer) = import_rule.layer {
for name in layer.name.layer_names() {
current_layer.0.push(name.clone());
children_layer_order = maybe_register_layer(self, &current_layer);
layer_names_to_pop += 1;
}
}
},
CssRule::Media(ref lock) => {
@ -2349,19 +2370,6 @@ impl CascadeData {
CssRule::Layer(ref lock) => {
use crate::stylesheets::layer_rule::LayerRuleKind;
fn maybe_register_layer(data: &mut CascadeData, layer: &LayerName) -> u32 {
// TODO: Measure what's more common / expensive, if
// layer.clone() or the double hash lookup in the insert
// case.
if let Some(order) = data.layer_order.get(layer) {
return *order;
}
let order = data.next_layer_order;
data.layer_order.insert(layer.clone(), order);
data.next_layer_order += 1;
order
}
let layer_rule = lock.read_with(guard);
match layer_rule.kind {
LayerRuleKind::Block { ref name, .. } => {