geckolib: Return @font-face rules to Gecko in the expected cascade order.

This commit is contained in:
Cameron McCormack 2017-08-14 10:26:21 +08:00
parent 0eabba3c6f
commit f26a7e9372
2 changed files with 18 additions and 4 deletions

View file

@ -64,6 +64,17 @@ impl<T> PerOrigin<T> {
PerOriginIter { PerOriginIter {
data: &self, data: &self,
cur: 0, cur: 0,
rev: false,
}
}
/// Iterates over references to per-origin extra style data, from lowest
/// level (user agent) to highest (author).
pub fn iter_origins_rev(&self) -> PerOriginIter<T> {
PerOriginIter {
data: &self,
cur: 2,
rev: true,
} }
} }
@ -99,7 +110,8 @@ impl<T> PerOriginClear for PerOrigin<T> where T: PerOriginClear {
/// @counter-style and @keyframes rules. /// @counter-style and @keyframes rules.
pub struct PerOriginIter<'a, T: 'a> { pub struct PerOriginIter<'a, T: 'a> {
data: &'a PerOrigin<T>, data: &'a PerOrigin<T>,
cur: usize, cur: i8,
rev: bool,
} }
impl<'a, T> Iterator for PerOriginIter<'a, T> where T: 'a { impl<'a, T> Iterator for PerOriginIter<'a, T> where T: 'a {
@ -112,7 +124,7 @@ impl<'a, T> Iterator for PerOriginIter<'a, T> where T: 'a {
2 => (&self.data.user_agent, Origin::UserAgent), 2 => (&self.data.user_agent, Origin::UserAgent),
_ => return None, _ => return None,
}; };
self.cur += 1; self.cur += if self.rev { -1 } else { 1 };
Some(result) Some(result)
} }
} }
@ -125,7 +137,7 @@ impl<'a, T> Iterator for PerOriginIter<'a, T> where T: 'a {
/// each time from `next()`. /// each time from `next()`.
pub struct PerOriginIterMut<'a, T: 'a> { pub struct PerOriginIterMut<'a, T: 'a> {
data: *mut PerOrigin<T>, data: *mut PerOrigin<T>,
cur: usize, cur: i8,
_marker: PhantomData<&'a mut PerOrigin<T>>, _marker: PhantomData<&'a mut PerOrigin<T>>,
} }

View file

@ -3449,8 +3449,10 @@ pub extern "C" fn Servo_StyleSet_GetFontFaceRules(raw_data: RawServoStyleSetBorr
.map(|(d, _)| d.font_faces.len() as u32) .map(|(d, _)| d.font_faces.len() as u32)
.sum(); .sum();
// Reversed iterator because Gecko expects rules to appear sorted
// UserAgent first, Author last.
let font_face_iter = data.extra_style_data let font_face_iter = data.extra_style_data
.iter_origins() .iter_origins_rev()
.flat_map(|(d, o)| d.font_faces.iter().zip(iter::repeat(o))); .flat_map(|(d, o)| d.font_faces.iter().zip(iter::repeat(o)));
unsafe { rules.set_len(len) }; unsafe { rules.set_len(len) };