mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Auto merge of #13110 - emilio:element-flags, r=SimonSapin
Fix incremental restyling under some circumstances due to our bogus use of ElementFlags. <!-- Please describe your changes on the following line: --> --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors <!-- Either: --> - [x] There are tests for these changes OR <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> Depends on https://github.com/servo/rust-selectors/pull/98 <!-- 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/13110) <!-- Reviewable:end -->
This commit is contained in:
commit
57b372ba3b
18 changed files with 153 additions and 64 deletions
|
@ -33,7 +33,7 @@ range = {path = "../range"}
|
|||
rustc-serialize = "0.3"
|
||||
script_layout_interface = {path = "../script_layout_interface"}
|
||||
script_traits = {path = "../script_traits"}
|
||||
selectors = {version = "0.12", features = ["heap_size"]}
|
||||
selectors = {version = "0.13", features = ["heap_size"]}
|
||||
serde_macros = "0.8"
|
||||
smallvec = "0.1"
|
||||
string_cache = {version = "0.2.26", features = ["heap_size"]}
|
||||
|
|
|
@ -61,7 +61,7 @@ regex = "0.1.43"
|
|||
rustc-serialize = "0.3"
|
||||
script_layout_interface = {path = "../script_layout_interface"}
|
||||
script_traits = {path = "../script_traits"}
|
||||
selectors = {version = "0.12", features = ["heap_size"]}
|
||||
selectors = {version = "0.13", features = ["heap_size"]}
|
||||
serde = "0.8"
|
||||
smallvec = "0.1"
|
||||
string_cache = {version = "0.2.26", features = ["heap_size", "unstable"]}
|
||||
|
|
|
@ -70,7 +70,7 @@ use html5ever::serialize::SerializeOpts;
|
|||
use html5ever::serialize::TraversalScope;
|
||||
use html5ever::serialize::TraversalScope::{ChildrenOnly, IncludeNode};
|
||||
use html5ever::tree_builder::{LimitedQuirks, NoQuirks, Quirks};
|
||||
use selectors::matching::{ElementFlags, matches};
|
||||
use selectors::matching::{ElementFlags, MatchingReason, matches};
|
||||
use selectors::matching::{HAS_SLOW_SELECTOR, HAS_EDGE_CHILD_SELECTOR, HAS_SLOW_SELECTOR_LATER_SIBLINGS};
|
||||
use selectors::parser::{AttrSelector, NamespaceConstraint, parse_author_origin_selector_list_from_str};
|
||||
use std::ascii::AsciiExt;
|
||||
|
@ -2006,7 +2006,7 @@ impl ElementMethods for Element {
|
|||
match parse_author_origin_selector_list_from_str(&selectors) {
|
||||
Err(()) => Err(Error::Syntax),
|
||||
Ok(ref selectors) => {
|
||||
Ok(matches(selectors, &Root::from_ref(self), None))
|
||||
Ok(matches(selectors, &Root::from_ref(self), None, MatchingReason::Other))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2024,7 +2024,7 @@ impl ElementMethods for Element {
|
|||
let root = self.upcast::<Node>();
|
||||
for element in root.inclusive_ancestors() {
|
||||
if let Some(element) = Root::downcast::<Element>(element) {
|
||||
if matches(selectors, &element, None) {
|
||||
if matches(selectors, &element, None, MatchingReason::Other) {
|
||||
return Ok(Some(element));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -63,7 +63,7 @@ use script_layout_interface::message::Msg;
|
|||
use script_layout_interface::{HTMLCanvasData, OpaqueStyleAndLayoutData};
|
||||
use script_layout_interface::{LayoutNodeType, LayoutElementType, TrustedNodeAddress};
|
||||
use script_traits::UntrustedNodeAddress;
|
||||
use selectors::matching::matches;
|
||||
use selectors::matching::{MatchingReason, matches};
|
||||
use selectors::parser::Selector;
|
||||
use selectors::parser::parse_author_origin_selector_list_from_str;
|
||||
use std::borrow::ToOwned;
|
||||
|
@ -319,7 +319,7 @@ impl<'a> Iterator for QuerySelectorIterator {
|
|||
// (instead of passing `None`)? Probably.
|
||||
self.iterator.by_ref().filter_map(|node| {
|
||||
if let Some(element) = Root::downcast(node) {
|
||||
if matches(selectors, &element, None) {
|
||||
if matches(selectors, &element, None, MatchingReason::Other) {
|
||||
return Some(Root::upcast(element));
|
||||
}
|
||||
}
|
||||
|
@ -711,7 +711,7 @@ impl Node {
|
|||
// Step 3.
|
||||
Ok(ref selectors) => {
|
||||
Ok(self.traverse_preorder().filter_map(Root::downcast).find(|element| {
|
||||
matches(selectors, element, None)
|
||||
matches(selectors, element, None, MatchingReason::Other)
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@ plugins = {path = "../plugins"}
|
|||
profile_traits = {path = "../profile_traits"}
|
||||
range = {path = "../range"}
|
||||
script_traits = {path = "../script_traits"}
|
||||
selectors = {version = "0.12", features = ["heap_size"]}
|
||||
selectors = {version = "0.13", features = ["heap_size"]}
|
||||
string_cache = {version = "0.2.26", features = ["heap_size"]}
|
||||
style = {path = "../style"}
|
||||
url = {version = "1.2", features = ["heap_size"]}
|
||||
|
|
14
components/servo/Cargo.lock
generated
14
components/servo/Cargo.lock
generated
|
@ -1164,7 +1164,7 @@ dependencies = [
|
|||
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"script_layout_interface 0.0.1",
|
||||
"script_traits 0.0.1",
|
||||
"selectors 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_macros 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"smallvec 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"string_cache 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -1929,7 +1929,7 @@ dependencies = [
|
|||
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"script_layout_interface 0.0.1",
|
||||
"script_traits 0.0.1",
|
||||
"selectors 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"smallvec 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"string_cache 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -1965,7 +1965,7 @@ dependencies = [
|
|||
"profile_traits 0.0.1",
|
||||
"range 0.0.1",
|
||||
"script_traits 0.0.1",
|
||||
"selectors 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"string_cache 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"style 0.0.1",
|
||||
"url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -2014,7 +2014,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "selectors"
|
||||
version = "0.12.0"
|
||||
version = "0.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -2236,7 +2236,7 @@ dependencies = [
|
|||
"quickersort 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_macros 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"smallvec 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -2256,7 +2256,7 @@ dependencies = [
|
|||
"cssparser 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"euclid 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"selectors 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"string_cache 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"style 0.0.1",
|
||||
"style_traits 0.0.1",
|
||||
|
@ -2867,7 +2867,7 @@ dependencies = [
|
|||
"checksum rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "6159e4e6e559c81bd706afe9c8fd68f547d3e851ce12e76b1de7914bab61691b"
|
||||
"checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084"
|
||||
"checksum scoped_threadpool 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "3ef399c8893e8cb7aa9696e895427fab3a6bf265977bb96e126f24ddd2cda85a"
|
||||
"checksum selectors 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd81c2af3eba55ccc7048696c517a0e594ae9a4045b8fb3cc6ad80cd6d65ca5"
|
||||
"checksum selectors 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9eee17ca1807581fc4cf0bfddda311dc421f295a71314b9276ecc787cc63ed6f"
|
||||
"checksum semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac"
|
||||
"checksum serde 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bfdad8985ce7708e21ada7f3f188a0079de4f8e239155348a024e31f13cddf86"
|
||||
"checksum serde_codegen 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5ae9f0068a5f3266ac4d69eb0c1f9f048a2ac24a42af3db567bcd9a3ffe9d47e"
|
||||
|
|
|
@ -40,7 +40,7 @@ ordered-float = "0.2.2"
|
|||
quickersort = "2.0.0"
|
||||
rand = "0.3"
|
||||
rustc-serialize = "0.3"
|
||||
selectors = "0.12"
|
||||
selectors = "0.13"
|
||||
serde = {version = "0.8", optional = true}
|
||||
serde_macros = {version = "0.8", optional = true}
|
||||
smallvec = "0.1"
|
||||
|
|
|
@ -18,7 +18,7 @@ use properties::{ComputedValues, cascade, PropertyDeclarationBlock};
|
|||
use selector_impl::{TheSelectorImpl, PseudoElement};
|
||||
use selector_matching::{DeclarationBlock, Stylist};
|
||||
use selectors::bloom::BloomFilter;
|
||||
use selectors::matching::{StyleRelations, AFFECTED_BY_PSEUDO_ELEMENTS};
|
||||
use selectors::matching::{MatchingReason, StyleRelations, AFFECTED_BY_PSEUDO_ELEMENTS};
|
||||
use selectors::{Element, MatchAttr};
|
||||
use sink::ForgetfulSink;
|
||||
use smallvec::SmallVec;
|
||||
|
@ -658,7 +658,8 @@ pub trait ElementMatchMethods : TElement {
|
|||
parent_bf,
|
||||
style_attribute,
|
||||
None,
|
||||
&mut applicable_declarations.normal);
|
||||
&mut applicable_declarations.normal,
|
||||
MatchingReason::ForStyling);
|
||||
|
||||
applicable_declarations.normal_shareable = relations_are_shareable(&relations);
|
||||
|
||||
|
@ -667,7 +668,8 @@ pub trait ElementMatchMethods : TElement {
|
|||
parent_bf,
|
||||
None,
|
||||
Some(&pseudo.clone()),
|
||||
applicable_declarations.per_pseudo.entry(pseudo).or_insert(vec![]));
|
||||
applicable_declarations.per_pseudo.entry(pseudo).or_insert(vec![]),
|
||||
MatchingReason::ForStyling);
|
||||
});
|
||||
|
||||
let has_pseudos =
|
||||
|
|
|
@ -8,8 +8,8 @@ use element_state::*;
|
|||
#[cfg(feature = "servo")]
|
||||
use heapsize::HeapSizeOf;
|
||||
use selector_impl::{ElementExt, TheSelectorImpl, NonTSPseudoClass, AttrValue};
|
||||
use selectors::matching::StyleRelations;
|
||||
use selectors::matching::matches_complex_selector;
|
||||
use selectors::matching::{MatchingReason, StyleRelations};
|
||||
use selectors::parser::{AttrSelector, Combinator, ComplexSelector, SimpleSelector, SelectorImpl};
|
||||
use selectors::{Element, MatchAttr};
|
||||
use std::clone::Clone;
|
||||
|
@ -476,10 +476,12 @@ impl DependencySet {
|
|||
if (attrs_changed || state_changes.intersects(dep.sensitivities.states)) && !hint.intersects(dep.hint) {
|
||||
let matched_then =
|
||||
matches_complex_selector(&dep.selector, snapshot, None,
|
||||
&mut StyleRelations::empty());
|
||||
&mut StyleRelations::empty(),
|
||||
MatchingReason::Other);
|
||||
let matches_now =
|
||||
matches_complex_selector(&dep.selector, element, None,
|
||||
&mut StyleRelations::empty());
|
||||
&mut StyleRelations::empty(),
|
||||
MatchingReason::Other);
|
||||
if matched_then != matches_now {
|
||||
hint.insert(dep.hint);
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@ use selector_impl::{ElementExt, TheSelectorImpl, PseudoElement};
|
|||
use selectors::Element;
|
||||
use selectors::bloom::BloomFilter;
|
||||
use selectors::matching::{AFFECTED_BY_STYLE_ATTRIBUTE, AFFECTED_BY_PRESENTATIONAL_HINTS};
|
||||
use selectors::matching::{StyleRelations, matches_complex_selector};
|
||||
use selectors::matching::{MatchingReason, StyleRelations, matches_complex_selector};
|
||||
use selectors::parser::{Selector, SimpleSelector, LocalName, ComplexSelector};
|
||||
use sink::Push;
|
||||
use smallvec::VecLike;
|
||||
|
@ -293,7 +293,8 @@ impl Stylist {
|
|||
None,
|
||||
None,
|
||||
Some(pseudo),
|
||||
&mut declarations);
|
||||
&mut declarations,
|
||||
MatchingReason::ForStyling);
|
||||
|
||||
let (computed, _) =
|
||||
properties::cascade(self.device.au_viewport_size(),
|
||||
|
@ -344,7 +345,8 @@ impl Stylist {
|
|||
parent_bf: Option<&BloomFilter>,
|
||||
style_attribute: Option<&Arc<PropertyDeclarationBlock>>,
|
||||
pseudo_element: Option<&PseudoElement>,
|
||||
applicable_declarations: &mut V) -> StyleRelations
|
||||
applicable_declarations: &mut V,
|
||||
reason: MatchingReason) -> StyleRelations
|
||||
where E: Element<Impl=TheSelectorImpl> +
|
||||
fmt::Debug +
|
||||
PresentationalHintsSynthetizer,
|
||||
|
@ -370,6 +372,7 @@ impl Stylist {
|
|||
parent_bf,
|
||||
applicable_declarations,
|
||||
&mut relations,
|
||||
reason,
|
||||
Importance::Normal);
|
||||
debug!("UA normal: {:?}", relations);
|
||||
|
||||
|
@ -387,12 +390,14 @@ impl Stylist {
|
|||
parent_bf,
|
||||
applicable_declarations,
|
||||
&mut relations,
|
||||
reason,
|
||||
Importance::Normal);
|
||||
debug!("user normal: {:?}", relations);
|
||||
map.author.normal.get_all_matching_rules(element,
|
||||
parent_bf,
|
||||
applicable_declarations,
|
||||
&mut relations,
|
||||
reason,
|
||||
Importance::Normal);
|
||||
debug!("author normal: {:?}", relations);
|
||||
|
||||
|
@ -413,6 +418,7 @@ impl Stylist {
|
|||
parent_bf,
|
||||
applicable_declarations,
|
||||
&mut relations,
|
||||
reason,
|
||||
Importance::Important);
|
||||
|
||||
debug!("author important: {:?}", relations);
|
||||
|
@ -434,6 +440,7 @@ impl Stylist {
|
|||
parent_bf,
|
||||
applicable_declarations,
|
||||
&mut relations,
|
||||
reason,
|
||||
Importance::Important);
|
||||
|
||||
debug!("user important: {:?}", relations);
|
||||
|
@ -442,6 +449,7 @@ impl Stylist {
|
|||
parent_bf,
|
||||
applicable_declarations,
|
||||
&mut relations,
|
||||
reason,
|
||||
Importance::Important);
|
||||
|
||||
debug!("UA important: {:?}", relations);
|
||||
|
@ -468,19 +476,22 @@ impl Stylist {
|
|||
{
|
||||
use selectors::matching::StyleRelations;
|
||||
use selectors::matching::matches_complex_selector;
|
||||
// XXX we can probably do better, the candidate should already know what
|
||||
// rules it matches.
|
||||
// TODO(emilio): we can probably do better, the candidate should already
|
||||
// know what rules it matches. Also, we should only match until we find
|
||||
// a descendant combinator, the rest should be ok, since the parent is
|
||||
// the same.
|
||||
//
|
||||
// XXX Could the bloom filter help here? Should be available.
|
||||
// TODO(emilio): Use the bloom filter, since they contain the element's
|
||||
// ancestor chain and it's correct for the candidate too.
|
||||
for ref selector in self.non_common_style_affecting_attributes_selectors.iter() {
|
||||
let element_matches = matches_complex_selector(&selector.complex_selector,
|
||||
element,
|
||||
None,
|
||||
&mut StyleRelations::empty());
|
||||
let candidate_matches = matches_complex_selector(&selector.complex_selector,
|
||||
candidate,
|
||||
None,
|
||||
&mut StyleRelations::empty());
|
||||
let element_matches =
|
||||
matches_complex_selector(&selector.complex_selector, element,
|
||||
None, &mut StyleRelations::empty(),
|
||||
MatchingReason::Other);
|
||||
let candidate_matches =
|
||||
matches_complex_selector(&selector.complex_selector, candidate,
|
||||
None, &mut StyleRelations::empty(),
|
||||
MatchingReason::Other);
|
||||
|
||||
if element_matches != candidate_matches {
|
||||
return false;
|
||||
|
@ -497,20 +508,21 @@ impl Stylist {
|
|||
{
|
||||
use selectors::matching::StyleRelations;
|
||||
use selectors::matching::matches_complex_selector;
|
||||
// XXX we can probably do better, the candidate should already know what
|
||||
// rules it matches.
|
||||
// TODO(emilio): we can probably do better, the candidate should already
|
||||
// know what rules it matches.
|
||||
//
|
||||
// XXX The bloom filter would help here, and should be available.
|
||||
// TODO(emilio): Use the bloom filter, since they contain the element's
|
||||
// ancestor chain and it's correct for the candidate too.
|
||||
for ref selector in self.sibling_affecting_selectors.iter() {
|
||||
let element_matches = matches_complex_selector(&selector.complex_selector,
|
||||
element,
|
||||
None,
|
||||
&mut StyleRelations::empty());
|
||||
let element_matches =
|
||||
matches_complex_selector(&selector.complex_selector, element,
|
||||
None, &mut StyleRelations::empty(),
|
||||
MatchingReason::Other);
|
||||
|
||||
let candidate_matches = matches_complex_selector(&selector.complex_selector,
|
||||
candidate,
|
||||
None,
|
||||
&mut StyleRelations::empty());
|
||||
let candidate_matches =
|
||||
matches_complex_selector(&selector.complex_selector, candidate,
|
||||
None, &mut StyleRelations::empty(),
|
||||
MatchingReason::Other);
|
||||
|
||||
if element_matches != candidate_matches {
|
||||
debug!("match_same_sibling_affecting_rules: Failure due to {:?}",
|
||||
|
@ -650,6 +662,7 @@ impl SelectorMap {
|
|||
parent_bf: Option<&BloomFilter>,
|
||||
matching_rules_list: &mut V,
|
||||
relations: &mut StyleRelations,
|
||||
reason: MatchingReason,
|
||||
importance: Importance)
|
||||
where E: Element<Impl=TheSelectorImpl>,
|
||||
V: VecLike<DeclarationBlock>
|
||||
|
@ -667,6 +680,7 @@ impl SelectorMap {
|
|||
&id,
|
||||
matching_rules_list,
|
||||
relations,
|
||||
reason,
|
||||
importance)
|
||||
}
|
||||
|
||||
|
@ -677,6 +691,7 @@ impl SelectorMap {
|
|||
class,
|
||||
matching_rules_list,
|
||||
relations,
|
||||
reason,
|
||||
importance);
|
||||
});
|
||||
|
||||
|
@ -691,6 +706,7 @@ impl SelectorMap {
|
|||
element.get_local_name(),
|
||||
matching_rules_list,
|
||||
relations,
|
||||
reason,
|
||||
importance);
|
||||
|
||||
SelectorMap::get_matching_rules(element,
|
||||
|
@ -698,6 +714,7 @@ impl SelectorMap {
|
|||
&self.other_rules,
|
||||
matching_rules_list,
|
||||
relations,
|
||||
reason,
|
||||
importance);
|
||||
|
||||
// Sort only the rules we just added.
|
||||
|
@ -735,6 +752,7 @@ impl SelectorMap {
|
|||
key: &BorrowedStr,
|
||||
matching_rules: &mut Vector,
|
||||
relations: &mut StyleRelations,
|
||||
reason: MatchingReason,
|
||||
importance: Importance)
|
||||
where E: Element<Impl=TheSelectorImpl>,
|
||||
Str: Borrow<BorrowedStr> + Eq + Hash,
|
||||
|
@ -747,6 +765,7 @@ impl SelectorMap {
|
|||
rules,
|
||||
matching_rules,
|
||||
relations,
|
||||
reason,
|
||||
importance)
|
||||
}
|
||||
}
|
||||
|
@ -757,6 +776,7 @@ impl SelectorMap {
|
|||
rules: &[Rule],
|
||||
matching_rules: &mut V,
|
||||
relations: &mut StyleRelations,
|
||||
reason: MatchingReason,
|
||||
importance: Importance)
|
||||
where E: Element<Impl=TheSelectorImpl>,
|
||||
V: VecLike<DeclarationBlock>
|
||||
|
@ -769,8 +789,8 @@ impl SelectorMap {
|
|||
block.any_normal()
|
||||
};
|
||||
if any_declaration_for_importance &&
|
||||
matches_complex_selector(&*rule.selector,
|
||||
element, parent_bf, relations) {
|
||||
matches_complex_selector(&*rule.selector, element, parent_bf,
|
||||
relations, reason) {
|
||||
matching_rules.push(rule.declarations.clone());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue