diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 8211830e9eb..2b8ac715203 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -2387,6 +2387,13 @@ impl Document { } let mut snapshot = entry.snapshot.as_mut().unwrap(); + if attr.local_name() == &local_name!("id") { + snapshot.id_changed = true; + } else if attr.local_name() == &local_name!("class") { + snapshot.class_changed = true; + } else { + snapshot.other_attributes_changed = true; + } if snapshot.attrs.is_none() { let attrs = el.attrs() .iter() diff --git a/components/style/gecko/snapshot.rs b/components/style/gecko/snapshot.rs index d0060d5b7c7..a96c5471156 100644 --- a/components/style/gecko/snapshot.rs +++ b/components/style/gecko/snapshot.rs @@ -62,6 +62,25 @@ impl GeckoElementSnapshot { self.has_any(Flags::OtherPseudoClassState) } + /// Returns true if the snapshot recorded an id change. + #[inline] + pub fn id_changed(&self) -> bool { + self.mIdAttributeChanged() + } + + /// Returns true if the snapshot recorded a class attribute change. + #[inline] + pub fn class_changed(&self) -> bool { + self.mClassAttributeChanged() + } + + /// Returns true if the snapshot recorded an attribute change which isn't a + /// class or id change. + #[inline] + pub fn other_attr_changed(&self) -> bool { + self.mOtherAttributeChanged() + } + /// selectors::Element::attr_matches pub fn attr_matches(&self, ns: &NamespaceConstraint<&Namespace>, diff --git a/components/style/servo/selector_parser.rs b/components/style/servo/selector_parser.rs index 681a4c54374..76e3aea3eba 100644 --- a/components/style/servo/selector_parser.rs +++ b/components/style/servo/selector_parser.rs @@ -545,6 +545,12 @@ pub struct ServoElementSnapshot { pub attrs: Option>, /// Whether this element is an HTML element in an HTML document. pub is_html_element_in_html_document: bool, + /// Whether the class attribute changed or not. + pub class_changed: bool, + /// Whether the id attribute changed or not. + pub id_changed: bool, + /// Whether other attributes other than id or class changed or not. + pub other_attributes_changed: bool, } impl ServoElementSnapshot { @@ -554,9 +560,27 @@ impl ServoElementSnapshot { state: None, attrs: None, is_html_element_in_html_document: is_html_element_in_html_document, + class_changed: false, + id_changed: false, + other_attributes_changed: false, } } + /// Returns whether the id attribute changed or not. + pub fn id_changed(&self) -> bool { + self.id_changed + } + + /// Returns whether the class attribute changed or not. + pub fn class_changed(&self) -> bool { + self.class_changed + } + + /// Returns whether other attributes other than id or class changed or not. + pub fn other_attr_changed(&self) -> bool { + self.other_attributes_changed + } + fn get_attr(&self, namespace: &Namespace, name: &LocalName) -> Option<&AttrValue> { self.attrs.as_ref().unwrap().iter() .find(|&&(ref ident, _)| ident.local_name == *name &&