diff --git a/servo/components/style/font_face.rs b/servo/components/style/font_face.rs index 6d5e4fd0a9a7..8d840001709b 100644 --- a/servo/components/style/font_face.rs +++ b/servo/components/style/font_face.rs @@ -11,6 +11,7 @@ use crate::error_reporting::ContextualParseError; use crate::parser::{Parse, ParserContext}; use crate::shared_lock::{SharedRwLockReadGuard, ToCssWithGuard}; use crate::values::computed::FontWeight; +use crate::values::computed::font::FontFamilyNameSyntax; use crate::values::generics::font::FontStyle as GenericFontStyle; use crate::values::specified::{Angle, url::SpecifiedUrl}; use cssparser::{Parser, RuleBodyParser, SourceLocation}; @@ -501,9 +502,11 @@ impl Parse for Source { .try_parse(|input| input.expect_function_matching("local")) .is_ok() { - return input - .parse_nested_block(|input| FamilyName::parse(context, input)) - .map(Source::Local); + let mut family_name = + input.parse_nested_block(|input| FamilyName::parse(context, input))?; + // Force src:local() names to always serialize as quoted strings. + family_name.syntax = FontFamilyNameSyntax::Quoted; + return Ok(Source::Local(family_name)); } let url = SpecifiedUrl::parse(context, input)?; diff --git a/testing/web-platform/tests/css/css-fonts/font-family-src-quoted.html b/testing/web-platform/tests/css/css-fonts/font-family-src-quoted.html index a279e99153f2..2a37def4453b 100644 --- a/testing/web-platform/tests/css/css-fonts/font-family-src-quoted.html +++ b/testing/web-platform/tests/css/css-fonts/font-family-src-quoted.html @@ -53,6 +53,21 @@ font-family: "B"; src: local("C\\D"); } +/* 9 */ +@font-face { + font-family: "I"; + src: local(ident); +} +/* 10 */ +@font-face { + font-family: "J"; + src: local(two idents); +} +/* 11 */ +@font-face { + font-family: "K"; + src: url(/path/to/font.ttf); +} @@ -68,6 +83,10 @@ test(function(t) { assert_not_equals(rules[6].cssText.indexOf('local(\"W\\\"X\")'), -1); assert_not_equals(rules[7].cssText.indexOf('local(\"Z\\a A\")'), -1); assert_not_equals(rules[8].cssText.indexOf('local(\"C\\\\D\")'), -1); + // serialization is quoted even if source was unquoted: + assert_not_equals(rules[9].cssText.indexOf('local(\"ident\")'), -1); + assert_not_equals(rules[10].cssText.indexOf('local(\"two idents\")'), -1); + assert_not_equals(rules[11].cssText.indexOf('url(\"/path/to/font.ttf\")'), -1); });