mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Auto merge of #18652 - emilio:xbl-stuff, r=TYLin
style: Fix various issues with XBL rule matching See the commit details. <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/18652) <!-- Reviewable:end -->
This commit is contained in:
commit
bad77b6a20
2 changed files with 21 additions and 75 deletions
|
@ -26,7 +26,6 @@ use selectors::matching::{ElementSelectorFlags, VisitedHandlingMode};
|
||||||
use selectors::sink::Push;
|
use selectors::sink::Push;
|
||||||
use servo_arc::{Arc, ArcBorrow};
|
use servo_arc::{Arc, ArcBorrow};
|
||||||
use shared_lock::Locked;
|
use shared_lock::Locked;
|
||||||
use smallvec::VecLike;
|
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
#[cfg(feature = "gecko")] use hash::HashMap;
|
#[cfg(feature = "gecko")] use hash::HashMap;
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
|
@ -648,24 +647,6 @@ pub trait TElement : Eq + PartialEq + Debug + Hash + Sized + Copy + Clone +
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets declarations from XBL bindings from the element.
|
|
||||||
fn get_declarations_from_xbl_bindings<V>(
|
|
||||||
&self,
|
|
||||||
pseudo_element: Option<&PseudoElement>,
|
|
||||||
applicable_declarations: &mut V
|
|
||||||
) -> bool
|
|
||||||
where
|
|
||||||
V: Push<ApplicableDeclarationBlock> + VecLike<ApplicableDeclarationBlock>
|
|
||||||
{
|
|
||||||
self.each_xbl_stylist(|stylist| {
|
|
||||||
stylist.push_applicable_declarations_as_xbl_only_stylist(
|
|
||||||
self,
|
|
||||||
pseudo_element,
|
|
||||||
applicable_declarations
|
|
||||||
);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Gets the current existing CSS transitions, by |property, end value| pairs in a HashMap.
|
/// Gets the current existing CSS transitions, by |property, end value| pairs in a HashMap.
|
||||||
#[cfg(feature = "gecko")]
|
#[cfg(feature = "gecko")]
|
||||||
fn get_css_transitions_info(&self)
|
fn get_css_transitions_info(&self)
|
||||||
|
|
|
@ -964,12 +964,6 @@ impl Stylist {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn has_rules_for_pseudo(&self, pseudo: &PseudoElement) -> bool {
|
|
||||||
self.cascade_data
|
|
||||||
.iter_origins()
|
|
||||||
.any(|(d, _)| d.has_rules_for_pseudo(pseudo))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Computes the cascade inputs for a lazily-cascaded pseudo-element.
|
/// Computes the cascade inputs for a lazily-cascaded pseudo-element.
|
||||||
///
|
///
|
||||||
/// See the documentation on lazy pseudo-elements in
|
/// See the documentation on lazy pseudo-elements in
|
||||||
|
@ -988,10 +982,6 @@ impl Stylist {
|
||||||
let pseudo = pseudo.canonical();
|
let pseudo = pseudo.canonical();
|
||||||
debug_assert!(pseudo.is_lazy());
|
debug_assert!(pseudo.is_lazy());
|
||||||
|
|
||||||
if !self.has_rules_for_pseudo(&pseudo) {
|
|
||||||
return CascadeInputs::default()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply the selector flags. We should be in sequential mode
|
// Apply the selector flags. We should be in sequential mode
|
||||||
// already, so we can directly apply the parent flags.
|
// already, so we can directly apply the parent flags.
|
||||||
let mut set_selector_flags = |element: &E, flags: ElementSelectorFlags| {
|
let mut set_selector_flags = |element: &E, flags: ElementSelectorFlags| {
|
||||||
|
@ -1025,10 +1015,12 @@ impl Stylist {
|
||||||
let mut inputs = CascadeInputs::default();
|
let mut inputs = CascadeInputs::default();
|
||||||
let mut declarations = ApplicableDeclarationList::new();
|
let mut declarations = ApplicableDeclarationList::new();
|
||||||
let mut matching_context =
|
let mut matching_context =
|
||||||
MatchingContext::new(MatchingMode::ForStatelessPseudoElement,
|
MatchingContext::new(
|
||||||
None,
|
MatchingMode::ForStatelessPseudoElement,
|
||||||
None,
|
None,
|
||||||
self.quirks_mode);
|
None,
|
||||||
|
self.quirks_mode,
|
||||||
|
);
|
||||||
|
|
||||||
self.push_applicable_declarations(
|
self.push_applicable_declarations(
|
||||||
element,
|
element,
|
||||||
|
@ -1191,39 +1183,6 @@ impl Stylist {
|
||||||
self.quirks_mode = quirks_mode;
|
self.quirks_mode = quirks_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the applicable CSS declarations for the given element by
|
|
||||||
/// treating us as an XBL stylesheet-only stylist.
|
|
||||||
pub fn push_applicable_declarations_as_xbl_only_stylist<E, V>(
|
|
||||||
&self,
|
|
||||||
element: &E,
|
|
||||||
pseudo_element: Option<&PseudoElement>,
|
|
||||||
applicable_declarations: &mut V
|
|
||||||
)
|
|
||||||
where
|
|
||||||
E: TElement,
|
|
||||||
V: Push<ApplicableDeclarationBlock> + VecLike<ApplicableDeclarationBlock>,
|
|
||||||
{
|
|
||||||
let mut matching_context =
|
|
||||||
MatchingContext::new(MatchingMode::Normal, None, None, self.quirks_mode);
|
|
||||||
let mut dummy_flag_setter = |_: &E, _: ElementSelectorFlags| {};
|
|
||||||
|
|
||||||
let rule_hash_target = element.rule_hash_target();
|
|
||||||
|
|
||||||
// nsXBLPrototypeResources::LoadResources() loads Chrome XBL style
|
|
||||||
// sheets under eAuthorSheetFeatures level.
|
|
||||||
if let Some(map) = self.cascade_data.author.borrow_for_pseudo(pseudo_element) {
|
|
||||||
map.get_all_matching_rules(
|
|
||||||
element,
|
|
||||||
&rule_hash_target,
|
|
||||||
applicable_declarations,
|
|
||||||
&mut matching_context,
|
|
||||||
self.quirks_mode,
|
|
||||||
&mut dummy_flag_setter,
|
|
||||||
CascadeLevel::XBL,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the applicable CSS declarations for the given element.
|
/// Returns the applicable CSS declarations for the given element.
|
||||||
///
|
///
|
||||||
/// This corresponds to `ElementRuleCollector` in WebKit.
|
/// This corresponds to `ElementRuleCollector` in WebKit.
|
||||||
|
@ -1313,11 +1272,21 @@ impl Stylist {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 3b: XBL rules.
|
// Step 3b: XBL rules.
|
||||||
let cut_off_inheritance =
|
let cut_off_inheritance = element.each_xbl_stylist(|stylist| {
|
||||||
element.get_declarations_from_xbl_bindings(
|
// ServoStyleSet::CreateXBLServoStyleSet() loads XBL style sheets
|
||||||
pseudo_element,
|
// under eAuthorSheetFeatures level.
|
||||||
applicable_declarations,
|
if let Some(map) = stylist.cascade_data.author.borrow_for_pseudo(pseudo_element) {
|
||||||
);
|
map.get_all_matching_rules(
|
||||||
|
element,
|
||||||
|
&rule_hash_target,
|
||||||
|
applicable_declarations,
|
||||||
|
context,
|
||||||
|
self.quirks_mode,
|
||||||
|
flags_setter,
|
||||||
|
CascadeLevel::XBL,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if rule_hash_target.matches_user_and_author_rules() && !only_default_rules {
|
if rule_hash_target.matches_user_and_author_rules() && !only_default_rules {
|
||||||
// Gecko skips author normal rules if cutting off inheritance.
|
// Gecko skips author normal rules if cutting off inheritance.
|
||||||
|
@ -2195,10 +2164,6 @@ impl CascadeData {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn has_rules_for_pseudo(&self, pseudo: &PseudoElement) -> bool {
|
|
||||||
self.pseudos_map.get(pseudo).is_some()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Clears the cascade data, but not the invalidation data.
|
/// Clears the cascade data, but not the invalidation data.
|
||||||
fn clear_cascade_data(&mut self) {
|
fn clear_cascade_data(&mut self) {
|
||||||
self.element_map.clear();
|
self.element_map.clear();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue