aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/layout/layout_thread.rs4
-rw-r--r--components/style/font_face.rs32
2 files changed, 34 insertions, 2 deletions
diff --git a/components/layout/layout_thread.rs b/components/layout/layout_thread.rs
index 2d98b96fdcb..db0968775a5 100644
--- a/components/layout/layout_thread.rs
+++ b/components/layout/layout_thread.rs
@@ -360,7 +360,7 @@ fn add_font_face_rules(stylesheet: &Stylesheet,
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.sources {
+ for source in font_face.effective_sources() {
font_cache_thread.add_web_font(font_face.family.clone(),
(*source).clone(),
sender.clone());
@@ -369,7 +369,7 @@ fn add_font_face_rules(stylesheet: &Stylesheet,
}
} else {
for font_face in stylesheet.effective_rules(&device).font_face() {
- for source in &font_face.sources {
+ 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(),
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<Source>),