mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
style: Handle nested slots correctly in slotted matching and invalidation.
The patch and test should be pretty much self-descriptive. Differential Revision: https://phabricator.services.mozilla.com/D14063
This commit is contained in:
parent
a519d9ecc3
commit
7f5a9e0f45
3 changed files with 45 additions and 17 deletions
|
@ -410,6 +410,7 @@ fn next_element_for_combinator<E>(
|
|||
element: &E,
|
||||
combinator: Combinator,
|
||||
selector: &SelectorIter<E::Impl>,
|
||||
context: &MatchingContext<E::Impl>,
|
||||
) -> Option<E>
|
||||
where
|
||||
E: Element,
|
||||
|
@ -449,12 +450,21 @@ where
|
|||
element.containing_shadow_host()
|
||||
},
|
||||
Combinator::SlotAssignment => {
|
||||
debug_assert!(
|
||||
context.current_host.is_some(),
|
||||
"Should not be trying to match slotted rules in a non-shadow-tree context"
|
||||
);
|
||||
debug_assert!(
|
||||
element
|
||||
.assigned_slot()
|
||||
.map_or(true, |s| s.is_html_slot_element())
|
||||
);
|
||||
element.assigned_slot()
|
||||
let scope = context.current_host?;
|
||||
let mut current_slot = element.assigned_slot()?;
|
||||
while current_slot.containing_shadow_host().unwrap().opaque() != scope {
|
||||
current_slot = current_slot.assigned_slot()?;
|
||||
}
|
||||
Some(current_slot)
|
||||
},
|
||||
Combinator::PseudoElement => element.pseudo_element_originating_element(),
|
||||
}
|
||||
|
@ -511,7 +521,12 @@ where
|
|||
Combinator::PseudoElement => SelectorMatchingResult::NotMatchedGlobally,
|
||||
};
|
||||
|
||||
let mut next_element = next_element_for_combinator(element, combinator, &selector_iter);
|
||||
let mut next_element = next_element_for_combinator(
|
||||
element,
|
||||
combinator,
|
||||
&selector_iter,
|
||||
&context,
|
||||
);
|
||||
|
||||
// Stop matching :visited as soon as we find a link, or a combinator for
|
||||
// something that isn't an ancestor.
|
||||
|
@ -575,7 +590,12 @@ where
|
|||
visited_handling = VisitedHandlingMode::AllLinksUnvisited;
|
||||
}
|
||||
|
||||
next_element = next_element_for_combinator(&element, combinator, &selector_iter);
|
||||
next_element = next_element_for_combinator(
|
||||
&element,
|
||||
combinator,
|
||||
&selector_iter,
|
||||
&context,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue