Auto merge of #19454 - emilio:has-class-is-stupid, r=upsuper

style: Add a missing fast-path in GeckoElement::each_class.

This shows up when inserting elements in the bloom filter.

<!-- 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/19454)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2017-12-02 01:40:00 -06:00 committed by GitHub
commit 45bbbac9d9
2 changed files with 23 additions and 13 deletions

View file

@ -17,11 +17,12 @@ pub type ClassOrClassList<T> = unsafe extern fn (T, *mut *mut nsAtom, *mut *mut
/// Given an item `T`, a class name, and a getter function, return whether that /// Given an item `T`, a class name, and a getter function, return whether that
/// element has the class that `name` represents. /// element has the class that `name` represents.
pub fn has_class<T>(item: T, pub fn has_class<T>(
name: &Atom, item: T,
case_sensitivity: CaseSensitivity, name: &Atom,
getter: ClassOrClassList<T>) -> bool case_sensitivity: CaseSensitivity,
{ getter: ClassOrClassList<T>,
) -> bool {
unsafe { unsafe {
let mut class: *mut nsAtom = ptr::null_mut(); let mut class: *mut nsAtom = ptr::null_mut();
let mut list: *mut *mut nsAtom = ptr::null_mut(); let mut list: *mut *mut nsAtom = ptr::null_mut();
@ -40,10 +41,13 @@ pub fn has_class<T>(item: T,
/// Given an item, a callback, and a getter, execute `callback` for each class /// Given an item, a callback, and a getter, execute `callback` for each class
/// this `item` has. /// this `item` has.
pub fn each_class<F, T>(item: T, pub fn each_class<F, T>(
mut callback: F, item: T,
getter: ClassOrClassList<T>) mut callback: F,
where F: FnMut(&Atom) getter: ClassOrClassList<T>,
)
where
F: FnMut(&Atom)
{ {
unsafe { unsafe {
let mut class: *mut nsAtom = ptr::null_mut(); let mut class: *mut nsAtom = ptr::null_mut();

View file

@ -1113,6 +1113,10 @@ impl<'le> TElement for GeckoElement<'le> {
where where
F: FnMut(&Atom), F: FnMut(&Atom),
{ {
if !self.may_have_class() {
return;
}
snapshot_helpers::each_class(self.0, callback, Gecko_ClassOrClassList) snapshot_helpers::each_class(self.0, callback, Gecko_ClassOrClassList)
} }
@ -2129,10 +2133,12 @@ impl<'le> ::selectors::Element for GeckoElement<'le> {
return false; return false;
} }
snapshot_helpers::has_class(self.0, snapshot_helpers::has_class(
name, self.0,
case_sensitivity, name,
Gecko_ClassOrClassList) case_sensitivity,
Gecko_ClassOrClassList,
)
} }
#[inline] #[inline]