Properly escape font-family names in CSS serialization.

Fix #15059.
This commit is contained in:
Simon Sapin 2017-01-19 17:48:06 +01:00
parent 5f5fe2ca52
commit bf16836598
2 changed files with 12 additions and 968 deletions

View file

@ -19,7 +19,8 @@
impl NoViewportPercentage for SpecifiedValue {}
pub mod computed_value {
use std::fmt;
use cssparser::CssStringWriter;
use std::fmt::{self, Write};
use Atom;
use style_traits::ToCss;
pub use self::FontFamily as SingleComputedValue;
@ -72,7 +73,16 @@
impl ToCss for FontFamily {
fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
self.atom().with_str(|s| dest.write_str(s))
match *self {
FontFamily::FamilyName(ref name) => {
dest.write_char('"')?;
write!(CssStringWriter::new(dest), "{}", name)?;
dest.write_char('"')
}
// All generic values accepted by the parser are known to not require escaping.
FontFamily::Generic(ref name) => write!(dest, "{}", name),
}
}
}

View file

@ -1,971 +1,5 @@
[test_font_family_parsing.html]
type: testharness
[font-family: arial, helvetica, "\\"times new roman", sans-serif (setter)]
expected: FAIL
[font: 16px arial, helvetica, "\\"times new roman", sans-serif (setter)]
expected: FAIL
[font: 900px arial, helvetica, "\\"times new roman", sans-serif (setter)]
expected: FAIL
[font: 900em arial, helvetica, "\\"times new roman", sans-serif (setter)]
expected: FAIL
[font: 35% arial, helvetica, "\\"times new roman", sans-serif (setter)]
expected: FAIL
[font: 7832.3% arial, helvetica, "\\"times new roman", sans-serif (setter)]
expected: FAIL
[font: xx-large arial, helvetica, "\\"times new roman", sans-serif (setter)]
expected: FAIL
[font: lighter larger arial, helvetica, "\\"times new roman", sans-serif (setter)]
expected: FAIL
[font: italic 16px arial, helvetica, "\\"times new roman", sans-serif (setter)]
expected: FAIL
[font: italic bold 16px arial, helvetica, "\\"times new roman", sans-serif (setter)]
expected: FAIL
[font: normal smaller arial, helvetica, "\\"times new roman", sans-serif (setter)]
expected: FAIL
[font: normal normal 16px arial, helvetica, "\\"times new roman", sans-serif (setter)]
expected: FAIL
[font: 400 normal 16px arial, helvetica, "\\"times new roman", sans-serif (setter)]
expected: FAIL
[font: bolder oblique 16px arial, helvetica, "\\"times new roman", sans-serif (setter)]
expected: FAIL
[font-family: arial, helvetica, '\\"times new roman', sans-serif (setter)]
expected: FAIL
[font: 16px arial, helvetica, '\\"times new roman', sans-serif (setter)]
expected: FAIL
[font: 900px arial, helvetica, '\\"times new roman', sans-serif (setter)]
expected: FAIL
[font: 900em arial, helvetica, '\\"times new roman', sans-serif (setter)]
expected: FAIL
[font: 35% arial, helvetica, '\\"times new roman', sans-serif (setter)]
expected: FAIL
[font: 7832.3% arial, helvetica, '\\"times new roman', sans-serif (setter)]
expected: FAIL
[font: xx-large arial, helvetica, '\\"times new roman', sans-serif (setter)]
expected: FAIL
[font: lighter larger arial, helvetica, '\\"times new roman', sans-serif (setter)]
expected: FAIL
[font: italic 16px arial, helvetica, '\\"times new roman', sans-serif (setter)]
expected: FAIL
[font: italic bold 16px arial, helvetica, '\\"times new roman', sans-serif (setter)]
expected: FAIL
[font: normal smaller arial, helvetica, '\\"times new roman', sans-serif (setter)]
expected: FAIL
[font: normal normal 16px arial, helvetica, '\\"times new roman', sans-serif (setter)]
expected: FAIL
[font: 400 normal 16px arial, helvetica, '\\"times new roman', sans-serif (setter)]
expected: FAIL
[font: bolder oblique 16px arial, helvetica, '\\"times new roman', sans-serif (setter)]
expected: FAIL
[font-family: \\"simple (setter)]
expected: FAIL
[font: 16px \\"simple (setter)]
expected: FAIL
[font: 900px \\"simple (setter)]
expected: FAIL
[font: 900em \\"simple (setter)]
expected: FAIL
[font: 35% \\"simple (setter)]
expected: FAIL
[font: 7832.3% \\"simple (setter)]
expected: FAIL
[font: xx-large \\"simple (setter)]
expected: FAIL
[font: lighter larger \\"simple (setter)]
expected: FAIL
[font: italic 16px \\"simple (setter)]
expected: FAIL
[font: italic bold 16px \\"simple (setter)]
expected: FAIL
[font: normal smaller \\"simple (setter)]
expected: FAIL
[font: normal normal 16px \\"simple (setter)]
expected: FAIL
[font: 400 normal 16px \\"simple (setter)]
expected: FAIL
[font: bolder oblique 16px \\"simple (setter)]
expected: FAIL
[font-family: "\\"simple" (setter)]
expected: FAIL
[font: 16px "\\"simple" (setter)]
expected: FAIL
[font: 900px "\\"simple" (setter)]
expected: FAIL
[font: 900em "\\"simple" (setter)]
expected: FAIL
[font: 35% "\\"simple" (setter)]
expected: FAIL
[font: 7832.3% "\\"simple" (setter)]
expected: FAIL
[font: xx-large "\\"simple" (setter)]
expected: FAIL
[font: lighter larger "\\"simple" (setter)]
expected: FAIL
[font: italic 16px "\\"simple" (setter)]
expected: FAIL
[font: italic bold 16px "\\"simple" (setter)]
expected: FAIL
[font: normal smaller "\\"simple" (setter)]
expected: FAIL
[font: normal normal 16px "\\"simple" (setter)]
expected: FAIL
[font: 400 normal 16px "\\"simple" (setter)]
expected: FAIL
[font: bolder oblique 16px "\\"simple" (setter)]
expected: FAIL
[font-family: \\035 simple]
expected: FAIL
[font-family: \\035 simple (setter)]
expected: FAIL
[font: 16px \\035 simple]
expected: FAIL
[font: 16px \\035 simple (setter)]
expected: FAIL
[font: 900px \\035 simple]
expected: FAIL
[font: 900px \\035 simple (setter)]
expected: FAIL
[font: 900em \\035 simple]
expected: FAIL
[font: 900em \\035 simple (setter)]
expected: FAIL
[font: 35% \\035 simple]
expected: FAIL
[font: 35% \\035 simple (setter)]
expected: FAIL
[font: 7832.3% \\035 simple]
expected: FAIL
[font: 7832.3% \\035 simple (setter)]
expected: FAIL
[font: xx-large \\035 simple]
expected: FAIL
[font: xx-large \\035 simple (setter)]
expected: FAIL
[font: lighter larger \\035 simple]
expected: FAIL
[font: lighter larger \\035 simple (setter)]
expected: FAIL
[font: italic 16px \\035 simple]
expected: FAIL
[font: italic 16px \\035 simple (setter)]
expected: FAIL
[font: italic bold 16px \\035 simple]
expected: FAIL
[font: italic bold 16px \\035 simple (setter)]
expected: FAIL
[font: normal smaller \\035 simple]
expected: FAIL
[font: normal smaller \\035 simple (setter)]
expected: FAIL
[font: normal normal 16px \\035 simple]
expected: FAIL
[font: normal normal 16px \\035 simple (setter)]
expected: FAIL
[font: 400 normal 16px \\035 simple]
expected: FAIL
[font: 400 normal 16px \\035 simple (setter)]
expected: FAIL
[font: bolder oblique 16px \\035 simple]
expected: FAIL
[font: bolder oblique 16px \\035 simple (setter)]
expected: FAIL
[font-family: simple\\02cinitial (setter)]
expected: FAIL
[font: 16px simple\\02cinitial (setter)]
expected: FAIL
[font: 900px simple\\02cinitial (setter)]
expected: FAIL
[font: 900em simple\\02cinitial (setter)]
expected: FAIL
[font: 35% simple\\02cinitial (setter)]
expected: FAIL
[font: 7832.3% simple\\02cinitial (setter)]
expected: FAIL
[font: xx-large simple\\02cinitial (setter)]
expected: FAIL
[font: lighter larger simple\\02cinitial (setter)]
expected: FAIL
[font: italic 16px simple\\02cinitial (setter)]
expected: FAIL
[font: italic bold 16px simple\\02cinitial (setter)]
expected: FAIL
[font: normal smaller simple\\02cinitial (setter)]
expected: FAIL
[font: normal normal 16px simple\\02cinitial (setter)]
expected: FAIL
[font: 400 normal 16px simple\\02cinitial (setter)]
expected: FAIL
[font: bolder oblique 16px simple\\02cinitial (setter)]
expected: FAIL
[font-family: simple, \\02cinitial]
expected: FAIL
[font-family: simple, \\02cinitial (setter)]
expected: FAIL
[font: 16px simple, \\02cinitial]
expected: FAIL
[font: 16px simple, \\02cinitial (setter)]
expected: FAIL
[font: 900px simple, \\02cinitial]
expected: FAIL
[font: 900px simple, \\02cinitial (setter)]
expected: FAIL
[font: 900em simple, \\02cinitial]
expected: FAIL
[font: 900em simple, \\02cinitial (setter)]
expected: FAIL
[font: 35% simple, \\02cinitial]
expected: FAIL
[font: 35% simple, \\02cinitial (setter)]
expected: FAIL
[font: 7832.3% simple, \\02cinitial]
expected: FAIL
[font: 7832.3% simple, \\02cinitial (setter)]
expected: FAIL
[font: xx-large simple, \\02cinitial]
expected: FAIL
[font: xx-large simple, \\02cinitial (setter)]
expected: FAIL
[font: lighter larger simple, \\02cinitial]
expected: FAIL
[font: lighter larger simple, \\02cinitial (setter)]
expected: FAIL
[font: italic 16px simple, \\02cinitial]
expected: FAIL
[font: italic 16px simple, \\02cinitial (setter)]
expected: FAIL
[font: italic bold 16px simple, \\02cinitial]
expected: FAIL
[font: italic bold 16px simple, \\02cinitial (setter)]
expected: FAIL
[font: normal smaller simple, \\02cinitial]
expected: FAIL
[font: normal smaller simple, \\02cinitial (setter)]
expected: FAIL
[font: normal normal 16px simple, \\02cinitial]
expected: FAIL
[font: normal normal 16px simple, \\02cinitial (setter)]
expected: FAIL
[font: 400 normal 16px simple, \\02cinitial]
expected: FAIL
[font: 400 normal 16px simple, \\02cinitial (setter)]
expected: FAIL
[font: bolder oblique 16px simple, \\02cinitial]
expected: FAIL
[font: bolder oblique 16px simple, \\02cinitial (setter)]
expected: FAIL
[font-family: sim\\020 \\035 ple]
expected: FAIL
[font-family: sim\\020 \\035 ple (setter)]
expected: FAIL
[font: 16px sim\\020 \\035 ple]
expected: FAIL
[font: 16px sim\\020 \\035 ple (setter)]
expected: FAIL
[font: 900px sim\\020 \\035 ple]
expected: FAIL
[font: 900px sim\\020 \\035 ple (setter)]
expected: FAIL
[font: 900em sim\\020 \\035 ple]
expected: FAIL
[font: 900em sim\\020 \\035 ple (setter)]
expected: FAIL
[font: 35% sim\\020 \\035 ple]
expected: FAIL
[font: 35% sim\\020 \\035 ple (setter)]
expected: FAIL
[font: 7832.3% sim\\020 \\035 ple]
expected: FAIL
[font: 7832.3% sim\\020 \\035 ple (setter)]
expected: FAIL
[font: xx-large sim\\020 \\035 ple]
expected: FAIL
[font: xx-large sim\\020 \\035 ple (setter)]
expected: FAIL
[font: lighter larger sim\\020 \\035 ple]
expected: FAIL
[font: lighter larger sim\\020 \\035 ple (setter)]
expected: FAIL
[font: italic 16px sim\\020 \\035 ple]
expected: FAIL
[font: italic 16px sim\\020 \\035 ple (setter)]
expected: FAIL
[font: italic bold 16px sim\\020 \\035 ple]
expected: FAIL
[font: italic bold 16px sim\\020 \\035 ple (setter)]
expected: FAIL
[font: normal smaller sim\\020 \\035 ple]
expected: FAIL
[font: normal smaller sim\\020 \\035 ple (setter)]
expected: FAIL
[font: normal normal 16px sim\\020 \\035 ple]
expected: FAIL
[font: normal normal 16px sim\\020 \\035 ple (setter)]
expected: FAIL
[font: 400 normal 16px sim\\020 \\035 ple]
expected: FAIL
[font: 400 normal 16px sim\\020 \\035 ple (setter)]
expected: FAIL
[font: bolder oblique 16px sim\\020 \\035 ple]
expected: FAIL
[font: bolder oblique 16px sim\\020 \\035 ple (setter)]
expected: FAIL
[font-family: sim\\020 5ple]
expected: FAIL
[font-family: sim\\020 5ple (setter)]
expected: FAIL
[font: 16px sim\\020 5ple]
expected: FAIL
[font: 16px sim\\020 5ple (setter)]
expected: FAIL
[font: 900px sim\\020 5ple]
expected: FAIL
[font: 900px sim\\020 5ple (setter)]
expected: FAIL
[font: 900em sim\\020 5ple]
expected: FAIL
[font: 900em sim\\020 5ple (setter)]
expected: FAIL
[font: 35% sim\\020 5ple]
expected: FAIL
[font: 35% sim\\020 5ple (setter)]
expected: FAIL
[font: 7832.3% sim\\020 5ple]
expected: FAIL
[font: 7832.3% sim\\020 5ple (setter)]
expected: FAIL
[font: xx-large sim\\020 5ple]
expected: FAIL
[font: xx-large sim\\020 5ple (setter)]
expected: FAIL
[font: lighter larger sim\\020 5ple]
expected: FAIL
[font: lighter larger sim\\020 5ple (setter)]
expected: FAIL
[font: italic 16px sim\\020 5ple]
expected: FAIL
[font: italic 16px sim\\020 5ple (setter)]
expected: FAIL
[font: italic bold 16px sim\\020 5ple]
expected: FAIL
[font: italic bold 16px sim\\020 5ple (setter)]
expected: FAIL
[font: normal smaller sim\\020 5ple]
expected: FAIL
[font: normal smaller sim\\020 5ple (setter)]
expected: FAIL
[font: normal normal 16px sim\\020 5ple]
expected: FAIL
[font: normal normal 16px sim\\020 5ple (setter)]
expected: FAIL
[font: 400 normal 16px sim\\020 5ple]
expected: FAIL
[font: 400 normal 16px sim\\020 5ple (setter)]
expected: FAIL
[font: bolder oblique 16px sim\\020 5ple]
expected: FAIL
[font: bolder oblique 16px sim\\020 5ple (setter)]
expected: FAIL
[font-family: \\@simple]
expected: FAIL
[font-family: \\@simple (setter)]
expected: FAIL
[font: 16px \\@simple]
expected: FAIL
[font: 16px \\@simple (setter)]
expected: FAIL
[font: 900px \\@simple]
expected: FAIL
[font: 900px \\@simple (setter)]
expected: FAIL
[font: 900em \\@simple]
expected: FAIL
[font: 900em \\@simple (setter)]
expected: FAIL
[font: 35% \\@simple]
expected: FAIL
[font: 35% \\@simple (setter)]
expected: FAIL
[font: 7832.3% \\@simple]
expected: FAIL
[font: 7832.3% \\@simple (setter)]
expected: FAIL
[font: xx-large \\@simple]
expected: FAIL
[font: xx-large \\@simple (setter)]
expected: FAIL
[font: lighter larger \\@simple]
expected: FAIL
[font: lighter larger \\@simple (setter)]
expected: FAIL
[font: italic 16px \\@simple]
expected: FAIL
[font: italic 16px \\@simple (setter)]
expected: FAIL
[font: italic bold 16px \\@simple]
expected: FAIL
[font: italic bold 16px \\@simple (setter)]
expected: FAIL
[font: normal smaller \\@simple]
expected: FAIL
[font: normal smaller \\@simple (setter)]
expected: FAIL
[font: normal normal 16px \\@simple]
expected: FAIL
[font: normal normal 16px \\@simple (setter)]
expected: FAIL
[font: 400 normal 16px \\@simple]
expected: FAIL
[font: 400 normal 16px \\@simple (setter)]
expected: FAIL
[font: bolder oblique 16px \\@simple]
expected: FAIL
[font: bolder oblique 16px \\@simple (setter)]
expected: FAIL
[font-family: \\@simple\\;]
expected: FAIL
[font-family: \\@simple\\; (setter)]
expected: FAIL
[font: 16px \\@simple\\;]
expected: FAIL
[font: 16px \\@simple\\; (setter)]
expected: FAIL
[font: 900px \\@simple\\;]
expected: FAIL
[font: 900px \\@simple\\; (setter)]
expected: FAIL
[font: 900em \\@simple\\;]
expected: FAIL
[font: 900em \\@simple\\; (setter)]
expected: FAIL
[font: 35% \\@simple\\;]
expected: FAIL
[font: 35% \\@simple\\; (setter)]
expected: FAIL
[font: 7832.3% \\@simple\\;]
expected: FAIL
[font: 7832.3% \\@simple\\; (setter)]
expected: FAIL
[font: xx-large \\@simple\\;]
expected: FAIL
[font: xx-large \\@simple\\; (setter)]
expected: FAIL
[font: lighter larger \\@simple\\;]
expected: FAIL
[font: lighter larger \\@simple\\; (setter)]
expected: FAIL
[font: italic 16px \\@simple\\;]
expected: FAIL
[font: italic 16px \\@simple\\; (setter)]
expected: FAIL
[font: italic bold 16px \\@simple\\;]
expected: FAIL
[font: italic bold 16px \\@simple\\; (setter)]
expected: FAIL
[font: normal smaller \\@simple\\;]
expected: FAIL
[font: normal smaller \\@simple\\; (setter)]
expected: FAIL
[font: normal normal 16px \\@simple\\;]
expected: FAIL
[font: normal normal 16px \\@simple\\; (setter)]
expected: FAIL
[font: 400 normal 16px \\@simple\\;]
expected: FAIL
[font: 400 normal 16px \\@simple\\; (setter)]
expected: FAIL
[font: bolder oblique 16px \\@simple\\;]
expected: FAIL
[font: bolder oblique 16px \\@simple\\; (setter)]
expected: FAIL
[font-family: \\@font-face]
expected: FAIL
[font-family: \\@font-face (setter)]
expected: FAIL
[font: 16px \\@font-face]
expected: FAIL
[font: 16px \\@font-face (setter)]
expected: FAIL
[font: 900px \\@font-face]
expected: FAIL
[font: 900px \\@font-face (setter)]
expected: FAIL
[font: 900em \\@font-face]
expected: FAIL
[font: 900em \\@font-face (setter)]
expected: FAIL
[font: 35% \\@font-face]
expected: FAIL
[font: 35% \\@font-face (setter)]
expected: FAIL
[font: 7832.3% \\@font-face]
expected: FAIL
[font: 7832.3% \\@font-face (setter)]
expected: FAIL
[font: xx-large \\@font-face]
expected: FAIL
[font: xx-large \\@font-face (setter)]
expected: FAIL
[font: lighter larger \\@font-face]
expected: FAIL
[font: lighter larger \\@font-face (setter)]
expected: FAIL
[font: italic 16px \\@font-face]
expected: FAIL
[font: italic 16px \\@font-face (setter)]
expected: FAIL
[font: italic bold 16px \\@font-face]
expected: FAIL
[font: italic bold 16px \\@font-face (setter)]
expected: FAIL
[font: normal smaller \\@font-face]
expected: FAIL
[font: normal smaller \\@font-face (setter)]
expected: FAIL
[font: normal normal 16px \\@font-face]
expected: FAIL
[font: normal normal 16px \\@font-face (setter)]
expected: FAIL
[font: 400 normal 16px \\@font-face]
expected: FAIL
[font: 400 normal 16px \\@font-face (setter)]
expected: FAIL
[font: bolder oblique 16px \\@font-face]
expected: FAIL
[font: bolder oblique 16px \\@font-face (setter)]
expected: FAIL
[font-family: \\@font-face\\;]
expected: FAIL
[font-family: \\@font-face\\; (setter)]
expected: FAIL
[font: 16px \\@font-face\\;]
expected: FAIL
[font: 16px \\@font-face\\; (setter)]
expected: FAIL
[font: 900px \\@font-face\\;]
expected: FAIL
[font: 900px \\@font-face\\; (setter)]
expected: FAIL
[font: 900em \\@font-face\\;]
expected: FAIL
[font: 900em \\@font-face\\; (setter)]
expected: FAIL
[font: 35% \\@font-face\\;]
expected: FAIL
[font: 35% \\@font-face\\; (setter)]
expected: FAIL
[font: 7832.3% \\@font-face\\;]
expected: FAIL
[font: 7832.3% \\@font-face\\; (setter)]
expected: FAIL
[font: xx-large \\@font-face\\;]
expected: FAIL
[font: xx-large \\@font-face\\; (setter)]
expected: FAIL
[font: lighter larger \\@font-face\\;]
expected: FAIL
[font: lighter larger \\@font-face\\; (setter)]
expected: FAIL
[font: italic 16px \\@font-face\\;]
expected: FAIL
[font: italic 16px \\@font-face\\; (setter)]
expected: FAIL
[font: italic bold 16px \\@font-face\\;]
expected: FAIL
[font: italic bold 16px \\@font-face\\; (setter)]
expected: FAIL
[font: normal smaller \\@font-face\\;]
expected: FAIL
[font: normal smaller \\@font-face\\; (setter)]
expected: FAIL
[font: normal normal 16px \\@font-face\\;]
expected: FAIL
[font: normal normal 16px \\@font-face\\; (setter)]
expected: FAIL
[font: 400 normal 16px \\@font-face\\;]
expected: FAIL
[font: 400 normal 16px \\@font-face\\; (setter)]
expected: FAIL
[font: bolder oblique 16px \\@font-face\\;]
expected: FAIL
[font: bolder oblique 16px \\@font-face\\; (setter)]
expected: FAIL
[font-family: \\031 \\036 px]
expected: FAIL
[font-family: \\031 \\036 px (setter)]
expected: FAIL
[font: 16px \\031 \\036 px]
expected: FAIL
[font: 16px \\031 \\036 px (setter)]
expected: FAIL
[font: 900px \\031 \\036 px]
expected: FAIL
[font: 900px \\031 \\036 px (setter)]
expected: FAIL
[font: 900em \\031 \\036 px]
expected: FAIL
[font: 900em \\031 \\036 px (setter)]
expected: FAIL
[font: 35% \\031 \\036 px]
expected: FAIL
[font: 35% \\031 \\036 px (setter)]
expected: FAIL
[font: 7832.3% \\031 \\036 px]
expected: FAIL
[font: 7832.3% \\031 \\036 px (setter)]
expected: FAIL
[font: xx-large \\031 \\036 px]
expected: FAIL
[font: xx-large \\031 \\036 px (setter)]
expected: FAIL
[font: lighter larger \\031 \\036 px]
expected: FAIL
[font: lighter larger \\031 \\036 px (setter)]
expected: FAIL
[font: italic 16px \\031 \\036 px]
expected: FAIL
[font: italic 16px \\031 \\036 px (setter)]
expected: FAIL
[font: italic bold 16px \\031 \\036 px]
expected: FAIL
[font: italic bold 16px \\031 \\036 px (setter)]
expected: FAIL
[font: normal smaller \\031 \\036 px]
expected: FAIL
[font: normal smaller \\031 \\036 px (setter)]
expected: FAIL
[font: normal normal 16px \\031 \\036 px]
expected: FAIL
[font: normal normal 16px \\031 \\036 px (setter)]
expected: FAIL
[font: 400 normal 16px \\031 \\036 px]
expected: FAIL
[font: 400 normal 16px \\031 \\036 px (setter)]
expected: FAIL
[font: bolder oblique 16px \\031 \\036 px]
expected: FAIL
[font: bolder oblique 16px \\031 \\036 px (setter)]
expected: FAIL
[font: 16px default]
expected: FAIL