servo: Merge #18652 - style: Fix various issues with XBL rule matching (from emilio:xbl-stuff); r=TYLin

See the commit details.

Source-Repo: https://github.com/servo/servo
Source-Revision: bad77b6a20ee9bdba27d0af9edd1dd638c73d64b

--HG--
extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear
extra : subtree_revision : e53fb304044c534e968c6d073277dd5958e73afd
This commit is contained in:
Emilio Cobos Álvarez 2017-09-27 09:15:16 -05:00
parent ff6ff5ab73
commit 35f4533c1d
2 changed files with 21 additions and 75 deletions

View File

@ -26,7 +26,6 @@ use selectors::matching::{ElementSelectorFlags, VisitedHandlingMode};
use selectors::sink::Push;
use servo_arc::{Arc, ArcBorrow};
use shared_lock::Locked;
use smallvec::VecLike;
use std::fmt;
#[cfg(feature = "gecko")] use hash::HashMap;
use std::fmt::Debug;
@ -648,24 +647,6 @@ pub trait TElement : Eq + PartialEq + Debug + Hash + Sized + Copy + Clone +
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.
#[cfg(feature = "gecko")]
fn get_css_transitions_info(&self)

View File

@ -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.
///
/// See the documentation on lazy pseudo-elements in
@ -988,10 +982,6 @@ impl Stylist {
let pseudo = pseudo.canonical();
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
// already, so we can directly apply the parent flags.
let mut set_selector_flags = |element: &E, flags: ElementSelectorFlags| {
@ -1025,10 +1015,12 @@ impl Stylist {
let mut inputs = CascadeInputs::default();
let mut declarations = ApplicableDeclarationList::new();
let mut matching_context =
MatchingContext::new(MatchingMode::ForStatelessPseudoElement,
None,
None,
self.quirks_mode);
MatchingContext::new(
MatchingMode::ForStatelessPseudoElement,
None,
None,
self.quirks_mode,
);
self.push_applicable_declarations(
element,
@ -1191,39 +1183,6 @@ impl Stylist {
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.
///
/// This corresponds to `ElementRuleCollector` in WebKit.
@ -1313,11 +1272,21 @@ impl Stylist {
}
// Step 3b: XBL rules.
let cut_off_inheritance =
element.get_declarations_from_xbl_bindings(
pseudo_element,
applicable_declarations,
);
let cut_off_inheritance = element.each_xbl_stylist(|stylist| {
// ServoStyleSet::CreateXBLServoStyleSet() loads XBL style sheets
// under eAuthorSheetFeatures level.
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 {
// 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.
fn clear_cascade_data(&mut self) {
self.element_map.clear();