diff --git a/components/style/stylesheets/origin.rs b/components/style/stylesheets/origin.rs index 1d2bbadd09d..ba598fede2b 100644 --- a/components/style/stylesheets/origin.rs +++ b/components/style/stylesheets/origin.rs @@ -64,6 +64,17 @@ impl PerOrigin { PerOriginIter { data: &self, 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 { + PerOriginIter { + data: &self, + cur: 2, + rev: true, } } @@ -99,7 +110,8 @@ impl PerOriginClear for PerOrigin where T: PerOriginClear { /// @counter-style and @keyframes rules. pub struct PerOriginIter<'a, T: 'a> { data: &'a PerOrigin, - cur: usize, + cur: i8, + rev: bool, } 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), _ => return None, }; - self.cur += 1; + self.cur += if self.rev { -1 } else { 1 }; Some(result) } } @@ -125,7 +137,7 @@ impl<'a, T> Iterator for PerOriginIter<'a, T> where T: 'a { /// each time from `next()`. pub struct PerOriginIterMut<'a, T: 'a> { data: *mut PerOrigin, - cur: usize, + cur: i8, _marker: PhantomData<&'a mut PerOrigin>, } diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index ec1f610403e..512aa561f3b 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -3449,8 +3449,10 @@ pub extern "C" fn Servo_StyleSet_GetFontFaceRules(raw_data: RawServoStyleSetBorr .map(|(d, _)| d.font_faces.len() as u32) .sum(); + // Reversed iterator because Gecko expects rules to appear sorted + // UserAgent first, Author last. 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))); unsafe { rules.set_len(len) };