diff --git a/components/layout/layout_thread.rs b/components/layout/layout_thread.rs index b48813a0c31..6307e5a79fc 100644 --- a/components/layout/layout_thread.rs +++ b/components/layout/layout_thread.rs @@ -355,19 +355,23 @@ fn add_font_face_rules(stylesheet: &Stylesheet, font_cache_thread: &FontCacheThread, font_cache_sender: &IpcSender<()>, outstanding_web_fonts_counter: &Arc) { - for font_face in stylesheet.effective_rules(&device).font_face() { - for source in &font_face.sources { - if opts::get().load_webfonts_synchronously { - let (sender, receiver) = ipc::channel().unwrap(); + if opts::get().load_webfonts_synchronously { + let (sender, receiver) = ipc::channel().unwrap(); + for font_face in stylesheet.effective_rules(&device).font_face() { + for source in font_face.effective_sources() { font_cache_thread.add_web_font(font_face.family.clone(), - (*source).clone(), - sender); + (*source).clone(), + sender.clone()); receiver.recv().unwrap(); - } else { + } + } + } else { + for font_face in stylesheet.effective_rules(&device).font_face() { + for source in font_face.effective_sources() { outstanding_web_fonts_counter.fetch_add(1, Ordering::SeqCst); font_cache_thread.add_web_font(font_face.family.clone(), - (*source).clone(), - (*font_cache_sender).clone()); + (*source).clone(), + (*font_cache_sender).clone()); } } } diff --git a/components/style/font_face.rs b/components/style/font_face.rs index d41daea2f50..6db70a86e25 100644 --- a/components/style/font_face.rs +++ b/components/style/font_face.rs @@ -6,6 +6,8 @@ use computed_values::font_family::FontFamily; use cssparser::{AtRuleParser, DeclarationListParser, DeclarationParser, Parser}; use parser::{ParserContext, log_css_error}; use properties::longhands::font_family::parse_one_family; +use std::iter; +use std::slice; use url::Url; #[derive(Clone, Debug, HeapSizeOf, PartialEq, Eq, Deserialize, Serialize)] @@ -58,6 +60,36 @@ pub fn parse_font_face_block(context: &ParserContext, input: &mut Parser) } } +pub struct EffectiveSourcesIter<'a>(slice::Iter<'a, Source>); + +impl FontFaceRule { + /// Returns the list of effective sources for that font-face, that is the + /// sources which don't list any format hint, or the ones which list at + /// least "truetype" or "opentype". + pub fn effective_sources(&self) -> EffectiveSourcesIter { + EffectiveSourcesIter(self.sources.iter()) + } +} + +impl<'a> iter::Iterator for EffectiveSourcesIter<'a> { + type Item = &'a Source; + fn next(&mut self) -> Option<&'a Source> { + self.0.find(|source| { + if let Source::Url(ref url_source) = **source { + let hints = &url_source.format_hints; + // We support only opentype fonts and truetype is an alias for + // that format. Sources without format hints need to be + // downloaded in case we support them. + hints.is_empty() || hints.iter().any(|hint| { + hint == "truetype" || hint == "opentype" || hint == "woff" + }) + } else { + true + } + }) + } +} + enum FontFaceDescriptorDeclaration { Family(FontFamily), Src(Vec),