diff --git a/components/selectors/attr.rs b/components/selectors/attr.rs index 3b3b76e453a..65d6082b66b 100644 --- a/components/selectors/attr.rs +++ b/components/selectors/attr.rs @@ -19,7 +19,6 @@ pub struct AttrSelectorWithOptionalNamespace { pub local_name_lower: Impl::LocalName, #[cfg_attr(feature = "shmem", shmem(field_bound))] pub operation: ParsedAttrSelectorOperation, - pub never_matches: bool, } impl AttrSelectorWithOptionalNamespace { @@ -47,7 +46,7 @@ pub enum ParsedAttrSelectorOperation { WithValue { operator: AttrSelectorOperator, case_sensitivity: ParsedCaseSensitivity, - expected_value: AttrValue, + value: AttrValue, }, } @@ -57,7 +56,7 @@ pub enum AttrSelectorOperation { WithValue { operator: AttrSelectorOperator, case_sensitivity: CaseSensitivity, - expected_value: AttrValue, + value: AttrValue, }, } @@ -71,10 +70,10 @@ impl AttrSelectorOperation { AttrSelectorOperation::WithValue { operator, case_sensitivity, - ref expected_value, + ref value, } => operator.eval_str( element_attr_value, - expected_value.as_ref(), + value.as_ref(), case_sensitivity, ), } diff --git a/components/selectors/matching.rs b/components/selectors/matching.rs index 6a603f10abd..05704923b60 100644 --- a/components/selectors/matching.rs +++ b/components/selectors/matching.rs @@ -736,25 +736,18 @@ where ref value, operator, case_sensitivity, - never_matches, } => { - if never_matches { - return false; - } element.attr_matches( &NamespaceConstraint::Specific(&crate::parser::namespace_empty_string::()), local_name, &AttrSelectorOperation::WithValue { operator, case_sensitivity: to_unconditional_case_sensitivity(case_sensitivity, element), - expected_value: value, + value, }, ) }, Component::AttributeOther(ref attr_sel) => { - if attr_sel.never_matches { - return false; - } let empty_string; let namespace = match attr_sel.namespace() { Some(ns) => ns, @@ -771,14 +764,14 @@ where ParsedAttrSelectorOperation::WithValue { operator, case_sensitivity, - ref expected_value, + ref value, } => AttrSelectorOperation::WithValue { operator, case_sensitivity: to_unconditional_case_sensitivity( case_sensitivity, element, ), - expected_value, + value, }, }, ) diff --git a/components/selectors/parser.rs b/components/selectors/parser.rs index 95cba4a41a4..f9017b95b9b 100644 --- a/components/selectors/parser.rs +++ b/components/selectors/parser.rs @@ -3,8 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::attr::{AttrSelectorOperator, AttrSelectorWithOptionalNamespace}; -use crate::attr::{NamespaceConstraint, ParsedAttrSelectorOperation}; -use crate::attr::{ParsedCaseSensitivity, SELECTOR_WHITESPACE}; +use crate::attr::{NamespaceConstraint, ParsedAttrSelectorOperation, ParsedCaseSensitivity}; use crate::bloom::BLOOM_HASH_MASK; use crate::builder::{ relative_selector_list_specificity_and_flags, selector_list_specificity_and_flags, @@ -624,6 +623,7 @@ impl AncestorHashes { } } +#[inline] pub fn namespace_empty_string() -> Impl::NamespaceUrl { // Rust type’s default, not default namespace Impl::NamespaceUrl::default() @@ -1658,7 +1658,6 @@ pub enum Component { #[cfg_attr(feature = "shmem", shmem(field_bound))] value: Impl::AttrValue, case_sensitivity: ParsedCaseSensitivity, - never_matches: bool, }, // Use a Box in the less common cases with more data to keep size_of::() small. AttributeOther(Box>), @@ -1836,11 +1835,7 @@ impl Component { return false; } }, - AttributeInNoNamespace { - ref local_name, - never_matches, - .. - } if !never_matches => { + AttributeInNoNamespace { ref local_name, .. } => { if !visitor.visit_attribute_selector( &NamespaceConstraint::Specific(&namespace_empty_string::()), local_name, @@ -1849,7 +1844,7 @@ impl Component { return false; } }, - AttributeOther(ref attr_selector) if !attr_selector.never_matches => { + AttributeOther(ref attr_selector) => { let empty_string; let namespace = match attr_selector.namespace() { Some(ns) => ns, @@ -2291,11 +2286,11 @@ impl ToCss for AttrSelectorWithOptionalNamespace { ParsedAttrSelectorOperation::WithValue { operator, case_sensitivity, - ref expected_value, + ref value, } => { operator.to_css(dest)?; dest.write_char('"')?; - expected_value.to_css(dest)?; + value.to_css(dest)?; dest.write_char('"')?; match case_sensitivity { ParsedCaseSensitivity::CaseSensitive | @@ -2663,7 +2658,6 @@ where local_name, local_name_lower, operation: ParsedAttrSelectorOperation::Exists, - never_matches: false, }, ))); } else { @@ -2701,18 +2695,8 @@ where }) => return Err(location.new_custom_error(SelectorParseErrorKind::BadValueInAttr(t))), Err(e) => return Err(e.into()), }; - let never_matches = match operator { - AttrSelectorOperator::Equal | AttrSelectorOperator::DashMatch => false, - - AttrSelectorOperator::Includes => value.is_empty() || value.contains(SELECTOR_WHITESPACE), - - AttrSelectorOperator::Prefix | - AttrSelectorOperator::Substring | - AttrSelectorOperator::Suffix => value.is_empty(), - }; let attribute_flags = parse_attribute_flags(input)?; - let value = value.as_ref().into(); let local_name_lower; let local_name_is_ascii_lowercase; @@ -2731,11 +2715,10 @@ where namespace, local_name, local_name_lower, - never_matches, operation: ParsedAttrSelectorOperation::WithValue { operator, case_sensitivity, - expected_value: value, + value, }, }, ))) @@ -2745,7 +2728,6 @@ where operator, value, case_sensitivity, - never_matches, }) } } @@ -3906,7 +3888,6 @@ pub mod tests { local_name: DummyAtom::from("attr"), operator: AttrSelectorOperator::DashMatch, value: DummyAttrValue::from("foo"), - never_matches: false, case_sensitivity: ParsedCaseSensitivity::CaseSensitive, }], specificity(0, 1, 0), diff --git a/components/style/gecko/snapshot.rs b/components/style/gecko/snapshot.rs index 84756406ed8..8adde0a927b 100644 --- a/components/style/gecko/snapshot.rs +++ b/components/style/gecko/snapshot.rs @@ -99,47 +99,46 @@ impl GeckoElementSnapshot { AttrSelectorOperation::WithValue { operator, case_sensitivity, - expected_value, + value, } => { let ignore_case = match case_sensitivity { CaseSensitivity::CaseSensitive => false, CaseSensitivity::AsciiCaseInsensitive => true, }; - // FIXME: case sensitivity for operators other than Equal match operator { AttrSelectorOperator::Equal => bindings::Gecko_SnapshotAttrEquals( self, ns.atom_or_null(), local_name.as_ptr(), - expected_value.as_ptr(), + value.as_ptr(), ignore_case, ), AttrSelectorOperator::Includes => bindings::Gecko_SnapshotAttrIncludes( self, ns.atom_or_null(), local_name.as_ptr(), - expected_value.as_ptr(), + value.as_ptr(), ignore_case, ), AttrSelectorOperator::DashMatch => bindings::Gecko_SnapshotAttrDashEquals( self, ns.atom_or_null(), local_name.as_ptr(), - expected_value.as_ptr(), + value.as_ptr(), ignore_case, ), AttrSelectorOperator::Prefix => bindings::Gecko_SnapshotAttrHasPrefix( self, ns.atom_or_null(), local_name.as_ptr(), - expected_value.as_ptr(), + value.as_ptr(), ignore_case, ), AttrSelectorOperator::Suffix => bindings::Gecko_SnapshotAttrHasSuffix( self, ns.atom_or_null(), local_name.as_ptr(), - expected_value.as_ptr(), + value.as_ptr(), ignore_case, ), AttrSelectorOperator::Substring => { @@ -147,7 +146,7 @@ impl GeckoElementSnapshot { self, ns.atom_or_null(), local_name.as_ptr(), - expected_value.as_ptr(), + value.as_ptr(), ignore_case, ) }, diff --git a/components/style/gecko/wrapper.rs b/components/style/gecko/wrapper.rs index a4d35df4274..9616a5f2753 100644 --- a/components/style/gecko/wrapper.rs +++ b/components/style/gecko/wrapper.rs @@ -1866,54 +1866,53 @@ impl<'le> ::selectors::Element for GeckoElement<'le> { AttrSelectorOperation::WithValue { operator, case_sensitivity, - expected_value, + value, } => { let ignore_case = match case_sensitivity { CaseSensitivity::CaseSensitive => false, CaseSensitivity::AsciiCaseInsensitive => true, }; - // FIXME: case sensitivity for operators other than Equal match operator { AttrSelectorOperator::Equal => bindings::Gecko_AttrEquals( self.0, ns.atom_or_null(), local_name.as_ptr(), - expected_value.as_ptr(), + value.as_ptr(), ignore_case, ), AttrSelectorOperator::Includes => bindings::Gecko_AttrIncludes( self.0, ns.atom_or_null(), local_name.as_ptr(), - expected_value.as_ptr(), + value.as_ptr(), ignore_case, ), AttrSelectorOperator::DashMatch => bindings::Gecko_AttrDashEquals( self.0, ns.atom_or_null(), local_name.as_ptr(), - expected_value.as_ptr(), + value.as_ptr(), ignore_case, ), AttrSelectorOperator::Prefix => bindings::Gecko_AttrHasPrefix( self.0, ns.atom_or_null(), local_name.as_ptr(), - expected_value.as_ptr(), + value.as_ptr(), ignore_case, ), AttrSelectorOperator::Suffix => bindings::Gecko_AttrHasSuffix( self.0, ns.atom_or_null(), local_name.as_ptr(), - expected_value.as_ptr(), + value.as_ptr(), ignore_case, ), AttrSelectorOperator::Substring => bindings::Gecko_AttrHasSubstring( self.0, ns.atom_or_null(), local_name.as_ptr(), - expected_value.as_ptr(), + value.as_ptr(), ignore_case, ), }