mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
style: Hook in the document invalidator.
Bug: 1409672 Reviewed-by: xidorn MozReview-Commit-ID: EoSMrYPS7dl
This commit is contained in:
parent
75af7c0b41
commit
665690bba6
3 changed files with 69 additions and 16 deletions
|
@ -30,20 +30,20 @@ impl Default for InvalidationMatchingData {
|
|||
|
||||
/// An invalidation processor for style changes due to state and attribute
|
||||
/// changes.
|
||||
pub struct DocumentStateInvalidationProcessor<'a, E: TElement> {
|
||||
pub struct DocumentStateInvalidationProcessor<'a, E: TElement, I> {
|
||||
// TODO(emilio): We might want to just run everything for every possible
|
||||
// binding along with the document data, or just apply the XBL stuff to the
|
||||
// bound subtrees.
|
||||
rules: &'a CascadeData,
|
||||
rules: I,
|
||||
matching_context: MatchingContext<'a, E::Impl>,
|
||||
document_states_changed: DocumentState,
|
||||
}
|
||||
|
||||
impl<'a, E: TElement> DocumentStateInvalidationProcessor<'a, E> {
|
||||
impl<'a, E: TElement, I> DocumentStateInvalidationProcessor<'a, E, I> {
|
||||
/// Creates a new DocumentStateInvalidationProcessor.
|
||||
#[inline]
|
||||
pub fn new(
|
||||
rules: &'a CascadeData,
|
||||
rules: I,
|
||||
document_states_changed: DocumentState,
|
||||
quirks_mode: QuirksMode,
|
||||
) -> Self {
|
||||
|
@ -63,7 +63,11 @@ impl<'a, E: TElement> DocumentStateInvalidationProcessor<'a, E> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a, E: TElement> InvalidationProcessor<'a, E> for DocumentStateInvalidationProcessor<'a, E> {
|
||||
impl<'a, E, I> InvalidationProcessor<'a, E> for DocumentStateInvalidationProcessor<'a, E, I>
|
||||
where
|
||||
E: TElement,
|
||||
I: Iterator<Item = &'a CascadeData>,
|
||||
{
|
||||
fn collect_invalidations(
|
||||
&mut self,
|
||||
_element: E,
|
||||
|
@ -71,14 +75,15 @@ impl<'a, E: TElement> InvalidationProcessor<'a, E> for DocumentStateInvalidation
|
|||
_descendant_invalidations: &mut DescendantInvalidationLists<'a>,
|
||||
_sibling_invalidations: &mut InvalidationVector<'a>,
|
||||
) -> bool {
|
||||
let map = self.rules.invalidation_map();
|
||||
for cascade_data in &mut self.rules {
|
||||
let map = cascade_data.invalidation_map();
|
||||
for dependency in &map.document_state_selectors {
|
||||
if !dependency.state.intersects(self.document_states_changed) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for dependency in &map.document_state_selectors {
|
||||
if !dependency.state.intersects(self.document_states_changed) {
|
||||
continue;
|
||||
self_invalidations.push(Invalidation::new(&dependency.selector, 0));
|
||||
}
|
||||
|
||||
self_invalidations.push(Invalidation::new(&dependency.selector, 0));
|
||||
}
|
||||
|
||||
false
|
||||
|
|
|
@ -534,6 +534,20 @@ where
|
|||
|
||||
let mut any_descendant = false;
|
||||
|
||||
// NOTE(emilio): This should not be needed for Shadow DOM for normal
|
||||
// element state / attribute invalidations (it's needed for XBL though,
|
||||
// due to the weird way the anon content there works (it doesn't block
|
||||
// combinators)).
|
||||
//
|
||||
// However, it's needed as of right now for document state invalidation,
|
||||
// were we rely on iterating every element that ends up in the composed
|
||||
// doc.
|
||||
//
|
||||
// Also, we could avoid having that special-case for document state
|
||||
// invalidations if we invalidate for document state changes per
|
||||
// subtree, though that's kind of annoying because we need to invalidate
|
||||
// the shadow host subtree (to handle :host and ::slotted), and the
|
||||
// actual shadow tree (to handle all other rules in the ShadowRoot).
|
||||
if let Some(anon_content) = self.element.xbl_binding_anonymous_content() {
|
||||
any_descendant |=
|
||||
self.invalidate_dom_descendants_of(anon_content, invalidations);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue