style: More container queries plumbing

Provide container information in computed::Context and use it to resolve
the container queries.

This still fails a lot of tests because we are not ensuring that layout
is up-to-date when we style the container descendants, but that's
expected.

Differential Revision: https://phabricator.services.mozilla.com/D146478
This commit is contained in:
Emilio Cobos Álvarez 2023-08-14 23:29:47 +02:00 committed by Martin Robinson
parent 5c2fac087f
commit bbf10a43b8
18 changed files with 420 additions and 143 deletions

View file

@ -10,7 +10,7 @@ use crate::context::QuirksMode;
use crate::dom::TElement;
use crate::rule_tree::CascadeLevel;
use crate::selector_parser::SelectorImpl;
use crate::stylist::{CascadeData, Rule};
use crate::stylist::{Stylist, CascadeData, Rule, ContainerConditionId};
use crate::AllocErr;
use crate::{Atom, LocalName, Namespace, ShrinkIfNeeded, WeakAtom};
use precomputed_hash::PrecomputedHash;
@ -191,9 +191,10 @@ impl SelectorMap<Rule> {
element: E,
rule_hash_target: E,
matching_rules_list: &mut ApplicableDeclarationList,
context: &mut MatchingContext<E::Impl>,
matching_context: &mut MatchingContext<E::Impl>,
cascade_level: CascadeLevel,
cascade_data: &CascadeData,
stylist: &Stylist,
) where
E: TElement,
{
@ -201,16 +202,17 @@ impl SelectorMap<Rule> {
return;
}
let quirks_mode = context.quirks_mode();
let quirks_mode = matching_context.quirks_mode();
if rule_hash_target.is_root() {
SelectorMap::get_matching_rules(
element,
&self.root,
matching_rules_list,
context,
matching_context,
cascade_level,
cascade_data,
stylist,
);
}
@ -220,9 +222,10 @@ impl SelectorMap<Rule> {
element,
rules,
matching_rules_list,
context,
matching_context,
cascade_level,
cascade_data,
stylist,
)
}
}
@ -233,9 +236,10 @@ impl SelectorMap<Rule> {
element,
rules,
matching_rules_list,
context,
matching_context,
cascade_level,
cascade_data,
stylist,
)
}
});
@ -247,9 +251,10 @@ impl SelectorMap<Rule> {
element,
rules,
matching_rules_list,
context,
matching_context,
cascade_level,
cascade_data,
stylist,
)
}
});
@ -260,9 +265,10 @@ impl SelectorMap<Rule> {
element,
rules,
matching_rules_list,
context,
matching_context,
cascade_level,
cascade_data,
stylist,
)
}
@ -271,9 +277,10 @@ impl SelectorMap<Rule> {
element,
rules,
matching_rules_list,
context,
matching_context,
cascade_level,
cascade_data,
stylist,
)
}
@ -281,9 +288,10 @@ impl SelectorMap<Rule> {
element,
&self.other,
matching_rules_list,
context,
matching_context,
cascade_level,
cascade_data,
stylist,
);
}
@ -292,23 +300,32 @@ impl SelectorMap<Rule> {
element: E,
rules: &[Rule],
matching_rules: &mut ApplicableDeclarationList,
context: &mut MatchingContext<E::Impl>,
matching_context: &mut MatchingContext<E::Impl>,
cascade_level: CascadeLevel,
cascade_data: &CascadeData,
stylist: &Stylist,
) where
E: TElement,
{
for rule in rules {
if matches_selector(
if !matches_selector(
&rule.selector,
0,
Some(&rule.hashes),
&element,
context,
matching_context,
) {
matching_rules
.push(rule.to_applicable_declaration_block(cascade_level, cascade_data));
continue;
}
if rule.container_condition_id != ContainerConditionId::none() {
if !cascade_data.container_condition_matches(rule.container_condition_id, stylist, element) {
continue;
}
}
matching_rules
.push(rule.to_applicable_declaration_block(cascade_level, cascade_data));
}
}
}