aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2018-01-22 19:58:01 +0100
committerAnthony Ramine <n.oxyde@gmail.com>2018-01-23 10:41:42 +0100
commitcd8f96cc9edd5debbb738ffa3124e3d46c5d8bcf (patch)
tree5c6f46a882b529a5de7b792d44b0ee432ee327bd
parent3672856efa31195aaa89b007f790df925474001a (diff)
downloadservo-cd8f96cc9edd5debbb738ffa3124e3d46c5d8bcf.tar.gz
servo-cd8f96cc9edd5debbb738ffa3124e3d46c5d8bcf.zip
Change ToCss to take a CssWriter<W>
This more concrete wrapper type can write a prefix the very first time something is written to it. This allows removing plenty of useless monomorphisations caused by the former W/SequenceWriter<W> pair of types.
-rw-r--r--components/script/dom/medialist.rs11
-rw-r--r--components/script/dom/mediaquerylist.rs4
-rw-r--r--components/style/counter_style/mod.rs38
-rw-r--r--components/style/custom_properties.rs9
-rw-r--r--components/style/font_face.rs10
-rw-r--r--components/style/gecko/media_queries.rs6
-rw-r--r--components/style/gecko/selector_parser.rs6
-rw-r--r--components/style/gecko/url.rs9
-rw-r--r--components/style/lib.rs16
-rw-r--r--components/style/macros.rs7
-rw-r--r--components/style/media_queries.rs14
-rw-r--r--components/style/properties/declaration_block.rs22
-rw-r--r--components/style/properties/helpers.mako.rs23
-rw-r--r--components/style/properties/helpers/animated_properties.mako.rs9
-rw-r--r--components/style/properties/longhand/color.mako.rs9
-rw-r--r--components/style/properties/longhand/counters.mako.rs33
-rw-r--r--components/style/properties/longhand/inherited_text.mako.rs12
-rw-r--r--components/style/properties/properties.mako.rs50
-rw-r--r--components/style/properties/shorthand/background.mako.rs4
-rw-r--r--components/style/properties/shorthand/border.mako.rs10
-rw-r--r--components/style/properties/shorthand/box.mako.rs12
-rw-r--r--components/style/properties/shorthand/font.mako.rs17
-rw-r--r--components/style/properties/shorthand/inherited_svg.mako.rs2
-rw-r--r--components/style/properties/shorthand/mask.mako.rs4
-rw-r--r--components/style/properties/shorthand/outline.mako.rs2
-rw-r--r--components/style/properties/shorthand/position.mako.rs28
-rw-r--r--components/style/properties/shorthand/serialize.mako.rs19
-rw-r--r--components/style/properties/shorthand/text.mako.rs2
-rw-r--r--components/style/selector_parser.rs4
-rw-r--r--components/style/servo/media_queries.rs9
-rw-r--r--components/style/servo/url.rs9
-rw-r--r--components/style/stylesheets/document_rule.rs16
-rw-r--r--components/style/stylesheets/font_feature_values_rule.rs34
-rw-r--r--components/style/stylesheets/import_rule.rs6
-rw-r--r--components/style/stylesheets/keyframes_rule.rs16
-rw-r--r--components/style/stylesheets/media_rule.rs4
-rw-r--r--components/style/stylesheets/supports_rule.rs14
-rw-r--r--components/style/stylesheets/viewport_rule.rs21
-rw-r--r--components/style/values/computed/align.rs4
-rw-r--r--components/style/values/computed/background.rs8
-rw-r--r--components/style/values/computed/basic_shape.rs14
-rw-r--r--components/style/values/computed/color.rs4
-rw-r--r--components/style/values/computed/font.rs12
-rw-r--r--components/style/values/computed/image.rs13
-rw-r--r--components/style/values/computed/inherited_box.rs14
-rw-r--r--components/style/values/computed/length.rs14
-rw-r--r--components/style/values/computed/mod.rs15
-rw-r--r--components/style/values/computed/percentage.rs4
-rw-r--r--components/style/values/computed/pointing.rs16
-rw-r--r--components/style/values/computed/position.rs9
-rw-r--r--components/style/values/computed/text.rs14
-rw-r--r--components/style/values/computed/time.rs8
-rw-r--r--components/style/values/generics/basic_shape.rs14
-rw-r--r--components/style/values/generics/border.rs23
-rw-r--r--components/style/values/generics/counters.rs4
-rw-r--r--components/style/values/generics/effects.rs8
-rw-r--r--components/style/values/generics/grid.rs34
-rw-r--r--components/style/values/generics/image.rs34
-rw-r--r--components/style/values/generics/mod.rs20
-rw-r--r--components/style/values/generics/rect.rs9
-rw-r--r--components/style/values/generics/size.rs10
-rw-r--r--components/style/values/generics/svg.rs9
-rw-r--r--components/style/values/generics/transform.rs17
-rw-r--r--components/style/values/mod.rs19
-rw-r--r--components/style/values/specified/align.rs14
-rw-r--r--components/style/values/specified/angle.rs9
-rw-r--r--components/style/values/specified/basic_shape.rs29
-rw-r--r--components/style/values/specified/box.rs18
-rw-r--r--components/style/values/specified/calc.rs9
-rw-r--r--components/style/values/specified/color.rs11
-rw-r--r--components/style/values/specified/font.rs54
-rw-r--r--components/style/values/specified/image.rs13
-rw-r--r--components/style/values/specified/inherited_box.rs9
-rw-r--r--components/style/values/specified/list.rs9
-rw-r--r--components/style/values/specified/mod.rs24
-rw-r--r--components/style/values/specified/percentage.rs9
-rw-r--r--components/style/values/specified/position.rs24
-rw-r--r--components/style/values/specified/svg.rs10
-rw-r--r--components/style/values/specified/table.rs4
-rw-r--r--components/style/values/specified/text.rs9
-rw-r--r--components/style/values/specified/time.rs8
-rw-r--r--components/style/values/specified/ui.rs9
-rw-r--r--components/style_derive/to_css.rs12
-rw-r--r--components/style_traits/cursor.rs12
-rw-r--r--components/style_traits/lib.rs2
-rw-r--r--components/style_traits/values.rs201
-rw-r--r--components/style_traits/viewport.rs11
-rw-r--r--ports/geckolib/glue.rs22
-rw-r--r--tests/unit/style/media_queries.rs3
89 files changed, 873 insertions, 533 deletions
diff --git a/components/script/dom/medialist.rs b/components/script/dom/medialist.rs
index 6ae318da582..449c3c19ea6 100644
--- a/components/script/dom/medialist.rs
+++ b/components/script/dom/medialist.rs
@@ -93,12 +93,11 @@ impl MediaListMethods for MediaList {
// https://drafts.csswg.org/cssom/#dom-medialist-item
fn Item(&self, index: u32) -> Option<DOMString> {
let guard = self.shared_lock().read();
- self.media_queries.read_with(&guard).media_queries
- .get(index as usize).and_then(|query| {
- let mut s = String::new();
- query.to_css(&mut s).unwrap();
- Some(DOMString::from_string(s))
- })
+ self.media_queries
+ .read_with(&guard)
+ .media_queries
+ .get(index as usize)
+ .map(|query| query.to_css_string().into())
}
// https://drafts.csswg.org/cssom/#dom-medialist-item
diff --git a/components/script/dom/mediaquerylist.rs b/components/script/dom/mediaquerylist.rs
index e89e7d4d744..4c6be0091b1 100644
--- a/components/script/dom/mediaquerylist.rs
+++ b/components/script/dom/mediaquerylist.rs
@@ -83,9 +83,7 @@ impl MediaQueryList {
impl MediaQueryListMethods for MediaQueryList {
// https://drafts.csswg.org/cssom-view/#dom-mediaquerylist-media
fn Media(&self) -> DOMString {
- let mut s = String::new();
- self.media_query_list.to_css(&mut s).unwrap();
- DOMString::from_string(s)
+ self.media_query_list.to_css_string().into()
}
// https://drafts.csswg.org/cssom-view/#dom-mediaquerylist-matches
diff --git a/components/style/counter_style/mod.rs b/components/style/counter_style/mod.rs
index 8b1c3085523..1ad385c4bfd 100644
--- a/components/style/counter_style/mod.rs
+++ b/components/style/counter_style/mod.rs
@@ -20,7 +20,8 @@ use std::borrow::Cow;
use std::fmt::{self, Write};
use std::ops::Range;
use str::CssStringWriter;
-use style_traits::{Comma, OneOrMoreSeparated, ParseError, StyleParseErrorKind, ToCss};
+use style_traits::{Comma, CssWriter, OneOrMoreSeparated, ParseError};
+use style_traits::{StyleParseErrorKind, ToCss};
use values::CustomIdent;
/// Parse a counter style name reference.
@@ -231,12 +232,12 @@ macro_rules! counter_style_descriptors {
impl ToCssWithGuard for CounterStyleRuleData {
fn to_css(&self, _guard: &SharedRwLockReadGuard, dest: &mut CssStringWriter) -> fmt::Result {
dest.write_str("@counter-style ")?;
- self.name.to_css(dest)?;
+ self.name.to_css(&mut CssWriter::new(dest))?;
dest.write_str(" {\n")?;
$(
if let Some(ref value) = self.$ident {
dest.write_str(concat!(" ", $name, ": "))?;
- ToCss::to_css(value, dest)?;
+ ToCss::to_css(value, &mut CssWriter::new(dest))?;
dest.write_str(";\n")?;
}
)+
@@ -362,7 +363,10 @@ impl Parse for System {
}
impl ToCss for System {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match *self {
System::Cyclic => dest.write_str("cyclic"),
System::Numeric => dest.write_str("numeric"),
@@ -410,7 +414,10 @@ impl Parse for Symbol {
}
impl ToCss for Symbol {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match *self {
Symbol::String(ref s) => s.to_css(dest),
Symbol::Ident(ref s) => serialize_identifier(s, dest),
@@ -477,7 +484,10 @@ fn parse_bound<'i, 't>(input: &mut Parser<'i, 't>) -> Result<Option<i32>, ParseE
}
impl ToCss for Ranges {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
let mut iter = self.0.iter();
if let Some(first) = iter.next() {
range_to_css(first, dest)?;
@@ -492,14 +502,19 @@ impl ToCss for Ranges {
}
}
-fn range_to_css<W>(range: &Range<Option<i32>>, dest: &mut W) -> fmt::Result
-where W: fmt::Write {
+fn range_to_css<W>(range: &Range<Option<i32>>, dest: &mut CssWriter<W>) -> fmt::Result
+where
+ W: Write,
+{
bound_to_css(range.start, dest)?;
dest.write_char(' ')?;
bound_to_css(range.end, dest)
}
-fn bound_to_css<W>(range: Option<i32>, dest: &mut W) -> fmt::Result where W: fmt::Write {
+fn bound_to_css<W>(range: Option<i32>, dest: &mut CssWriter<W>) -> fmt::Result
+where
+ W: Write,
+{
if let Some(finite) = range {
finite.to_css(dest)
} else {
@@ -556,7 +571,10 @@ impl Parse for Symbols {
}
impl ToCss for Symbols {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
let mut iter = self.0.iter();
let first = iter.next().expect("expected at least one symbol");
first.to_css(dest)?;
diff --git a/components/style/custom_properties.rs b/components/style/custom_properties.rs
index 86aa135a0b8..0aa43109a18 100644
--- a/components/style/custom_properties.rs
+++ b/components/style/custom_properties.rs
@@ -17,9 +17,9 @@ use smallvec::SmallVec;
#[allow(unused_imports)] use std::ascii::AsciiExt;
use std::borrow::{Borrow, Cow};
use std::cmp;
-use std::fmt;
+use std::fmt::{self, Write};
use std::hash::Hash;
-use style_traits::{ToCss, StyleParseErrorKind, ParseError};
+use style_traits::{CssWriter, ToCss, StyleParseErrorKind, ParseError};
/// A custom property name is just an `Atom`.
///
@@ -53,8 +53,9 @@ pub struct VariableValue {
}
impl ToCss for SpecifiedValue {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
dest.write_str(&self.css)
}
diff --git a/components/style/font_face.rs b/components/style/font_face.rs
index e74064a9625..1eae14e4a3a 100644
--- a/components/style/font_face.rs
+++ b/components/style/font_face.rs
@@ -22,7 +22,8 @@ use selectors::parser::SelectorParseErrorKind;
use shared_lock::{SharedRwLockReadGuard, ToCssWithGuard};
use std::fmt::{self, Write};
use str::CssStringWriter;
-use style_traits::{Comma, OneOrMoreSeparated, ParseError, StyleParseErrorKind, ToCss};
+use style_traits::{Comma, CssWriter, OneOrMoreSeparated, ParseError};
+use style_traits::{StyleParseErrorKind, ToCss};
use values::computed::font::FamilyName;
use values::specified::url::SpecifiedUrl;
@@ -55,8 +56,9 @@ pub struct UrlSource {
}
impl ToCss for UrlSource {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
self.url.to_css(dest)
}
@@ -278,7 +280,7 @@ macro_rules! font_face_descriptors_common {
$(
if let Some(ref value) = self.$ident {
dest.write_str(concat!(" ", $name, ": "))?;
- ToCss::to_css(value, dest)?;
+ ToCss::to_css(value, &mut CssWriter::new(dest))?;
dest.write_str(";\n")?;
}
)*
diff --git a/components/style/gecko/media_queries.rs b/components/style/gecko/media_queries.rs
index bbecaff7905..69ad65ac70c 100644
--- a/components/style/gecko/media_queries.rs
+++ b/components/style/gecko/media_queries.rs
@@ -24,7 +24,7 @@ use std::fmt::{self, Write};
use std::sync::atomic::{AtomicBool, AtomicIsize, AtomicUsize, Ordering};
use str::starts_with_ignore_ascii_case;
use string_cache::Atom;
-use style_traits::{CSSPixel, DevicePixel};
+use style_traits::{CSSPixel, CssWriter, DevicePixel};
use style_traits::{ToCss, ParseError, StyleParseErrorKind};
use style_traits::viewport::ViewportConstraints;
use stylesheets::Origin;
@@ -236,7 +236,7 @@ pub struct Expression {
}
impl ToCss for Expression {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where W: fmt::Write,
{
dest.write_str("(")?;
@@ -408,7 +408,7 @@ impl MediaExpressionValue {
}
impl MediaExpressionValue {
- fn to_css<W>(&self, dest: &mut W, for_expr: &Expression) -> fmt::Result
+ fn to_css<W>(&self, dest: &mut CssWriter<W>, for_expr: &Expression) -> fmt::Result
where W: fmt::Write,
{
match *self {
diff --git a/components/style/gecko/selector_parser.rs b/components/style/gecko/selector_parser.rs
index cb57d9b21fb..985bd453b4c 100644
--- a/components/style/gecko/selector_parser.rs
+++ b/components/style/gecko/selector_parser.rs
@@ -16,7 +16,7 @@ use selectors::parser::{self as selector_parser, Selector, Visit, SelectorParseE
use selectors::visitor::SelectorVisitor;
use std::fmt;
use string_cache::{Atom, Namespace, WeakAtom, WeakNamespace};
-use style_traits::{ParseError, StyleParseErrorKind, ToCss as ToCss_};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss as ToCss_};
pub use gecko::pseudo_element::{PseudoElement, EAGER_PSEUDOS, EAGER_PSEUDO_COUNT, PSEUDO_COUNT};
pub use gecko::snapshot::SnapshotMap;
@@ -86,12 +86,12 @@ impl ToCss for NonTSPseudoClass {
}, )*
NonTSPseudoClass::MozLocaleDir(ref dir) => {
dest.write_str(":-moz-locale-dir(")?;
- dir.to_css(dest)?;
+ dir.to_css(&mut CssWriter::new(dest))?;
return dest.write_char(')')
},
NonTSPseudoClass::Dir(ref dir) => {
dest.write_str(":dir(")?;
- dir.to_css(dest)?;
+ dir.to_css(&mut CssWriter::new(dest))?;
return dest.write_char(')')
},
NonTSPseudoClass::MozAny(ref selectors) => {
diff --git a/components/style/gecko/url.rs b/components/style/gecko/url.rs
index 64eda812f45..b18d00a559c 100644
--- a/components/style/gecko/url.rs
+++ b/components/style/gecko/url.rs
@@ -12,9 +12,9 @@ use gecko_bindings::sugar::refptr::RefPtr;
use malloc_size_of::{MallocSizeOf, MallocSizeOfOps};
use parser::ParserContext;
use servo_arc::{Arc, RawOffsetArc};
-use std::fmt;
+use std::fmt::{self, Write};
use std::mem;
-use style_traits::{ToCss, ParseError};
+use style_traits::{CssWriter, ToCss, ParseError};
/// A specified url() value for gecko. Gecko does not eagerly resolve SpecifiedUrls.
#[derive(Clone, Debug, PartialEq)]
@@ -136,7 +136,10 @@ impl SpecifiedUrl {
}
impl ToCss for SpecifiedUrl {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
dest.write_str("url(")?;
self.serialization.to_css(dest)?;
dest.write_str(")")
diff --git a/components/style/lib.rs b/components/style/lib.rs
index d4d3855a481..d789c1d3305 100644
--- a/components/style/lib.rs
+++ b/components/style/lib.rs
@@ -134,8 +134,8 @@ pub mod traversal_flags;
#[allow(non_camel_case_types)]
pub mod values;
-use std::fmt;
-use style_traits::ToCss;
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ToCss};
#[cfg(feature = "gecko")] pub use gecko_string_cache as string_cache;
#[cfg(feature = "gecko")] pub use gecko_string_cache::Atom;
@@ -181,11 +181,13 @@ longhand_properties_idents!(reexport_computed_values);
/// Serializes as CSS a comma-separated list of any `T` that supports being
/// serialized as CSS.
-pub fn serialize_comma_separated_list<W, T>(dest: &mut W,
- list: &[T])
- -> fmt::Result
- where W: fmt::Write,
- T: ToCss,
+pub fn serialize_comma_separated_list<W, T>(
+ dest: &mut CssWriter<W>,
+ list: &[T],
+) -> fmt::Result
+where
+ W: Write,
+ T: ToCss,
{
if list.is_empty() {
return Ok(());
diff --git a/components/style/macros.rs b/components/style/macros.rs
index aa505498d3b..ac795bdb09f 100644
--- a/components/style/macros.rs
+++ b/components/style/macros.rs
@@ -91,8 +91,11 @@ macro_rules! define_numbered_css_keyword_enum {
}
}
- impl ::style_traits::values::ToCss for $name {
- fn to_css<W>(&self, dest: &mut W) -> ::std::fmt::Result
+ impl ::style_traits::ToCss for $name {
+ fn to_css<W>(
+ &self,
+ dest: &mut ::style_traits::CssWriter<W>,
+ ) -> ::std::fmt::Result
where
W: ::std::fmt::Write,
{
diff --git a/components/style/media_queries.rs b/components/style/media_queries.rs
index 42a72ba2d58..8941b21a30a 100644
--- a/components/style/media_queries.rs
+++ b/components/style/media_queries.rs
@@ -14,9 +14,9 @@ use error_reporting::{ContextualParseError, ParseErrorReporter};
use parser::{ParserContext, ParserErrorContext};
use selectors::parser::SelectorParseErrorKind;
use serialize_comma_separated_list;
-use std::fmt;
+use std::fmt::{self, Write};
use str::string_as_ascii_lowercase;
-use style_traits::{ToCss, ParseError, StyleParseErrorKind};
+use style_traits::{CssWriter, ToCss, ParseError, StyleParseErrorKind};
use values::CustomIdent;
#[cfg(feature = "servo")]
@@ -33,8 +33,9 @@ pub struct MediaList {
}
impl ToCss for MediaList {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
serialize_comma_separated_list(dest, &self.media_queries)
}
@@ -86,8 +87,9 @@ impl MediaQuery {
}
impl ToCss for MediaQuery {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
if let Some(qual) = self.qualifier {
qual.to_css(dest)?;
diff --git a/components/style/properties/declaration_block.rs b/components/style/properties/declaration_block.rs
index 48b1eb3717d..284c8230b5d 100644
--- a/components/style/properties/declaration_block.rs
+++ b/components/style/properties/declaration_block.rs
@@ -16,11 +16,11 @@ use properties::animated_properties::AnimationValue;
use shared_lock::Locked;
use smallbitvec::{self, SmallBitVec};
use smallvec::SmallVec;
-use std::fmt;
+use std::fmt::{self, Write};
use std::iter::{DoubleEndedIterator, Zip};
use std::slice::Iter;
use str::{CssString, CssStringBorrow, CssStringWriter};
-use style_traits::{ToCss, ParseError, ParsingMode, StyleParseErrorKind};
+use style_traits::{CssWriter, ParseError, ParsingMode, StyleParseErrorKind, ToCss};
use stylesheets::{CssRuleType, Origin, UrlExtraData};
use super::*;
use values::computed::Context;
@@ -664,7 +664,7 @@ impl PropertyDeclarationBlock {
css.append_to(dest)
},
Some(AppendableValue::DeclarationsForShorthand(_, decls)) => {
- shorthand.longhands_to_css(decls, dest)
+ shorthand.longhands_to_css(decls, &mut CssWriter::new(dest))
}
_ => Ok(())
}
@@ -845,7 +845,7 @@ impl PropertyDeclarationBlock {
}
#[cfg(feature = "gecko")]
(_, Some(sys)) => {
- sys.to_css(&mut v)?;
+ sys.to_css(&mut CssWriter::new(&mut v))?;
AppendableValue::Css {
css: CssStringBorrow::from(&v),
with_variables: false,
@@ -951,10 +951,12 @@ pub enum AppendableValue<'a, I>
}
/// Potentially appends whitespace after the first (property: value;) pair.
-fn handle_first_serialization<W>(dest: &mut W,
- is_first_serialization: &mut bool)
- -> fmt::Result
- where W: fmt::Write,
+fn handle_first_serialization<W>(
+ dest: &mut W,
+ is_first_serialization: &mut bool,
+) -> fmt::Result
+where
+ W: Write,
{
if !*is_first_serialization {
dest.write_str(" ")
@@ -980,7 +982,7 @@ where
decl.to_css(dest)
},
AppendableValue::DeclarationsForShorthand(shorthand, decls) => {
- shorthand.longhands_to_css(decls, dest)
+ shorthand.longhands_to_css(decls, &mut CssWriter::new(dest))
}
}
}
@@ -999,7 +1001,7 @@ where
{
handle_first_serialization(dest, is_first_serialization)?;
- property_name.to_css(dest)?;
+ property_name.to_css(&mut CssWriter::new(dest))?;
dest.write_char(':')?;
// for normal parsed values, add a space between key: and value
diff --git a/components/style/properties/helpers.mako.rs b/components/style/properties/helpers.mako.rs
index becef724657..4d7c1ff19ad 100644
--- a/components/style/properties/helpers.mako.rs
+++ b/components/style/properties/helpers.mako.rs
@@ -82,8 +82,8 @@
need_animatable=need_animatable, **kwargs)">
#[allow(unused_imports)]
use smallvec::SmallVec;
- use std::fmt;
- use style_traits::{Separator, ToCss};
+ use std::fmt::{self, Write};
+ use style_traits::{CssWriter, Separator, ToCss};
pub mod single_value {
#[allow(unused_imports)]
@@ -154,8 +154,9 @@
}
impl ToCss for computed_value::T {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
let mut iter = self.0.iter();
if let Some(val) = iter.next() {
@@ -180,8 +181,9 @@
pub struct SpecifiedValue(pub Vec<single_value::SpecifiedValue>);
impl ToCss for SpecifiedValue {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
let mut iter = self.0.iter();
if let Some(val) = iter.next() {
@@ -682,11 +684,11 @@
#[allow(unused_imports)]
use selectors::parser::SelectorParseErrorKind;
#[allow(unused_imports)]
- use std::fmt;
+ use std::fmt::{self, Write};
#[allow(unused_imports)]
use style_traits::{ParseError, StyleParseErrorKind};
#[allow(unused_imports)]
- use style_traits::ToCss;
+ use style_traits::{CssWriter, ToCss};
pub struct Longhands {
% for sub_property in shorthand.sub_properties:
@@ -806,7 +808,10 @@
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
let rect = Rect::new(
% for side in ["top", "right", "bottom", "left"]:
&self.${to_rust_ident(sub_property_pattern % side)},
diff --git a/components/style/properties/helpers/animated_properties.mako.rs b/components/style/properties/helpers/animated_properties.mako.rs
index a4581f1c31e..6a76f0a84e1 100644
--- a/components/style/properties/helpers/animated_properties.mako.rs
+++ b/components/style/properties/helpers/animated_properties.mako.rs
@@ -27,9 +27,9 @@ use selectors::parser::SelectorParseErrorKind;
use servo_arc::Arc;
use smallvec::SmallVec;
use std::cmp;
-use std::fmt;
+use std::fmt::{self, Write};
#[cfg(feature = "gecko")] use hash::FnvHashMap;
-use style_traits::{ParseError, ToCss};
+use style_traits::{CssWriter, ParseError, ToCss};
use super::ComputedValues;
use values::{CSSFloat, CustomIdent, Either};
use values::animated::{Animate, Procedure, ToAnimatedValue, ToAnimatedZero};
@@ -94,7 +94,10 @@ pub enum TransitionProperty {
}
impl ToCss for TransitionProperty {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match *self {
TransitionProperty::All => dest.write_str("all"),
TransitionProperty::Shorthand(ref id) => dest.write_str(id.name()),
diff --git a/components/style/properties/longhand/color.mako.rs b/components/style/properties/longhand/color.mako.rs
index 459352fd59c..3dfc685f082 100644
--- a/components/style/properties/longhand/color.mako.rs
+++ b/components/style/properties/longhand/color.mako.rs
@@ -66,8 +66,8 @@ pub mod system_colors {
use cssparser::Parser;
use gecko_bindings::bindings::Gecko_GetLookAndFeelSystemColor;
use gecko_bindings::structs::root::mozilla::LookAndFeel_ColorID;
- use std::fmt;
- use style_traits::ToCss;
+ use std::fmt::{self, Write};
+ use style_traits::{CssWriter, ToCss};
use values::computed::{Context, ToComputedValue};
pub type SystemColor = LookAndFeel_ColorID;
@@ -77,7 +77,10 @@ pub mod system_colors {
malloc_size_of_is_0!(SystemColor);
impl ToCss for SystemColor {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
let s = match *self {
% for color in system_colors + extra_colors:
LookAndFeel_ColorID::eColorID_${to_rust_ident(color)} => "${color}",
diff --git a/components/style/properties/longhand/counters.mako.rs b/components/style/properties/longhand/counters.mako.rs
index c65a5ba3239..d55e880dcc9 100644
--- a/components/style/properties/longhand/counters.mako.rs
+++ b/components/style/properties/longhand/counters.mako.rs
@@ -23,8 +23,8 @@
pub mod computed_value {
use cssparser;
- use std::fmt;
- use style_traits::ToCss;
+ use std::fmt::{self, Write};
+ use style_traits::{CssWriter, ToCss};
#[cfg(feature = "gecko")]
use values::specified::url::SpecifiedUrl;
@@ -62,7 +62,10 @@
}
impl ToCss for ContentItem {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match *self {
ContentItem::String(ref s) => s.to_css(dest),
ContentItem::Counter(ref s, ref counter_style) => {
@@ -106,7 +109,10 @@
}
impl ToCss for T {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match *self {
T::Normal => dest.write_str("normal"),
T::None => dest.write_str("none"),
@@ -232,8 +238,8 @@
<%helpers:longhand name="counter-increment" animation_value_type="discrete"
spec="https://drafts.csswg.org/css-lists/#propdef-counter-increment">
- use std::fmt;
- use style_traits::ToCss;
+ use std::fmt::{self, Write};
+ use style_traits::{CssWriter, ToCss};
use values::CustomIdent;
#[cfg_attr(feature = "gecko", derive(MallocSizeOf))]
@@ -241,16 +247,17 @@
pub struct SpecifiedValue(pub Vec<(CustomIdent, specified::Integer)>);
pub mod computed_value {
- use std::fmt;
- use style_traits::ToCss;
+ use std::fmt::{self, Write};
+ use style_traits::{CssWriter, ToCss};
use values::CustomIdent;
#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
pub struct T(pub Vec<(CustomIdent, i32)>);
impl ToCss for T {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
if self.0.is_empty() {
return dest.write_str("none")
@@ -292,10 +299,10 @@
computed_value::T(Vec::new())
}
-
impl ToCss for SpecifiedValue {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
if self.0.is_empty() {
return dest.write_str("none");
diff --git a/components/style/properties/longhand/inherited_text.mako.rs b/components/style/properties/longhand/inherited_text.mako.rs
index a9ae76fe9a3..c7ad330a274 100644
--- a/components/style/properties/longhand/inherited_text.mako.rs
+++ b/components/style/properties/longhand/inherited_text.mako.rs
@@ -193,8 +193,8 @@ ${helpers.predefined_type(
animation_value_type="discrete"
spec="https://drafts.csswg.org/css-text-decor/#propdef-text-emphasis-style">
use computed_values::writing_mode::T as WritingMode;
- use std::fmt;
- use style_traits::ToCss;
+ use std::fmt::{self, Write};
+ use style_traits::{CssWriter, ToCss};
use unicode_segmentation::UnicodeSegmentation;
@@ -229,7 +229,7 @@ ${helpers.predefined_type(
}
impl ToCss for KeywordValue {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
if let Some(fill) = self.fill() {
if fill {
dest.write_str("filled")?;
@@ -246,8 +246,12 @@ ${helpers.predefined_type(
Ok(())
}
}
+
impl ToCss for computed_value::KeywordValue {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
if self.fill {
dest.write_str("filled")?;
} else {
diff --git a/components/style/properties/properties.mako.rs b/components/style/properties/properties.mako.rs
index a30fa6c0e0a..806efc9edae 100644
--- a/components/style/properties/properties.mako.rs
+++ b/components/style/properties/properties.mako.rs
@@ -16,10 +16,9 @@ use custom_properties::CustomPropertiesBuilder;
use servo_arc::{Arc, UniqueArc};
use smallbitvec::SmallBitVec;
use std::borrow::Cow;
+use std::{mem, ops};
use std::cell::RefCell;
use std::fmt::{self, Write};
-use std::mem;
-use std::ops;
#[cfg(feature = "servo")] use cssparser::RGBA;
use cssparser::{CowRcStr, Parser, TokenSerializationType, serialize_identifier};
@@ -40,7 +39,7 @@ use selector_parser::PseudoElement;
use selectors::parser::SelectorParseErrorKind;
#[cfg(feature = "servo")] use servo_config::prefs::PREFS;
use shared_lock::StylesheetGuards;
-use style_traits::{ParsingMode, ToCss, ParseError, StyleParseErrorKind};
+use style_traits::{CssWriter, ParseError, ParsingMode, StyleParseErrorKind, ToCss};
use stylesheets::{CssRuleType, Origin, UrlExtraData};
#[cfg(feature = "servo")] use values::Either;
use values::generics::text::LineHeight;
@@ -855,9 +854,14 @@ impl ShorthandId {
///
/// Returns an error if writing to the stream fails, or if the declarations
/// do not map to a shorthand.
- pub fn longhands_to_css<'a, W, I>(&self, declarations: I, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
- I: Iterator<Item=&'a PropertyDeclaration>,
+ pub fn longhands_to_css<'a, W, I>(
+ &self,
+ declarations: I,
+ dest: &mut CssWriter<W>,
+ ) -> fmt::Result
+ where
+ W: Write,
+ I: Iterator<Item=&'a PropertyDeclaration>,
{
match *self {
ShorthandId::All => {
@@ -1075,8 +1079,9 @@ impl UnparsedValue {
}
impl<'a, T: ToCss> ToCss for DeclaredValue<'a, T> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
match *self {
DeclaredValue::Value(ref inner) => inner.to_css(dest),
@@ -1104,8 +1109,9 @@ pub enum PropertyDeclarationId<'a> {
}
impl<'a> ToCss for PropertyDeclarationId<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
match *self {
PropertyDeclarationId::Longhand(id) => dest.write_str(id.name()),
@@ -1150,7 +1156,6 @@ impl<'a> PropertyDeclarationId<'a> {
match *self {
PropertyDeclarationId::Longhand(id) => id.name().into(),
PropertyDeclarationId::Custom(name) => {
- use std::fmt::Write;
let mut s = String::new();
write!(&mut s, "--{}", name).unwrap();
s.into()
@@ -1177,13 +1182,14 @@ pub enum PropertyId {
impl fmt::Debug for PropertyId {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
- self.to_css(formatter)
+ self.to_css(&mut CssWriter::new(formatter))
}
}
impl ToCss for PropertyId {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
match *self {
PropertyId::Longhand(id) => dest.write_str(id.name()),
@@ -1331,7 +1337,6 @@ impl PropertyId {
PropertyId::LonghandAlias(id, _) |
PropertyId::Longhand(id) => id.name().into(),
PropertyId::Custom(ref name) => {
- use std::fmt::Write;
let mut s = String::new();
write!(&mut s, "--{}", name).unwrap();
s.into()
@@ -1464,7 +1469,7 @@ pub enum PropertyDeclaration {
impl fmt::Debug for PropertyDeclaration {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- self.id().to_css(f)?;
+ self.id().to_css(&mut CssWriter::new(f))?;
f.write_str(": ")?;
// Because PropertyDeclaration::to_css requires CssStringWriter, we can't write
@@ -1483,10 +1488,13 @@ impl PropertyDeclaration {
pub fn to_css(&self, dest: &mut CssStringWriter) -> fmt::Result {
match *self {
% for property in data.longhands:
- PropertyDeclaration::${property.camel_case}(ref value) =>
- value.to_css(dest),
+ PropertyDeclaration::${property.camel_case}(ref value) => {
+ value.to_css(&mut CssWriter::new(dest))
+ }
% endfor
- PropertyDeclaration::CSSWideKeyword(_, keyword) => keyword.to_css(dest),
+ PropertyDeclaration::CSSWideKeyword(_, keyword) => {
+ keyword.to_css(&mut CssWriter::new(dest))
+ },
PropertyDeclaration::WithVariables(_, ref with_variables) => {
// https://drafts.csswg.org/css-variables/#variables-in-shorthands
match with_variables.from_shorthand {
@@ -1500,7 +1508,9 @@ impl PropertyDeclaration {
}
Ok(())
},
- PropertyDeclaration::Custom(_, ref value) => value.borrow().to_css(dest),
+ PropertyDeclaration::Custom(_, ref value) => {
+ value.borrow().to_css(&mut CssWriter::new(dest))
+ },
}
}
}
diff --git a/components/style/properties/shorthand/background.mako.rs b/components/style/properties/shorthand/background.mako.rs
index 4fb5f2c10f4..8fd2101ecec 100644
--- a/components/style/properties/shorthand/background.mako.rs
+++ b/components/style/properties/shorthand/background.mako.rs
@@ -131,7 +131,7 @@
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
let len = self.background_image.0.len();
// There should be at least one declared value
if len == 0 {
@@ -228,7 +228,7 @@
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
let len = self.background_position_x.0.len();
if len == 0 || len != self.background_position_y.0.len() {
return Ok(());
diff --git a/components/style/properties/shorthand/border.mako.rs b/components/style/properties/shorthand/border.mako.rs
index 3d175350a90..0209ebb2376 100644
--- a/components/style/properties/shorthand/border.mako.rs
+++ b/components/style/properties/shorthand/border.mako.rs
@@ -34,7 +34,7 @@ ${helpers.four_sides_shorthand("border-style", "border-%s-style",
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
% for side in PHYSICAL_SIDES:
let ${side} = &self.border_${side}_width;
% endfor
@@ -113,7 +113,7 @@ pub fn parse_border<'i, 't>(context: &ParserContext, input: &mut Parser<'i, 't>)
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
super::serialize_directional_border(
dest,
self.border_${to_rust_ident(side)}_width,
@@ -156,7 +156,7 @@ pub fn parse_border<'i, 't>(context: &ParserContext, input: &mut Parser<'i, 't>)
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
let all_equal = {
% for side in PHYSICAL_SIDES:
let border_${side}_width = self.border_${side}_width;
@@ -215,7 +215,7 @@ pub fn parse_border<'i, 't>(context: &ParserContext, input: &mut Parser<'i, 't>)
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
let LonghandsToSerialize {
border_top_left_radius: &BorderCornerRadius(ref tl),
border_top_right_radius: &BorderCornerRadius(ref tr),
@@ -315,7 +315,7 @@ pub fn parse_border<'i, 't>(context: &ParserContext, input: &mut Parser<'i, 't>)
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
self.border_image_source.to_css(dest)?;
dest.write_str(" ")?;
self.border_image_slice.to_css(dest)?;
diff --git a/components/style/properties/shorthand/box.mako.rs b/components/style/properties/shorthand/box.mako.rs
index ca8523173f8..137599078ad 100644
--- a/components/style/properties/shorthand/box.mako.rs
+++ b/components/style/properties/shorthand/box.mako.rs
@@ -48,7 +48,7 @@
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
if self.overflow_x == self.overflow_y {
self.overflow_x.to_css(dest)
} else {
@@ -83,7 +83,7 @@
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
self.overflow_clip_box_block.to_css(dest)?;
if self.overflow_clip_box_block != self.overflow_clip_box_inline {
@@ -203,7 +203,7 @@ macro_rules! try_parse_one {
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
let property_len = self.transition_property.0.len();
// There are two cases that we can do shorthand serialization:
@@ -327,7 +327,7 @@ macro_rules! try_parse_one {
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
let len = self.animation_name.0.len();
// There should be at least one declared value
if len == 0 {
@@ -376,7 +376,7 @@ macro_rules! try_parse_one {
impl<'a> ToCss for LonghandsToSerialize<'a> {
// Serializes into the single keyword value if both scroll-snap-type-x and scroll-snap-type-y are same.
// Otherwise into an empty string. This is done to match Gecko's behaviour.
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
if self.scroll_snap_type_x == self.scroll_snap_type_y {
self.scroll_snap_type_x.to_css(dest)
} else {
@@ -406,7 +406,7 @@ macro_rules! try_parse_one {
impl<'a> ToCss for LonghandsToSerialize<'a> {
// Serializes into the single keyword value if both overscroll-behavior-x and overscroll-behavior-y are same.
// Otherwise into two values separated by a space.
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
self.overscroll_behavior_x.to_css(dest)?;
if self.overscroll_behavior_y != self.overscroll_behavior_x {
dest.write_str(" ")?;
diff --git a/components/style/properties/shorthand/font.mako.rs b/components/style/properties/shorthand/font.mako.rs
index b40505e3c86..22bbe7d71ff 100644
--- a/components/style/properties/shorthand/font.mako.rs
+++ b/components/style/properties/shorthand/font.mako.rs
@@ -151,9 +151,14 @@
}
impl<'a> LonghandsToSerialize<'a> {
- fn to_css_for<W>(&self,
- serialize_for: SerializeFor,
- dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css_for<W>(
+ &self,
+ serialize_for: SerializeFor,
+ dest: &mut CssWriter<W>,
+ ) -> fmt::Result
+ where
+ W: Write,
+ {
% if product == "gecko":
match self.check_system() {
CheckSystemResult::AllSystem(sys) => return sys.to_css(dest),
@@ -226,7 +231,7 @@
}
/// Serialize the shorthand value for canvas font attribute.
- pub fn to_css_for_canvas<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ pub fn to_css_for_canvas<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
self.to_css_for(SerializeFor::Canvas, dest)
}
% endif
@@ -234,7 +239,7 @@
// This may be a bit off, unsure, possibly needs changes
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
self.to_css_for(SerializeFor::Normal, dest)
}
}
@@ -309,7 +314,7 @@
impl<'a> ToCss for LonghandsToSerialize<'a> {
#[allow(unused_assignments)]
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
let has_none_ligatures =
% if product == "gecko":
diff --git a/components/style/properties/shorthand/inherited_svg.mako.rs b/components/style/properties/shorthand/inherited_svg.mako.rs
index 76f1c840f0e..1742ef28ed7 100644
--- a/components/style/properties/shorthand/inherited_svg.mako.rs
+++ b/components/style/properties/shorthand/inherited_svg.mako.rs
@@ -22,7 +22,7 @@
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
if self.marker_start == self.marker_mid && self.marker_mid == self.marker_end {
self.marker_start.to_css(dest)
} else {
diff --git a/components/style/properties/shorthand/mask.mako.rs b/components/style/properties/shorthand/mask.mako.rs
index 87feba23d16..483ce9b50f8 100644
--- a/components/style/properties/shorthand/mask.mako.rs
+++ b/components/style/properties/shorthand/mask.mako.rs
@@ -121,7 +121,7 @@
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
use properties::longhands::mask_origin::single_value::computed_value::T as Origin;
use properties::longhands::mask_clip::single_value::computed_value::T as Clip;
@@ -214,7 +214,7 @@
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
let len = self.mask_position_x.0.len();
if len == 0 || self.mask_position_y.0.len() != len {
return Ok(());
diff --git a/components/style/properties/shorthand/outline.mako.rs b/components/style/properties/shorthand/outline.mako.rs
index 0fe8a11118b..95d6b0be28a 100644
--- a/components/style/properties/shorthand/outline.mako.rs
+++ b/components/style/properties/shorthand/outline.mako.rs
@@ -76,7 +76,7 @@
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
use values::generics::border::BorderCornerRadius;
let LonghandsToSerialize {
diff --git a/components/style/properties/shorthand/position.mako.rs b/components/style/properties/shorthand/position.mako.rs
index 1bddeeb8b33..95a4c183e20 100644
--- a/components/style/properties/shorthand/position.mako.rs
+++ b/components/style/properties/shorthand/position.mako.rs
@@ -119,7 +119,7 @@
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
if self.grid_row_gap == self.grid_column_gap {
self.grid_row_gap.to_css(dest)
} else {
@@ -163,7 +163,7 @@
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
self.grid_${kind}_start.to_css(dest)?;
dest.write_str(" / ")?;
self.grid_${kind}_end.to_css(dest)
@@ -224,7 +224,7 @@
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
self.grid_row_start.to_css(dest)?;
let values = [&self.grid_column_start, &self.grid_row_end, &self.grid_column_end];
for value in &values {
@@ -362,10 +362,14 @@
}
/// Serialization for `<grid-template>` shorthand (also used by `grid` shorthand).
- pub fn serialize_grid_template<W>(template_rows: &GridTemplateComponent,
- template_columns: &GridTemplateComponent,
- template_areas: &Either<TemplateAreas, None_>,
- dest: &mut W) -> fmt::Result where W: fmt::Write {
+ pub fn serialize_grid_template<W>(
+ template_rows: &GridTemplateComponent,
+ template_columns: &GridTemplateComponent,
+ template_areas: &Either<TemplateAreas, None_>,
+ dest: &mut CssWriter<W>,
+ ) -> fmt::Result
+ where
+ W: Write {
match *template_areas {
Either::Second(_none) => {
template_rows.to_css(dest)?;
@@ -451,7 +455,7 @@
impl<'a> ToCss for LonghandsToSerialize<'a> {
#[inline]
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
serialize_grid_template(self.grid_template_rows, self.grid_template_columns,
self.grid_template_areas, dest)
}
@@ -542,7 +546,7 @@
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
if *self.grid_template_areas != Either::Second(None_) ||
(*self.grid_template_rows != GridTemplateComponent::None &&
*self.grid_template_columns != GridTemplateComponent::None) ||
@@ -635,7 +639,7 @@
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
self.align_content.to_css(dest)?;
if self.align_content != self.justify_content {
dest.write_str(" ")?;
@@ -670,7 +674,7 @@
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
if self.align_self == self.justify_self {
self.align_self.to_css(dest)
} else {
@@ -713,7 +717,7 @@
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
if self.align_items.0 == self.justify_items.0 {
self.align_items.to_css(dest)
} else {
diff --git a/components/style/properties/shorthand/serialize.mako.rs b/components/style/properties/shorthand/serialize.mako.rs
index a86704a5488..afcbe3c488b 100644
--- a/components/style/properties/shorthand/serialize.mako.rs
+++ b/components/style/properties/shorthand/serialize.mako.rs
@@ -2,15 +2,20 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-use style_traits::ToCss;
+use style_traits::{CssWriter, ToCss};
use values::specified::{BorderStyle, Color};
-use std::fmt;
+use std::fmt::{self, Write};
-fn serialize_directional_border<W, I,>(dest: &mut W,
- width: &I,
- style: &BorderStyle,
- color: &Color)
- -> fmt::Result where W: fmt::Write, I: ToCss {
+fn serialize_directional_border<W, I,>(
+ dest: &mut CssWriter<W>,
+ width: &I,
+ style: &BorderStyle,
+ color: &Color,
+) -> fmt::Result
+where
+ W: Write,
+ I: ToCss,
+{
width.to_css(dest)?;
dest.write_str(" ")?;
style.to_css(dest)?;
diff --git a/components/style/properties/shorthand/text.mako.rs b/components/style/properties/shorthand/text.mako.rs
index 2c21d1971bf..c53f1b8b27e 100644
--- a/components/style/properties/shorthand/text.mako.rs
+++ b/components/style/properties/shorthand/text.mako.rs
@@ -62,7 +62,7 @@
}
impl<'a> ToCss for LonghandsToSerialize<'a> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
self.text_decoration_line.to_css(dest)?;
% if product == "gecko":
diff --git a/components/style/selector_parser.rs b/components/style/selector_parser.rs
index 54978d284b7..e68aded1c9a 100644
--- a/components/style/selector_parser.rs
+++ b/components/style/selector_parser.rs
@@ -9,7 +9,7 @@
use cssparser::{Parser as CssParser, ParserInput};
use selectors::parser::SelectorList;
use std::fmt::{self, Debug, Write};
-use style_traits::{ParseError, ToCss};
+use style_traits::{CssWriter, ParseError, ToCss};
use stylesheets::{Origin, Namespaces, UrlExtraData};
/// A convenient alias for the type that represents an attribute value used for
@@ -201,7 +201,7 @@ impl Direction {
}
impl ToCss for Direction {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: Write {
let dir_str = match *self {
Direction::Rtl => "rtl",
Direction::Ltr => "ltr",
diff --git a/components/style/servo/media_queries.rs b/components/style/servo/media_queries.rs
index ea71ee84ab0..79bc288b775 100644
--- a/components/style/servo/media_queries.rs
+++ b/components/style/servo/media_queries.rs
@@ -12,9 +12,9 @@ use media_queries::MediaType;
use parser::ParserContext;
use properties::ComputedValues;
use selectors::parser::SelectorParseErrorKind;
-use std::fmt;
+use std::fmt::{self, Write};
use std::sync::atomic::{AtomicBool, AtomicIsize, Ordering};
-use style_traits::{CSSPixel, DevicePixel, ToCss, ParseError};
+use style_traits::{CSSPixel, CssWriter, DevicePixel, ToCss, ParseError};
use style_traits::viewport::ViewportConstraints;
use values::computed::{self, ToComputedValue};
use values::computed::font::FontSize;
@@ -218,8 +218,9 @@ impl Expression {
}
impl ToCss for Expression {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
let (s, l) = match self.0 {
ExpressionKind::Width(Range::Min(ref l)) => ("(min-width: ", l),
diff --git a/components/style/servo/url.rs b/components/style/servo/url.rs
index 6dc1d46d2aa..25a4aa5297d 100644
--- a/components/style/servo/url.rs
+++ b/components/style/servo/url.rs
@@ -6,12 +6,12 @@
use parser::ParserContext;
use servo_url::ServoUrl;
-use std::fmt;
+use std::fmt::{self, Write};
// Note: We use std::sync::Arc rather than servo_arc::Arc here because the
// nonzero optimization is important in keeping the size of SpecifiedUrl below
// the threshold.
use std::sync::Arc;
-use style_traits::{ToCss, ParseError};
+use style_traits::{CssWriter, ParseError, ToCss};
use values::computed::{Context, ToComputedValue, ComputedUrl};
/// A specified url() value for servo.
@@ -111,7 +111,10 @@ impl PartialEq for SpecifiedUrl {
}
impl ToCss for SpecifiedUrl {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
let string = match self.original {
Some(ref original) => &**original,
None => match self.resolved {
diff --git a/components/style/stylesheets/document_rule.rs b/components/style/stylesheets/document_rule.rs
index ea140849be3..ab8382df069 100644
--- a/components/style/stylesheets/document_rule.rs
+++ b/components/style/stylesheets/document_rule.rs
@@ -15,7 +15,7 @@ use servo_arc::Arc;
use shared_lock::{DeepCloneParams, DeepCloneWithLock, Locked, SharedRwLock, SharedRwLockReadGuard, ToCssWithGuard};
use std::fmt::{self, Write};
use str::CssStringWriter;
-use style_traits::{ToCss, ParseError, StyleParseErrorKind};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
use stylesheets::CssRules;
use values::specified::url::SpecifiedUrl;
@@ -43,7 +43,7 @@ impl DocumentRule {
impl ToCssWithGuard for DocumentRule {
fn to_css(&self, guard: &SharedRwLockReadGuard, dest: &mut CssStringWriter) -> fmt::Result {
dest.write_str("@-moz-document ")?;
- self.condition.to_css(dest)?;
+ self.condition.to_css(&mut CssWriter::new(dest))?;
dest.write_str(" {")?;
for rule in self.rules.read_with(guard).0.iter() {
dest.write_str(" ")?;
@@ -167,8 +167,10 @@ impl UrlMatchingFunction {
}
impl ToCss for UrlMatchingFunction {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match *self {
UrlMatchingFunction::Url(ref url) => {
url.to_css(dest)
@@ -219,8 +221,10 @@ impl DocumentCondition {
}
impl ToCss for DocumentCondition {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
let mut iter = self.0.iter();
let first = iter.next()
.expect("Empty DocumentCondition, should contain at least one URL matching function");
diff --git a/components/style/stylesheets/font_feature_values_rule.rs b/components/style/stylesheets/font_feature_values_rule.rs
index 18cf957d466..35ac85c7469 100644
--- a/components/style/stylesheets/font_feature_values_rule.rs
+++ b/components/style/stylesheets/font_feature_values_rule.rs
@@ -18,7 +18,7 @@ use parser::{ParserContext, ParserErrorContext, Parse};
use shared_lock::{SharedRwLockReadGuard, ToCssWithGuard};
use std::fmt::{self, Write};
use str::CssStringWriter;
-use style_traits::{ParseError, StyleParseErrorKind, ToCss};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
use stylesheets::CssRuleType;
use values::computed::font::FamilyName;
@@ -37,7 +37,10 @@ pub struct FFVDeclaration<T> {
}
impl<T: ToCss> ToCss for FFVDeclaration<T> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
serialize_identifier(&self.name.to_string(), dest)?;
dest.write_str(": ")?;
self.value.to_css(dest)?;
@@ -101,7 +104,10 @@ impl Parse for PairValues {
}
impl ToCss for PairValues {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
self.0.to_css(dest)?;
if let Some(second) = self.1 {
dest.write_char(' ')?;
@@ -153,7 +159,10 @@ impl Parse for VectorValues {
}
impl ToCss for VectorValues {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
let mut iter = self.0.iter();
let first = iter.next();
if let Some(first) = first {
@@ -280,7 +289,13 @@ macro_rules! font_feature_values_blocks {
}
/// Prints font family names.
- pub fn font_family_to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ pub fn font_family_to_css<W>(
+ &self,
+ dest: &mut CssWriter<W>,
+ ) -> fmt::Result
+ where
+ W: Write,
+ {
let mut iter = self.family_names.iter();
iter.next().unwrap().to_css(dest)?;
for val in iter {
@@ -291,7 +306,10 @@ macro_rules! font_feature_values_blocks {
}
/// Prints inside of `@font-feature-values` block.
- pub fn value_to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ pub fn value_to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
$(
if self.$ident.len() > 0 {
dest.write_str(concat!("@", $name, " {\n"))?;
@@ -344,9 +362,9 @@ macro_rules! font_feature_values_blocks {
impl ToCssWithGuard for FontFeatureValuesRule {
fn to_css(&self, _guard: &SharedRwLockReadGuard, dest: &mut CssStringWriter) -> fmt::Result {
dest.write_str("@font-feature-values ")?;
- self.font_family_to_css(dest)?;
+ self.font_family_to_css(&mut CssWriter::new(dest))?;
dest.write_str(" {\n")?;
- self.value_to_css(dest)?;
+ self.value_to_css(&mut CssWriter::new(dest))?;
dest.write_str("}")
}
}
diff --git a/components/style/stylesheets/import_rule.rs b/components/style/stylesheets/import_rule.rs
index c9fcd8d2c8a..c72800b4517 100644
--- a/components/style/stylesheets/import_rule.rs
+++ b/components/style/stylesheets/import_rule.rs
@@ -11,7 +11,7 @@ use media_queries::MediaList;
use shared_lock::{DeepCloneWithLock, DeepCloneParams, SharedRwLock, SharedRwLockReadGuard, ToCssWithGuard};
use std::fmt::{self, Write};
use str::CssStringWriter;
-use style_traits::ToCss;
+use style_traits::{CssWriter, ToCss};
use stylesheets::{StylesheetContents, StylesheetInDocument};
use values::specified::url::SpecifiedUrl;
@@ -110,12 +110,12 @@ impl DeepCloneWithLock for ImportRule {
impl ToCssWithGuard for ImportRule {
fn to_css(&self, guard: &SharedRwLockReadGuard, dest: &mut CssStringWriter) -> fmt::Result {
dest.write_str("@import ")?;
- self.url.to_css(dest)?;
+ self.url.to_css(&mut CssWriter::new(dest))?;
match self.stylesheet.media(guard) {
Some(media) if !media.is_empty() => {
dest.write_str(" ")?;
- media.to_css(dest)?;
+ media.to_css(&mut CssWriter::new(dest))?;
}
_ => {},
};
diff --git a/components/style/stylesheets/keyframes_rule.rs b/components/style/stylesheets/keyframes_rule.rs
index b7f28704b1a..fe52edd60be 100644
--- a/components/style/stylesheets/keyframes_rule.rs
+++ b/components/style/stylesheets/keyframes_rule.rs
@@ -16,7 +16,7 @@ use servo_arc::Arc;
use shared_lock::{DeepCloneParams, DeepCloneWithLock, SharedRwLock, SharedRwLockReadGuard, Locked, ToCssWithGuard};
use std::fmt::{self, Write};
use str::CssStringWriter;
-use style_traits::{ParsingMode, ToCss, ParseError, StyleParseErrorKind};
+use style_traits::{CssWriter, ParseError, ParsingMode, StyleParseErrorKind, ToCss};
use stylesheets::{CssRuleType, StylesheetContents};
use stylesheets::rule_parser::VendorPrefix;
use values::{KeyframesName, serialize_percentage};
@@ -40,7 +40,7 @@ impl ToCssWithGuard for KeyframesRule {
// Serialization of KeyframesRule is not specced.
fn to_css(&self, guard: &SharedRwLockReadGuard, dest: &mut CssStringWriter) -> fmt::Result {
dest.write_str("@keyframes ")?;
- self.name.to_css(dest)?;
+ self.name.to_css(&mut CssWriter::new(dest))?;
dest.write_str(" {")?;
let iter = self.keyframes.iter();
for lock in iter {
@@ -109,7 +109,10 @@ impl ::std::cmp::Ord for KeyframePercentage {
impl ::std::cmp::Eq for KeyframePercentage { }
impl ToCss for KeyframePercentage {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
serialize_percentage(self.0, dest)
}
}
@@ -146,7 +149,10 @@ impl KeyframePercentage {
pub struct KeyframeSelector(Vec<KeyframePercentage>);
impl ToCss for KeyframeSelector {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
let mut iter = self.0.iter();
iter.next().unwrap().to_css(dest)?;
for percentage in iter {
@@ -194,7 +200,7 @@ pub struct Keyframe {
impl ToCssWithGuard for Keyframe {
fn to_css(&self, guard: &SharedRwLockReadGuard, dest: &mut CssStringWriter) -> fmt::Result {
- self.selector.to_css(dest)?;
+ self.selector.to_css(&mut CssWriter::new(dest))?;
dest.write_str(" { ")?;
self.block.read_with(guard).to_css(dest)?;
dest.write_str(" }")?;
diff --git a/components/style/stylesheets/media_rule.rs b/components/style/stylesheets/media_rule.rs
index d9c8e72ffb9..20aa4329693 100644
--- a/components/style/stylesheets/media_rule.rs
+++ b/components/style/stylesheets/media_rule.rs
@@ -14,7 +14,7 @@ use servo_arc::Arc;
use shared_lock::{DeepCloneParams, DeepCloneWithLock, Locked, SharedRwLock, SharedRwLockReadGuard, ToCssWithGuard};
use std::fmt::{self, Write};
use str::CssStringWriter;
-use style_traits::ToCss;
+use style_traits::{CssWriter, ToCss};
use stylesheets::CssRules;
/// An [`@media`][media] urle.
@@ -45,7 +45,7 @@ impl ToCssWithGuard for MediaRule {
// https://drafts.csswg.org/cssom/#serialize-a-css-rule CSSMediaRule
fn to_css(&self, guard: &SharedRwLockReadGuard, dest: &mut CssStringWriter) -> fmt::Result {
dest.write_str("@media ")?;
- self.media_queries.read_with(guard).to_css(dest)?;
+ self.media_queries.read_with(guard).to_css(&mut CssWriter::new(dest))?;
self.rules.read_with(guard).to_css_block(guard, dest)
}
}
diff --git a/components/style/stylesheets/supports_rule.rs b/components/style/stylesheets/supports_rule.rs
index 641fc5f5603..3780c18ede1 100644
--- a/components/style/stylesheets/supports_rule.rs
+++ b/components/style/stylesheets/supports_rule.rs
@@ -18,7 +18,7 @@ use std::ffi::{CStr, CString};
use std::fmt::{self, Write};
use std::str;
use str::CssStringWriter;
-use style_traits::{ToCss, ParseError};
+use style_traits::{CssWriter, ParseError, ToCss};
use stylesheets::{CssRuleType, CssRules};
/// An [`@supports`][supports] rule.
@@ -49,7 +49,7 @@ impl SupportsRule {
impl ToCssWithGuard for SupportsRule {
fn to_css(&self, guard: &SharedRwLockReadGuard, dest: &mut CssStringWriter) -> fmt::Result {
dest.write_str("@supports ")?;
- self.condition.to_css(dest)?;
+ self.condition.to_css(&mut CssWriter::new(dest))?;
self.rules.read_with(guard).to_css_block(guard, dest)
}
}
@@ -219,8 +219,9 @@ pub fn parse_condition_or_declaration<'i, 't>(input: &mut Parser<'i, 't>)
}
impl ToCss for SupportsCondition {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
match *self {
SupportsCondition::Not(ref cond) => {
@@ -276,7 +277,10 @@ impl ToCss for SupportsCondition {
pub struct Declaration(pub String);
impl ToCss for Declaration {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
dest.write_str(&self.0)
}
}
diff --git a/components/style/stylesheets/viewport_rule.rs b/components/style/stylesheets/viewport_rule.rs
index 1b8b9fd2f8b..e50d9f1720b 100644
--- a/components/style/stylesheets/viewport_rule.rs
+++ b/components/style/stylesheets/viewport_rule.rs
@@ -27,7 +27,7 @@ use std::fmt::{self, Write};
use std::iter::Enumerate;
use std::str::Chars;
use str::CssStringWriter;
-use style_traits::{PinchZoomFactor, ToCss, ParseError, StyleParseErrorKind};
+use style_traits::{CssWriter, ParseError, PinchZoomFactor, StyleParseErrorKind, ToCss};
use style_traits::viewport::{Orientation, UserZoom, ViewportConstraints, Zoom};
use stylesheets::{StylesheetInDocument, Origin};
use values::computed::{Context, ToComputedValue};
@@ -101,7 +101,10 @@ macro_rules! declare_viewport_descriptor_inner {
}
impl ToCss for ViewportDescriptor {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match *self {
$(
ViewportDescriptor::$assigned_variant(ref val) => {
@@ -149,8 +152,9 @@ pub enum ViewportLength {
}
impl ToCss for ViewportLength {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
match *self {
ViewportLength::Specified(ref length) => length.to_css(dest),
@@ -255,7 +259,10 @@ impl ViewportDescriptorDeclaration {
}
impl ToCss for ViewportDescriptorDeclaration {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
self.descriptor.to_css(dest)?;
if self.important {
dest.write_str(" !important")?;
@@ -524,10 +531,10 @@ impl ToCssWithGuard for ViewportRule {
fn to_css(&self, _guard: &SharedRwLockReadGuard, dest: &mut CssStringWriter) -> fmt::Result {
dest.write_str("@viewport { ")?;
let mut iter = self.declarations.iter();
- iter.next().unwrap().to_css(dest)?;
+ iter.next().unwrap().to_css(&mut CssWriter::new(dest))?;
for declaration in iter {
dest.write_str(" ")?;
- declaration.to_css(dest)?;
+ declaration.to_css(&mut CssWriter::new(dest))?;
}
dest.write_str(" }")
}
diff --git a/components/style/values/computed/align.rs b/components/style/values/computed/align.rs
index f3caade67a5..85f8f70cb25 100644
--- a/components/style/values/computed/align.rs
+++ b/components/style/values/computed/align.rs
@@ -7,7 +7,7 @@
//! https://drafts.csswg.org/css-align/
use std::fmt;
-use style_traits::ToCss;
+use style_traits::{CssWriter, ToCss};
use values::computed::{Context, ToComputedValue};
use values::specified;
@@ -26,7 +26,7 @@ pub struct JustifyItems {
}
impl ToCss for JustifyItems {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where W: fmt::Write,
{
self.computed.to_css(dest)
diff --git a/components/style/values/computed/background.rs b/components/style/values/computed/background.rs
index e71f208c984..7b7f7c4991b 100644
--- a/components/style/values/computed/background.rs
+++ b/components/style/values/computed/background.rs
@@ -6,8 +6,8 @@
use properties::animated_properties::RepeatableListAnimatable;
use properties::longhands::background_size::computed_value::T as BackgroundSizeList;
-use std::fmt;
-use style_traits::ToCss;
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ToCss};
use values::animated::{ToAnimatedValue, ToAnimatedZero};
use values::computed::{Context, ToComputedValue};
use values::computed::length::LengthOrPercentageOrAuto;
@@ -96,9 +96,9 @@ impl BackgroundRepeat {
}
impl ToCss for BackgroundRepeat {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where
- W: fmt::Write,
+ W: Write,
{
match (self.0, self.1) {
(RepeatKeyword::Repeat, RepeatKeyword::NoRepeat) => dest.write_str("repeat-x"),
diff --git a/components/style/values/computed/basic_shape.rs b/components/style/values/computed/basic_shape.rs
index 20dcffec9c6..17c39741c81 100644
--- a/components/style/values/computed/basic_shape.rs
+++ b/components/style/values/computed/basic_shape.rs
@@ -7,8 +7,8 @@
//!
//! [basic-shape]: https://drafts.csswg.org/css-shapes/#typedef-basic-shape
-use std::fmt;
-use style_traits::ToCss;
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ToCss};
use values::computed::{LengthOrPercentage, ComputedUrl, Image};
use values::generics::basic_shape::{BasicShape as GenericBasicShape};
use values::generics::basic_shape::{Circle as GenericCircle, ClippingShape as GenericClippingShape};
@@ -37,7 +37,10 @@ pub type Ellipse = GenericEllipse<LengthOrPercentage, LengthOrPercentage, Length
pub type ShapeRadius = GenericShapeRadius<LengthOrPercentage>;
impl ToCss for Circle {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
dest.write_str("circle(")?;
self.radius.to_css(dest)?;
dest.write_str(" at ")?;
@@ -47,7 +50,10 @@ impl ToCss for Circle {
}
impl ToCss for Ellipse {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
dest.write_str("ellipse(")?;
if (self.semiaxis_x, self.semiaxis_y) != Default::default() {
self.semiaxis_x.to_css(dest)?;
diff --git a/components/style/values/computed/color.rs b/components/style/values/computed/color.rs
index 6327e734626..314c4bed266 100644
--- a/components/style/values/computed/color.rs
+++ b/components/style/values/computed/color.rs
@@ -6,7 +6,7 @@
use cssparser::{Color as CSSParserColor, RGBA};
use std::fmt;
-use style_traits::ToCss;
+use style_traits::{CssWriter, ToCss};
use values::animated::ToAnimatedValue;
use values::animated::color::{Color as AnimatedColor, RGBA as AnimatedRGBA};
@@ -138,7 +138,7 @@ impl From<RGBA> for Color {
}
impl ToCss for Color {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
if self.is_numeric() {
self.color.to_css(dest)
} else if self.is_currentcolor() {
diff --git a/components/style/values/computed/font.rs b/components/style/values/computed/font.rs
index 407be16c203..20a41154ec9 100644
--- a/components/style/values/computed/font.rs
+++ b/components/style/values/computed/font.rs
@@ -19,7 +19,7 @@ use std::fmt::{self, Write};
use std::hash::{Hash, Hasher};
#[cfg(feature = "servo")]
use std::slice;
-use style_traits::{ToCss, ParseError};
+use style_traits::{CssWriter, ParseError, ToCss};
use values::CSSFloat;
use values::animated::{ToAnimatedValue, ToAnimatedZero};
use values::computed::{Context, NonNegativeLength, ToComputedValue};
@@ -201,7 +201,7 @@ impl FontSize {
}
impl ToCss for FontSize {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
self.size.to_css(dest)
}
}
@@ -257,7 +257,7 @@ impl MallocSizeOf for FontFamily {
}
impl ToCss for FontFamily {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
let mut iter = self.0.iter();
iter.next().unwrap().to_css(dest)?;
for family in iter {
@@ -279,7 +279,7 @@ pub struct FamilyName {
}
impl ToCss for FamilyName {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
match self.syntax {
FamilyNameSyntax::Quoted => {
dest.write_char('"')?;
@@ -488,7 +488,7 @@ impl SingleFontFamily {
}
impl ToCss for SingleFontFamily {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
match *self {
SingleFontFamily::FamilyName(ref name) => name.to_css(dest),
@@ -731,7 +731,7 @@ impl FontLanguageOverride {
}
impl ToCss for FontLanguageOverride {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
use std::str;
if self.0 == 0 {
diff --git a/components/style/values/computed/image.rs b/components/style/values/computed/image.rs
index 8972774aa77..93fa627a41d 100644
--- a/components/style/values/computed/image.rs
+++ b/components/style/values/computed/image.rs
@@ -9,8 +9,8 @@
use cssparser::RGBA;
use std::f32::consts::PI;
-use std::fmt;
-use style_traits::ToCss;
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ToCss};
use values::{Either, None_};
use values::computed::{Angle, ComputedUrl, Context, Length, LengthOrPercentage, NumberOrPercentage, ToComputedValue};
#[cfg(feature = "gecko")]
@@ -99,8 +99,13 @@ impl GenericLineDirection for LineDirection {
}
}
- fn to_css<W>(&self, dest: &mut W, compat_mode: CompatMode) -> fmt::Result
- where W: fmt::Write
+ fn to_css<W>(
+ &self,
+ dest: &mut CssWriter<W>,
+ compat_mode: CompatMode,
+ ) -> fmt::Result
+ where
+ W: Write,
{
match *self {
LineDirection::Angle(ref angle) => angle.to_css(dest),
diff --git a/components/style/values/computed/inherited_box.rs b/components/style/values/computed/inherited_box.rs
index 2fa4dd819a5..f6fe6ad7bf9 100644
--- a/components/style/values/computed/inherited_box.rs
+++ b/components/style/values/computed/inherited_box.rs
@@ -4,8 +4,8 @@
//! Computed values for inherited box
-use std::fmt;
-use style_traits::ToCss;
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ToCss};
use values::specified::Angle;
/// An angle rounded and normalized per https://drafts.csswg.org/css-images/#propdef-image-orientation
@@ -31,7 +31,10 @@ impl Orientation {
}
impl ToCss for Orientation {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
// Should agree with Angle::to_css.
match *self {
Orientation::Angle0 => dest.write_str("0deg"),
@@ -60,7 +63,10 @@ impl ImageOrientation {
}
impl ToCss for ImageOrientation {
- fn to_css<W: fmt::Write>(&self, dest: &mut W) -> fmt::Result {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match *self {
ImageOrientation::FromImage => dest.write_str("from-image"),
ImageOrientation::AngleWithFlipped(angle, flipped) => {
diff --git a/components/style/values/computed/length.rs b/components/style/values/computed/length.rs
index a0a92c713c2..49db7201a39 100644
--- a/components/style/values/computed/length.rs
+++ b/components/style/values/computed/length.rs
@@ -6,9 +6,9 @@
use app_units::Au;
use ordered_float::NotNaN;
-use std::fmt;
+use std::fmt::{self, Write};
use std::ops::{Add, Neg};
-use style_traits::ToCss;
+use style_traits::{CssWriter, ToCss};
use style_traits::values::specified::AllowedNumericType;
use super::{Number, ToComputedValue, Context, Percentage};
use values::{Auto, CSSFloat, Either, ExtremumLength, None_, Normal, specified};
@@ -203,7 +203,10 @@ impl From<LengthOrPercentageOrNone> for Option<CalcLengthOrPercentage> {
}
impl ToCss for CalcLengthOrPercentage {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
use num_traits::Zero;
let (length, percentage) = match (self.length, self.percentage) {
@@ -738,7 +741,10 @@ impl CSSPixelLength {
impl ToCss for CSSPixelLength {
#[inline]
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
self.0.to_css(dest)?;
dest.write_str("px")
}
diff --git a/components/style/values/computed/mod.rs b/components/style/values/computed/mod.rs
index 20bcefc655b..a559f4fbe87 100644
--- a/components/style/values/computed/mod.rs
+++ b/components/style/values/computed/mod.rs
@@ -15,11 +15,12 @@ use properties::{ComputedValues, LonghandId, StyleBuilder};
use rule_cache::RuleCacheConditions;
#[cfg(feature = "servo")]
use servo_url::ServoUrl;
-use std::{f32, fmt};
use std::cell::RefCell;
+use std::f32;
+use std::fmt::{self, Write};
#[cfg(feature = "servo")]
use std::sync::Arc;
-use style_traits::ToCss;
+use style_traits::{CssWriter, ToCss};
use style_traits::cursor::CursorKind;
use super::{CSSFloat, CSSInteger};
use super::generics::{GreaterThanOrEqualToOne, NonNegative};
@@ -531,7 +532,10 @@ pub struct ClipRect {
}
impl ToCss for ClipRect {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
dest.write_str("rect(")?;
if let Some(top) = self.top {
top.to_css(dest)?;
@@ -627,7 +631,10 @@ impl ComputedUrl {
#[cfg(feature = "servo")]
impl ToCss for ComputedUrl {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
let string = match *self {
ComputedUrl::Valid(ref url) => url.as_str(),
ComputedUrl::Invalid(ref invalid_string) => invalid_string,
diff --git a/components/style/values/computed/percentage.rs b/components/style/values/computed/percentage.rs
index 1bc28a13488..842019f03c8 100644
--- a/components/style/values/computed/percentage.rs
+++ b/components/style/values/computed/percentage.rs
@@ -5,7 +5,7 @@
//! Computed percentages.
use std::fmt;
-use style_traits::ToCss;
+use style_traits::{CssWriter, ToCss};
use values::{CSSFloat, serialize_percentage};
/// A computed percentage.
@@ -35,7 +35,7 @@ impl Percentage {
}
impl ToCss for Percentage {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where
W: fmt::Write,
{
diff --git a/components/style/values/computed/pointing.rs b/components/style/values/computed/pointing.rs
index 9b108dbcfc2..b14f22dec9c 100644
--- a/components/style/values/computed/pointing.rs
+++ b/components/style/values/computed/pointing.rs
@@ -10,10 +10,10 @@ use cssparser::Parser;
use parser::{Parse, ParserContext};
use selectors::parser::SelectorParseErrorKind;
#[cfg(feature = "gecko")]
-use std::fmt;
-use style_traits::ParseError;
+use std::fmt::{self, Write};
#[cfg(feature = "gecko")]
-use style_traits::ToCss;
+use style_traits::{CssWriter, ToCss};
+use style_traits::ParseError;
use style_traits::cursor::CursorKind;
/// The computed value for the `cursor` property.
@@ -80,8 +80,9 @@ impl Parse for Cursor {
#[cfg(feature = "gecko")]
impl ToCss for Cursor {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
for url in &*self.images {
url.to_css(dest)?;
@@ -123,8 +124,9 @@ impl CursorImage {
#[cfg(feature = "gecko")]
impl ToCss for CursorImage {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
self.url.to_css(dest)?;
if let Some((x, y)) = self.hotspot {
diff --git a/components/style/values/computed/position.rs b/components/style/values/computed/position.rs
index ed6a308151f..abd3522382d 100644
--- a/components/style/values/computed/position.rs
+++ b/components/style/values/computed/position.rs
@@ -7,8 +7,8 @@
//!
//! [position]: https://drafts.csswg.org/css-backgrounds-3/#position
-use std::fmt;
-use style_traits::ToCss;
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ToCss};
use values::computed::{LengthOrPercentage, Percentage};
use values::generics::position::Position as GenericPosition;
pub use values::specified::position::{GridAutoFlow, GridTemplateAreas};
@@ -40,7 +40,10 @@ impl Position {
}
impl ToCss for Position {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
self.horizontal.to_css(dest)?;
dest.write_str(" ")?;
self.vertical.to_css(dest)
diff --git a/components/style/values/computed/text.rs b/components/style/values/computed/text.rs
index 27c198a46a5..123f735d513 100644
--- a/components/style/values/computed/text.rs
+++ b/components/style/values/computed/text.rs
@@ -6,8 +6,8 @@
#[cfg(feature = "servo")]
use properties::StyleBuilder;
-use std::fmt;
-use style_traits::ToCss;
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ToCss};
use values::{CSSInteger, CSSFloat};
use values::animated::ToAnimatedZero;
use values::computed::{NonNegativeLength, NonNegativeNumber};
@@ -66,7 +66,10 @@ impl TextOverflow {
}
impl ToCss for TextOverflow {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
if self.sides_are_logical {
debug_assert!(self.first == TextOverflowSide::Clip);
self.second.to_css(dest)?;
@@ -80,7 +83,10 @@ impl ToCss for TextOverflow {
}
impl ToCss for TextDecorationLine {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
let mut has_any = false;
macro_rules! write_value {
diff --git a/components/style/values/computed/time.rs b/components/style/values/computed/time.rs
index a90a0935a8e..cef128af4a8 100644
--- a/components/style/values/computed/time.rs
+++ b/components/style/values/computed/time.rs
@@ -4,8 +4,8 @@
//! Computed time values.
-use std::fmt;
-use style_traits::ToCss;
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ToCss};
use values::CSSFloat;
/// A computed `<time>` value.
@@ -36,9 +36,9 @@ impl Time {
}
impl ToCss for Time {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where
- W: fmt::Write,
+ W: Write,
{
self.seconds().to_css(dest)?;
dest.write_str("s")
diff --git a/components/style/values/generics/basic_shape.rs b/components/style/values/generics/basic_shape.rs
index a2f0eb08971..07881a3a103 100644
--- a/components/style/values/generics/basic_shape.rs
+++ b/components/style/values/generics/basic_shape.rs
@@ -5,8 +5,8 @@
//! CSS handling for the [`basic-shape`](https://drafts.csswg.org/css-shapes/#typedef-basic-shape)
//! types that are generic over their `ToCss` implementations.
-use std::fmt;
-use style_traits::ToCss;
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ToCss};
use values::animated::{Animate, Procedure, ToAnimatedZero};
use values::distance::{ComputeSquaredDistance, SquaredDistance};
use values::generics::border::BorderRadius;
@@ -152,7 +152,10 @@ impl<B, T, U> ToAnimatedZero for ShapeSource<B, T, U> {
impl<L> ToCss for InsetRect<L>
where L: ToCss + PartialEq
{
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
dest.write_str("inset(")?;
self.rect.to_css(dest)?;
if let Some(ref radius) = self.round {
@@ -210,7 +213,10 @@ where
}
impl<L: ToCss> ToCss for Polygon<L> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
dest.write_str("polygon(")?;
if self.fill != FillRule::default() {
self.fill.to_css(dest)?;
diff --git a/components/style/values/generics/border.rs b/components/style/values/generics/border.rs
index 9237d060ef0..00cfe33ab62 100644
--- a/components/style/values/generics/border.rs
+++ b/components/style/values/generics/border.rs
@@ -4,8 +4,8 @@
//! Generic types for CSS values related to borders.
-use std::fmt;
-use style_traits::ToCss;
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ToCss};
use values::generics::rect::Rect;
use values::generics::size::Size;
@@ -84,8 +84,9 @@ impl<N> From<N> for BorderImageSlice<N>
impl<N> ToCss for BorderImageSlice<N>
where N: PartialEq + ToCss,
{
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
self.offsets.to_css(dest)?;
if self.fill {
@@ -118,8 +119,13 @@ impl<L> BorderRadius<L>
{
/// Serialises two given rects following the syntax of the `border-radius``
/// property.
- pub fn serialize_rects<W>(widths: Rect<&L>, heights: Rect<&L>, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ pub fn serialize_rects<W>(
+ widths: Rect<&L>,
+ heights: Rect<&L>,
+ dest: &mut CssWriter<W>,
+ ) -> fmt::Result
+ where
+ W: Write,
{
widths.to_css(dest)?;
if widths.0 != heights.0 || widths.1 != heights.1 || widths.2 != heights.2 || widths.3 != heights.3 {
@@ -133,7 +139,10 @@ impl<L> BorderRadius<L>
impl<L> ToCss for BorderRadius<L>
where L: PartialEq + ToCss
{
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
let BorderRadius {
top_left: BorderCornerRadius(ref tl),
top_right: BorderCornerRadius(ref tr),
diff --git a/components/style/values/generics/counters.rs b/components/style/values/generics/counters.rs
index c6ea4425a39..127f94ac45d 100644
--- a/components/style/values/generics/counters.rs
+++ b/components/style/values/generics/counters.rs
@@ -5,7 +5,7 @@
//! Generic types for counters-related CSS values.
use std::fmt;
-use style_traits::ToCss;
+use style_traits::{CssWriter, ToCss};
use values::CustomIdent;
/// A generic value for the `counter-increment` property.
@@ -27,7 +27,7 @@ where
I: ToCss,
{
#[inline]
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where
W: fmt::Write,
{
diff --git a/components/style/values/generics/effects.rs b/components/style/values/generics/effects.rs
index ff77556d253..b4fcbb0c505 100644
--- a/components/style/values/generics/effects.rs
+++ b/components/style/values/generics/effects.rs
@@ -4,8 +4,8 @@
//! Generic types for CSS values related to effects.
-use std::fmt;
-use style_traits::values::{SequenceWriter, ToCss};
+use std::fmt::{self, Write};
+use style_traits::values::{CssWriter, SequenceWriter, ToCss};
#[cfg(feature = "gecko")]
use values::specified::url::SpecifiedUrl;
@@ -88,9 +88,9 @@ where
BlurShapeLength: ToCss,
ShapeLength: ToCss,
{
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where
- W: fmt::Write,
+ W: Write,
{
{
let mut writer = SequenceWriter::new(&mut *dest, " ");
diff --git a/components/style/values/generics/grid.rs b/components/style/values/generics/grid.rs
index 95e1f1d500e..dab8b0f3e9d 100644
--- a/components/style/values/generics/grid.rs
+++ b/components/style/values/generics/grid.rs
@@ -7,8 +7,9 @@
use cssparser::Parser;
use parser::{Parse, ParserContext};
-use std::{fmt, mem, usize};
-use style_traits::{ToCss, ParseError, StyleParseErrorKind};
+use std::{mem, usize};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
use values::{CSSFloat, CustomIdent};
use values::computed::{Context, ToComputedValue};
use values::specified;
@@ -49,7 +50,10 @@ impl<Integer> ToCss for GridLine<Integer>
where
Integer: ToCss,
{
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
if self.is_auto() {
return dest.write_str("auto")
}
@@ -230,7 +234,10 @@ impl<L: PartialEq> TrackSize<L> {
}
impl<L: ToCss> ToCss for TrackSize<L> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match *self {
TrackSize::Breadth(ref breadth) => breadth.to_css(dest),
TrackSize::Minmax(ref min, ref max) => {
@@ -315,10 +322,10 @@ pub fn concat_serialize_idents<W>(
suffix: &str,
slice: &[CustomIdent],
sep: &str,
- dest: &mut W,
+ dest: &mut CssWriter<W>,
) -> fmt::Result
where
- W: fmt::Write
+ W: Write,
{
if let Some((ref first, rest)) = slice.split_first() {
dest.write_str(prefix)?;
@@ -385,7 +392,10 @@ pub struct TrackRepeat<L, I> {
}
impl<L: ToCss, I: ToCss> ToCss for TrackRepeat<L, I> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
dest.write_str("repeat(")?;
self.count.to_css(dest)?;
dest.write_str(", ")?;
@@ -503,7 +513,10 @@ pub struct TrackList<LengthOrPercentage, Integer> {
}
impl<L: ToCss, I: ToCss> ToCss for TrackList<L, I> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
let auto_idx = match self.list_type {
TrackListType::Auto(i) => i as usize,
_ => usize::MAX,
@@ -614,7 +627,10 @@ impl Parse for LineNameList {
}
impl ToCss for LineNameList {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
dest.write_str("subgrid")?;
let fill_idx = self.fill_idx.map(|v| v as usize).unwrap_or(usize::MAX);
for (i, names) in self.names.iter().enumerate() {
diff --git a/components/style/values/generics/image.rs b/components/style/values/generics/image.rs
index 6d97e280a3b..d74c05ae81d 100644
--- a/components/style/values/generics/image.rs
+++ b/components/style/values/generics/image.rs
@@ -10,8 +10,8 @@ use Atom;
use cssparser::serialize_identifier;
use custom_properties;
use servo_arc::Arc;
-use std::fmt;
-use style_traits::ToCss;
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ToCss};
/// An [image].
///
@@ -143,7 +143,10 @@ pub struct PaintWorklet {
trivial_to_computed_value!(PaintWorklet);
impl ToCss for PaintWorklet {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
dest.write_str("paint(")?;
serialize_identifier(&*self.name.to_string(), dest)?;
for argument in &self.arguments {
@@ -169,17 +172,23 @@ pub struct MozImageRect<NumberOrPercentage, MozImageRectUrl> {
}
impl<G, R, U> fmt::Debug for Image<G, R, U>
- where G: fmt::Debug, R: fmt::Debug, U: fmt::Debug + ToCss
+where
+ G: ToCss,
+ R: ToCss,
+ U: ToCss,
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- self.to_css(f)
+ self.to_css(&mut CssWriter::new(f))
}
}
impl<G, R, U> ToCss for Image<G, R, U>
where G: ToCss, R: ToCss, U: ToCss
{
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match *self {
Image::Url(ref url) => url.to_css(dest),
Image::Gradient(ref gradient) => gradient.to_css(dest),
@@ -198,7 +207,10 @@ impl<G, R, U> ToCss for Image<G, R, U>
impl<D, L, LoP, P, C, A> ToCss for Gradient<D, L, LoP, P, C, A>
where D: LineDirection, L: ToCss, LoP: ToCss, P: ToCss, C: ToCss, A: ToCss
{
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match self.compat_mode {
CompatMode::WebKit => dest.write_str("-webkit-")?,
CompatMode::Moz => dest.write_str("-moz-")?,
@@ -272,17 +284,17 @@ pub trait LineDirection {
fn points_downwards(&self, compat_mode: CompatMode) -> bool;
/// Serialises this direction according to the compatibility mode.
- fn to_css<W>(&self, dest: &mut W, compat_mode: CompatMode) -> fmt::Result
- where W: fmt::Write;
+ fn to_css<W>(&self, dest: &mut CssWriter<W>, compat_mode: CompatMode) -> fmt::Result
+ where W: Write;
}
impl<L> ToCss for Circle<L>
where
L: ToCss,
{
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where
- W: fmt::Write,
+ W: Write,
{
match *self {
Circle::Extent(ShapeExtent::FarthestCorner) |
diff --git a/components/style/values/generics/mod.rs b/components/style/values/generics/mod.rs
index c2a20081c98..263db6890d2 100644
--- a/components/style/values/generics/mod.rs
+++ b/components/style/values/generics/mod.rs
@@ -8,8 +8,9 @@
use counter_style::{Symbols, parse_counter_style_name};
use cssparser::Parser;
use parser::{Parse, ParserContext};
-use std::fmt;
-use style_traits::{Comma, OneOrMoreSeparated, ParseError, StyleParseErrorKind, ToCss};
+use std::fmt::{self, Write};
+use style_traits::{Comma, CssWriter, OneOrMoreSeparated, ParseError};
+use style_traits::{StyleParseErrorKind, ToCss};
use super::CustomIdent;
pub mod background;
@@ -144,7 +145,10 @@ impl<T> OneOrMoreSeparated for FontSettingTag<T> {
}
impl<T: ToCss> ToCss for FontSettingTag<T> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
use byteorder::{BigEndian, ByteOrder};
use std::str;
@@ -231,7 +235,10 @@ pub struct FontSettingTagInt(pub u32);
pub struct FontSettingTagFloat(pub f32);
impl ToCss for FontSettingTagInt {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match self.0 {
1 => Ok(()),
0 => dest.write_str(" off"),
@@ -273,7 +280,10 @@ impl Parse for FontSettingTagFloat {
}
impl ToCss for FontSettingTagFloat {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
dest.write_str(" ")?;
self.0.to_css(dest)
}
diff --git a/components/style/values/generics/rect.rs b/components/style/values/generics/rect.rs
index fd72fa5b805..028ca5b231e 100644
--- a/components/style/values/generics/rect.rs
+++ b/components/style/values/generics/rect.rs
@@ -6,8 +6,8 @@
use cssparser::Parser;
use parser::{Parse, ParserContext};
-use std::fmt;
-use style_traits::{ToCss, ParseError};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, ToCss};
/// A CSS value made of four components, where its `ToCss` impl will try to
/// serialize as few components as possible, like for example in `border-width`.
@@ -68,8 +68,9 @@ impl<T> Parse for Rect<T>
impl<T> ToCss for Rect<T>
where T: PartialEq + ToCss
{
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
self.0.to_css(dest)?;
let same_vertical = self.0 == self.2;
diff --git a/components/style/values/generics/size.rs b/components/style/values/generics/size.rs
index ed5b7a516f7..f8c691a9a23 100644
--- a/components/style/values/generics/size.rs
+++ b/components/style/values/generics/size.rs
@@ -7,8 +7,8 @@
use cssparser::Parser;
use euclid::Size2D;
use parser::ParserContext;
-use std::fmt;
-use style_traits::{ToCss, ParseError};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, ToCss};
use values::animated::ToAnimatedValue;
/// A generic size, for `border-*-radius` longhand properties, or
@@ -56,9 +56,9 @@ impl<L> ToCss for Size<L>
where L:
ToCss + PartialEq,
{
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W:
- fmt::Write
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
self.0.width.to_css(dest)?;
diff --git a/components/style/values/generics/svg.rs b/components/style/values/generics/svg.rs
index 0d0a60d61ce..f1c8278ee6e 100644
--- a/components/style/values/generics/svg.rs
+++ b/components/style/values/generics/svg.rs
@@ -6,8 +6,8 @@
use cssparser::Parser;
use parser::{Parse, ParserContext};
-use std::fmt;
-use style_traits::{ParseError, StyleParseErrorKind, ToCss};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
use values::{Either, None_};
use values::computed::NumberOrPercentage;
use values::computed::length::LengthOrPercentage;
@@ -209,7 +209,10 @@ pub enum SVGStrokeDashArray<LengthType> {
}
impl<LengthType> ToCss for SVGStrokeDashArray<LengthType> where LengthType: ToCss {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match self {
&SVGStrokeDashArray::Values(ref values) => {
let mut iter = values.iter();
diff --git a/components/style/values/generics/transform.rs b/components/style/values/generics/transform.rs
index 06ec91c25a5..c74cbc8d459 100644
--- a/components/style/values/generics/transform.rs
+++ b/components/style/values/generics/transform.rs
@@ -7,8 +7,8 @@
use app_units::Au;
use euclid::{self, Rect, Transform3D};
use num_traits::Zero;
-use std::fmt;
-use style_traits::ToCss;
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ToCss};
use values::{computed, CSSFloat};
use values::computed::length::Length as ComputedLength;
use values::computed::length::LengthOrPercentage as ComputedLengthOrPercentage;
@@ -136,9 +136,9 @@ where
Integer: ToCss,
Number: ToCss,
{
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where
- W: fmt::Write,
+ W: Write,
{
match *self {
TimingFunction::Keyword(keyword) => keyword.to_css(dest),
@@ -546,7 +546,10 @@ impl<Angle: ToCss + Copy, Number: ToCss + Copy, Length: ToCss,
Integer: ToCss + Copy, LengthOrNumber: ToCss, LengthOrPercentage: ToCss, LoPoNumber: ToCss>
ToCss for
TransformOperation<Angle, Number, Length, Integer, LengthOrNumber, LengthOrPercentage, LoPoNumber> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match *self {
TransformOperation::Matrix(ref m) => m.to_css(dest),
TransformOperation::PrefixedMatrix(ref m) => m.to_css(dest),
@@ -653,9 +656,9 @@ impl<Angle: ToCss + Copy, Number: ToCss + Copy, Length: ToCss,
}
impl<T: ToCss> ToCss for Transform<T> {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where
- W: fmt::Write,
+ W: Write,
{
if self.0.is_empty() {
return dest.write_str("none");
diff --git a/components/style/values/mod.rs b/components/style/values/mod.rs
index 1507f4fe3e1..601b5edc5ac 100644
--- a/components/style/values/mod.rs
+++ b/components/style/values/mod.rs
@@ -13,9 +13,9 @@ pub use cssparser::{RGBA, Token, Parser, serialize_identifier, CowRcStr, SourceL
use parser::{Parse, ParserContext};
use selectors::parser::SelectorParseErrorKind;
#[allow(unused_imports)] use std::ascii::AsciiExt;
-use std::fmt::{self, Debug};
+use std::fmt::{self, Debug, Write};
use std::hash;
-use style_traits::{ToCss, ParseError, StyleParseErrorKind};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
pub mod animated;
pub mod computed;
@@ -34,8 +34,9 @@ define_keyword_type!(Auto, "auto");
define_keyword_type!(Normal, "normal");
/// Serialize a normalized value into percentage.
-pub fn serialize_percentage<W>(value: CSSFloat, dest: &mut W)
- -> fmt::Result where W: fmt::Write
+pub fn serialize_percentage<W>(value: CSSFloat, dest: &mut CssWriter<W>) -> fmt::Result
+where
+ W: Write,
{
(value * 100.).to_css(dest)?;
dest.write_str("%")
@@ -109,7 +110,10 @@ impl CustomIdent {
}
impl ToCss for CustomIdent {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
serialize_identifier(&self.0.to_string(), dest)
}
}
@@ -180,7 +184,10 @@ impl Parse for KeyframesName {
}
impl ToCss for KeyframesName {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match *self {
KeyframesName::Ident(ref ident) => ident.to_css(dest),
KeyframesName::QuotedString(ref atom) => atom.to_string().to_css(dest),
diff --git a/components/style/values/specified/align.rs b/components/style/values/specified/align.rs
index ac2f7719d31..a0900d4dc33 100644
--- a/components/style/values/specified/align.rs
+++ b/components/style/values/specified/align.rs
@@ -11,8 +11,8 @@ use gecko_bindings::structs;
use parser::{Parse, ParserContext};
use selectors::parser::SelectorParseErrorKind;
#[allow(unused_imports)] use std::ascii::AsciiExt;
-use std::fmt;
-use style_traits::{ToCss, ParseError, StyleParseErrorKind};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
bitflags! {
/// Constants shared by multiple CSS Box Alignment properties
@@ -71,7 +71,10 @@ bitflags! {
}
impl ToCss for AlignFlags {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
let s = match *self & !AlignFlags::FLAG_BITS {
AlignFlags::AUTO => "auto",
AlignFlags::NORMAL => "normal",
@@ -209,7 +212,10 @@ impl AlignJustifyContent {
}
impl ToCss for AlignJustifyContent {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
self.primary().to_css(dest)?;
match self.fallback() {
AlignFlags::AUTO => {}
diff --git a/components/style/values/specified/angle.rs b/components/style/values/specified/angle.rs
index b776a69db3c..667f70b7869 100644
--- a/components/style/values/specified/angle.rs
+++ b/components/style/values/specified/angle.rs
@@ -7,8 +7,8 @@
use cssparser::{Parser, Token};
use parser::{ParserContext, Parse};
#[allow(unused_imports)] use std::ascii::AsciiExt;
-use std::fmt;
-use style_traits::{ToCss, ParseError};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, ToCss};
use values::CSSFloat;
use values::computed::{Context, ToComputedValue};
use values::computed::angle::Angle as ComputedAngle;
@@ -27,7 +27,10 @@ pub struct Angle {
}
impl ToCss for Angle {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
if self.was_calc {
dest.write_str("calc(")?;
}
diff --git a/components/style/values/specified/basic_shape.rs b/components/style/values/specified/basic_shape.rs
index e6d612c7ee7..c0fe8a16e6d 100644
--- a/components/style/values/specified/basic_shape.rs
+++ b/components/style/values/specified/basic_shape.rs
@@ -10,8 +10,8 @@
use cssparser::Parser;
use parser::{Parse, ParserContext};
use std::borrow::Cow;
-use std::fmt;
-use style_traits::{ToCss, ParseError, StyleParseErrorKind};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
use values::computed::Percentage;
use values::generics::basic_shape::{Circle as GenericCircle};
use values::generics::basic_shape::{ClippingShape as GenericClippingShape, Ellipse as GenericEllipse};
@@ -171,7 +171,10 @@ impl Circle {
}
impl ToCss for Circle {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
dest.write_str("circle(")?;
if GenericShapeRadius::ClosestSide != self.radius {
self.radius.to_css(dest)?;
@@ -213,7 +216,10 @@ impl Ellipse {
}
impl ToCss for Ellipse {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
dest.write_str("ellipse(")?;
if self.semiaxis_x != ShapeRadius::default() || self.semiaxis_y != ShapeRadius::default() {
self.semiaxis_x.to_css(dest)?;
@@ -248,8 +254,12 @@ impl Parse for ShapeRadius {
/// are converted to percentages where possible. Only the two or four
/// value forms are used. In case of two keyword-percentage pairs,
/// the keywords are folded into the percentages
-fn serialize_basicshape_position<W>(position: &Position, dest: &mut W) -> fmt::Result
- where W: fmt::Write
+fn serialize_basicshape_position<W>(
+ position: &Position,
+ dest: &mut CssWriter<W>,
+) -> fmt::Result
+where
+ W: Write,
{
fn to_keyword_and_lop<S>(component: &PositionComponent<S>) -> (S, Cow<LengthOrPercentage>)
where S: Copy + Side
@@ -289,8 +299,11 @@ fn serialize_basicshape_position<W>(position: &Position, dest: &mut W) -> fmt::R
}
}
- fn write_pair<A, B, W>(a: &A, b: &B, dest: &mut W) -> fmt::Result
- where A: ToCss, B: ToCss, W: fmt::Write
+ fn write_pair<A, B, W>(a: &A, b: &B, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ A: ToCss,
+ B: ToCss,
+ W: Write,
{
a.to_css(dest)?;
dest.write_str(" ")?;
diff --git a/components/style/values/specified/box.rs b/components/style/values/specified/box.rs
index 8f046887fe4..54bb1385695 100644
--- a/components/style/values/specified/box.rs
+++ b/components/style/values/specified/box.rs
@@ -8,8 +8,8 @@ use Atom;
use cssparser::Parser;
use parser::{Parse, ParserContext};
use selectors::parser::SelectorParseErrorKind;
-use std::fmt;
-use style_traits::{ParseError, ToCss, StyleParseErrorKind};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
use values::CustomIdent;
use values::KeyframesName;
use values::generics::box_::AnimationIterationCount as GenericAnimationIterationCount;
@@ -289,9 +289,9 @@ impl AnimationName {
}
impl ToCss for AnimationName {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where
- W: fmt::Write,
+ W: Write,
{
match self.0 {
Some(ref name) => name.to_css(dest),
@@ -407,7 +407,10 @@ impl TouchAction {
}
impl ToCss for TouchAction {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match *self {
TouchAction::TOUCH_ACTION_NONE => dest.write_str("none"),
TouchAction::TOUCH_ACTION_AUTO => dest.write_str("auto"),
@@ -497,7 +500,10 @@ bitflags! {
}
impl ToCss for Contain {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
if self.is_empty() {
return dest.write_str("none")
}
diff --git a/components/style/values/specified/calc.rs b/components/style/values/specified/calc.rs
index 4b70f800018..afab32f50cf 100644
--- a/components/style/values/specified/calc.rs
+++ b/components/style/values/specified/calc.rs
@@ -9,8 +9,8 @@
use cssparser::{Parser, Token, NumberOrPercentage, AngleOrNumber};
use parser::ParserContext;
#[allow(unused_imports)] use std::ascii::AsciiExt;
-use std::fmt;
-use style_traits::{ToCss, ParseError, StyleParseErrorKind};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
use style_traits::values::specified::AllowedNumericType;
use values::{CSSInteger, CSSFloat};
use values::computed;
@@ -89,7 +89,10 @@ impl ToCss for CalcLengthOrPercentage {
///
/// FIXME(emilio): Should this simplify away zeros?
#[allow(unused_assignments)]
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
use num_traits::Zero;
let mut first_value = true;
diff --git a/components/style/values/specified/color.rs b/components/style/values/specified/color.rs
index 87ab21a3c67..a22a183cf49 100644
--- a/components/style/values/specified/color.rs
+++ b/components/style/values/specified/color.rs
@@ -12,9 +12,9 @@ use itoa;
use parser::{ParserContext, Parse};
#[cfg(feature = "gecko")]
use properties::longhands::system_colors::SystemColor;
-use std::fmt;
-use std::io::Write;
-use style_traits::{ToCss, ParseError, StyleParseErrorKind, ValueParseErrorKind};
+use std::fmt::{self, Write};
+use std::io::Write as IoWrite;
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss, ValueParseErrorKind};
use super::AllowQuirks;
use values::computed::{Color as ComputedColor, Context, ToComputedValue};
use values::specified::calc::CalcNode;
@@ -187,7 +187,10 @@ impl Parse for Color {
}
impl ToCss for Color {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match *self {
Color::CurrentColor => CSSParserColor::CurrentColor.to_css(dest),
Color::Numeric { authored: Some(ref authored), .. } => dest.write_str(authored),
diff --git a/components/style/values/specified/font.rs b/components/style/values/specified/font.rs
index 9ecd11ea599..4905bed33b4 100644
--- a/components/style/values/specified/font.rs
+++ b/components/style/values/specified/font.rs
@@ -16,8 +16,8 @@ use parser::{Parse, ParserContext};
use properties::longhands::system_font::SystemFont;
#[allow(unused_imports)]
use std::ascii::AsciiExt;
-use std::fmt;
-use style_traits::{ToCss, StyleParseErrorKind, ParseError};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
use values::CustomIdent;
use values::computed::{font as computed, Context, Length, NonNegativeLength, ToComputedValue};
use values::computed::font::{SingleFontFamily, FontFamilyList, FamilyName};
@@ -144,7 +144,10 @@ pub enum FontSize {
}
impl ToCss for FontSize {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match *self {
FontSize::Length(ref lop) => lop.to_css(dest),
FontSize::Keyword(info) => info.kw.to_css(dest),
@@ -243,7 +246,10 @@ impl MallocSizeOf for FontFamily {
}
impl ToCss for FontFamily {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match *self {
FontFamily::Values(ref v) => {
let mut iter = v.iter();
@@ -408,7 +414,10 @@ impl Default for KeywordSize {
}
impl ToCss for KeywordSize {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
dest.write_str(match *self {
KeywordSize::XXSmall => "xx-small",
KeywordSize::XSmall => "x-small",
@@ -824,7 +833,10 @@ impl VariantAlternatesList {
}
impl ToCss for VariantAlternatesList {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
if self.0.is_empty() {
return dest.write_str("normal");
}
@@ -1031,7 +1043,10 @@ impl VariantEastAsian {
}
impl ToCss for VariantEastAsian {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
if self.is_empty() {
return dest.write_str("normal")
}
@@ -1265,7 +1280,10 @@ impl VariantLigatures {
}
impl ToCss for VariantLigatures {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
if self.is_empty() {
return dest.write_str("normal")
}
@@ -1506,7 +1524,10 @@ impl VariantNumeric {
}
impl ToCss for VariantNumeric {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
if self.is_empty() {
return dest.write_str("normal")
}
@@ -1801,7 +1822,10 @@ impl Parse for FontSynthesis {
}
impl ToCss for FontSynthesis {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
if self.weight && self.style {
dest.write_str("weight style")
} else if self.style {
@@ -1953,7 +1977,10 @@ impl Parse for XTextZoom {
}
impl ToCss for XTextZoom {
- fn to_css<W>(&self, _: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, _: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
Ok(())
}
}
@@ -1981,7 +2008,10 @@ impl Parse for XLang {
}
impl ToCss for XLang {
- fn to_css<W>(&self, _: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, _: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
Ok(())
}
}
diff --git a/components/style/values/specified/image.rs b/components/style/values/specified/image.rs
index 188b3239a7e..001e8c09976 100644
--- a/components/style/values/specified/image.rs
+++ b/components/style/values/specified/image.rs
@@ -16,8 +16,8 @@ use selectors::parser::SelectorParseErrorKind;
use servo_url::ServoUrl;
use std::cmp::Ordering;
use std::f32::consts::PI;
-use std::fmt;
-use style_traits::{ToCss, ParseError, StyleParseErrorKind};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
use values::{Either, None_};
#[cfg(feature = "gecko")]
use values::computed::{Context, Position as ComputedPosition, ToComputedValue};
@@ -659,8 +659,13 @@ impl GenericsLineDirection for LineDirection {
}
}
- fn to_css<W>(&self, dest: &mut W, compat_mode: CompatMode) -> fmt::Result
- where W: fmt::Write
+ fn to_css<W>(
+ &self,
+ dest: &mut CssWriter<W>,
+ compat_mode: CompatMode,
+ ) -> fmt::Result
+ where
+ W: Write,
{
match *self {
LineDirection::Angle(angle) => {
diff --git a/components/style/values/specified/inherited_box.rs b/components/style/values/specified/inherited_box.rs
index 6d483c35fb2..85cdb8e18a2 100644
--- a/components/style/values/specified/inherited_box.rs
+++ b/components/style/values/specified/inherited_box.rs
@@ -7,8 +7,8 @@
use cssparser::Parser;
use parser::{Parse, ParserContext};
use std::f64::consts::PI;
-use std::fmt;
-use style_traits::{ParseError, StyleParseErrorKind, ToCss};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
use values::computed;
use values::computed::{Context, Orientation, ToComputedValue};
use values::specified::Angle;
@@ -25,7 +25,10 @@ pub struct ImageOrientation {
}
impl ToCss for ImageOrientation {
- fn to_css<W: fmt::Write>(&self, dest: &mut W) -> fmt::Result {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
if let Some(angle) = self.angle {
angle.to_css(dest)?;
if self.flipped {
diff --git a/components/style/values/specified/list.rs b/components/style/values/specified/list.rs
index 0472f9a36f4..9acba5ca1e5 100644
--- a/components/style/values/specified/list.rs
+++ b/components/style/values/specified/list.rs
@@ -6,8 +6,8 @@
use cssparser::{Parser, Token};
use parser::{Parse, ParserContext};
-use std::fmt;
-use style_traits::{ParseError, StyleParseErrorKind, ToCss};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
use values::{Either, None_};
#[cfg(feature = "gecko")]
use values::CustomIdent;
@@ -114,7 +114,10 @@ impl Parse for ListStyleImage {
pub struct Quotes(pub Box<[(Box<str>, Box<str>)]>);
impl ToCss for Quotes {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
let mut iter = self.0.iter();
match iter.next() {
diff --git a/components/style/values/specified/mod.rs b/components/style/values/specified/mod.rs
index c8bd26f1490..4a0ae8f9cbf 100644
--- a/components/style/values/specified/mod.rs
+++ b/components/style/values/specified/mod.rs
@@ -13,8 +13,8 @@ use parser::{ParserContext, Parse};
use self::url::SpecifiedUrl;
#[allow(unused_imports)] use std::ascii::AsciiExt;
use std::f32;
-use std::fmt;
-use style_traits::{ToCss, ParseError, StyleParseErrorKind};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
use style_traits::values::specified::AllowedNumericType;
use super::{Auto, CSSFloat, CSSInteger, Either, None_};
use super::computed::{Context, ToComputedValue};
@@ -250,8 +250,9 @@ impl ToComputedValue for Number {
}
impl ToCss for Number {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
if self.calc_clamping_mode.is_some() {
dest.write_str("calc(")?;
@@ -476,8 +477,9 @@ impl ToComputedValue for Integer {
}
impl ToCss for Integer {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
if self.was_calc {
dest.write_str("calc(")?;
@@ -560,7 +562,10 @@ pub struct ClipRect {
impl ToCss for ClipRect {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
dest.write_str("rect(")?;
if let Some(ref top) = self.top {
@@ -805,7 +810,10 @@ impl Attr {
}
impl ToCss for Attr {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
dest.write_str("attr(")?;
if let Some(ref ns) = self.namespace {
serialize_identifier(&ns.0.to_string(), dest)?;
diff --git a/components/style/values/specified/percentage.rs b/components/style/values/specified/percentage.rs
index 7d06d56ab6e..ec1e3093a89 100644
--- a/components/style/values/specified/percentage.rs
+++ b/components/style/values/specified/percentage.rs
@@ -7,8 +7,8 @@
use cssparser::{Parser, Token};
use parser::{Parse, ParserContext};
#[allow(unused_imports)] use std::ascii::AsciiExt;
-use std::fmt;
-use style_traits::{ParseError, ToCss};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, ToCss};
use style_traits::values::specified::AllowedNumericType;
use values::{CSSFloat, serialize_percentage};
use values::computed::{Context, ToComputedValue};
@@ -29,8 +29,9 @@ pub struct Percentage {
impl ToCss for Percentage {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write,
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
if self.calc_clamping_mode.is_some() {
dest.write_str("calc(")?;
diff --git a/components/style/values/specified/position.rs b/components/style/values/specified/position.rs
index 0a0a42b837f..e20dafed010 100644
--- a/components/style/values/specified/position.rs
+++ b/components/style/values/specified/position.rs
@@ -11,10 +11,10 @@ use cssparser::Parser;
use hash::FnvHashMap;
use parser::{Parse, ParserContext};
use selectors::parser::SelectorParseErrorKind;
-use std::fmt;
+use std::fmt::{self, Write};
use std::ops::Range;
use str::HTML_SPACE_CHARACTERS;
-use style_traits::{ToCss, StyleParseErrorKind, ParseError};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
use values::{Either, None_};
use values::computed::{CalcLengthOrPercentage, LengthOrPercentage as ComputedLengthOrPercentage};
use values::computed::{Context, Percentage, ToComputedValue};
@@ -142,7 +142,10 @@ impl Position {
}
impl ToCss for Position {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match (&self.horizontal, &self.vertical) {
(x_pos @ &PositionComponent::Side(_, Some(_)), &PositionComponent::Length(ref y_lop)) => {
x_pos.to_css(dest)?;
@@ -369,7 +372,10 @@ impl LegacyPosition {
}
impl ToCss for LegacyPosition {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
self.horizontal.to_css(dest)?;
dest.write_str(" ")?;
self.vertical.to_css(dest)
@@ -409,7 +415,10 @@ impl GridAutoFlow {
}
impl ToCss for GridAutoFlow {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
self.autoflow.to_css(dest)?;
if self.dense { dest.write_str(" dense")?; }
@@ -584,7 +593,10 @@ impl TemplateAreas {
}
impl ToCss for TemplateAreas {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
for (i, string) in self.strings.iter().enumerate() {
if i != 0 {
dest.write_str(" ")?;
diff --git a/components/style/values/specified/svg.rs b/components/style/values/specified/svg.rs
index b8fa6409a03..f5f89cfc4d7 100644
--- a/components/style/values/specified/svg.rs
+++ b/components/style/values/specified/svg.rs
@@ -6,8 +6,9 @@
use cssparser::Parser;
use parser::{Parse, ParserContext};
-use std::fmt;
-use style_traits::{CommaWithSpace, ParseError, Separator, StyleParseErrorKind, ToCss};
+use std::fmt::{self, Write};
+use style_traits::{CommaWithSpace, CssWriter, ParseError, Separator};
+use style_traits::{StyleParseErrorKind, ToCss};
use values::CustomIdent;
use values::generics::svg as generic;
use values::specified::{LengthOrPercentage, NonNegativeLengthOrPercentage, NonNegativeNumber};
@@ -237,7 +238,10 @@ impl Parse for SVGPaintOrder {
}
impl ToCss for SVGPaintOrder {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
if self.0 == 0 {
return dest.write_str("normal")
}
diff --git a/components/style/values/specified/table.rs b/components/style/values/specified/table.rs
index a86fe0167fd..89f9941633d 100644
--- a/components/style/values/specified/table.rs
+++ b/components/style/values/specified/table.rs
@@ -7,7 +7,7 @@
use cssparser::Parser;
use parser::{Parse, ParserContext};
use std::fmt;
-use style_traits::{ToCss, StyleParseErrorKind, ParseError};
+use style_traits::{CssWriter, ToCss, StyleParseErrorKind, ParseError};
#[derive(Clone, Copy, Debug, MallocSizeOf, PartialEq, ToComputedValue)]
/// span. for `<col span>` pres attr
@@ -21,7 +21,7 @@ impl Parse for XSpan {
}
impl ToCss for XSpan {
- fn to_css<W>(&self, _: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, _: &mut CssWriter<W>) -> fmt::Result where W: fmt::Write {
Ok(())
}
}
diff --git a/components/style/values/specified/text.rs b/components/style/values/specified/text.rs
index d9e05b50057..5db55dd7668 100644
--- a/components/style/values/specified/text.rs
+++ b/components/style/values/specified/text.rs
@@ -8,8 +8,8 @@ use cssparser::{Parser, Token};
use parser::{Parse, ParserContext};
use selectors::parser::SelectorParseErrorKind;
#[allow(unused_imports)] use std::ascii::AsciiExt;
-use std::fmt;
-use style_traits::{ParseError, StyleParseErrorKind, ToCss};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
use values::computed::{Context, ToComputedValue};
use values::computed::text::LineHeight as ComputedLineHeight;
use values::computed::text::TextOverflow as ComputedTextOverflow;
@@ -440,7 +440,10 @@ impl Parse for TextAlign {
}
impl ToCss for TextAlign {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
match *self {
TextAlign::Keyword(key) => key.to_css(dest),
#[cfg(feature = "gecko")]
diff --git a/components/style/values/specified/time.rs b/components/style/values/specified/time.rs
index bfc57d518dd..d91787b7ab2 100644
--- a/components/style/values/specified/time.rs
+++ b/components/style/values/specified/time.rs
@@ -7,8 +7,8 @@
use cssparser::{Parser, Token};
use parser::{ParserContext, Parse};
#[allow(unused_imports)] use std::ascii::AsciiExt;
-use std::fmt;
-use style_traits::{ToCss, ParseError, StyleParseErrorKind};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
use style_traits::values::specified::AllowedNumericType;
use values::CSSFloat;
use values::computed::{Context, ToComputedValue};
@@ -133,9 +133,9 @@ impl Parse for Time {
}
impl ToCss for Time {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where
- W: fmt::Write,
+ W: Write,
{
if self.was_calc {
dest.write_str("calc(")?;
diff --git a/components/style/values/specified/ui.rs b/components/style/values/specified/ui.rs
index 5d9321a5833..2d9d83d5cc3 100644
--- a/components/style/values/specified/ui.rs
+++ b/components/style/values/specified/ui.rs
@@ -6,8 +6,8 @@
use cssparser::Parser;
use parser::{Parse, ParserContext};
-use std::fmt;
-use style_traits::{ParseError, StyleParseErrorKind, ToCss};
+use std::fmt::{self, Write};
+use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
/// Specified value of `-moz-force-broken-image-icon`
#[derive(Clone, Copy, Debug, MallocSizeOf, PartialEq, ToComputedValue)]
@@ -36,7 +36,10 @@ impl Parse for MozForceBrokenImageIcon {
}
impl ToCss for MozForceBrokenImageIcon {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
dest.write_str(if self.0 { "1" } else { "0" })
}
}
diff --git a/components/style_derive/to_css.rs b/components/style_derive/to_css.rs
index 12fad8f0d34..db56ca3b644 100644
--- a/components/style_derive/to_css.rs
+++ b/components/style_derive/to_css.rs
@@ -48,7 +48,7 @@ pub fn derive(input: DeriveInput) -> Tokens {
}
quote! {{
- let mut writer = ::style_traits::values::SequenceWriter::new(&mut *dest, #separator);
+ let mut writer = ::style_traits::values::SequenceWriter::new(dest, #separator);
#expr
Ok(())
}}
@@ -78,7 +78,10 @@ pub fn derive(input: DeriveInput) -> Tokens {
impl #impl_generics ::style_traits::ToCss for #name #ty_generics #where_clause {
#[allow(unused_variables)]
#[inline]
- fn to_css<W>(&self, dest: &mut W) -> ::std::fmt::Result
+ fn to_css<W>(
+ &self,
+ dest: &mut ::style_traits::CssWriter<W>,
+ ) -> ::std::fmt::Result
where
W: ::std::fmt::Write
{
@@ -93,7 +96,10 @@ pub fn derive(input: DeriveInput) -> Tokens {
impls.append(quote! {
impl #impl_generics ::std::fmt::Debug for #name #ty_generics #where_clause {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
- ::style_traits::ToCss::to_css(self, f)
+ ::style_traits::ToCss::to_css(
+ self,
+ &mut ::style_traits::CssWriter::new(f),
+ )
}
}
});
diff --git a/components/style_traits/cursor.rs b/components/style_traits/cursor.rs
index ca40c4aed79..3ffd2814382 100644
--- a/components/style_traits/cursor.rs
+++ b/components/style_traits/cursor.rs
@@ -4,7 +4,7 @@
//! A list of common mouse cursors per CSS3-UI § 8.1.1.
-use super::ToCss;
+use super::{CssWriter, ToCss};
macro_rules! define_cursor {
(
@@ -46,10 +46,14 @@ macro_rules! define_cursor {
}
impl ToCss for CursorKind {
- fn to_css<W>(&self, dest: &mut W) -> ::std::fmt::Result where W: ::std::fmt::Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> ::std::fmt::Result where W: ::std::fmt::Write {
match *self {
- $( CursorKind::$c_variant => dest.write_str($c_css), )+
- $( #[cfg(feature = "gecko")] CursorKind::$g_variant => dest.write_str($g_css), )+
+ $(CursorKind::$c_variant => {
+ ::std::fmt::Write::write_str(dest, $c_css)
+ })+
+ $(#[cfg(feature = "gecko")] CursorKind::$g_variant => {
+ ::std::fmt::Write::write_str(dest, $g_css)
+ })+
}
}
}
diff --git a/components/style_traits/lib.rs b/components/style_traits/lib.rs
index e0f1993c5a8..3988d2fa446 100644
--- a/components/style_traits/lib.rs
+++ b/components/style_traits/lib.rs
@@ -78,7 +78,7 @@ pub mod values;
#[macro_use]
pub mod viewport;
-pub use values::{Comma, CommaWithSpace, OneOrMoreSeparated, Separator, Space, ToCss};
+pub use values::{Comma, CommaWithSpace, CssWriter, OneOrMoreSeparated, Separator, Space, ToCss};
/// The error type for all CSS parsing routines.
pub type ParseError<'i> = cssparser::ParseError<'i, StyleParseErrorKind<'i>>;
diff --git a/components/style_traits/values.rs b/components/style_traits/values.rs
index 3e951548e6c..56574ac161d 100644
--- a/components/style_traits/values.rs
+++ b/components/style_traits/values.rs
@@ -34,7 +34,7 @@ use std::fmt::{self, Write};
/// implement `Debug` by a single call to `ToCss::to_css`.
pub trait ToCss {
/// Serialize `self` in CSS syntax, writing to `dest`.
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: Write;
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: Write;
/// Serialize `self` in CSS syntax and return a string.
///
@@ -42,27 +42,27 @@ pub trait ToCss {
#[inline]
fn to_css_string(&self) -> String {
let mut s = String::new();
- self.to_css(&mut s).unwrap();
+ self.to_css(&mut CssWriter::new(&mut s)).unwrap();
s
}
}
impl<'a, T> ToCss for &'a T where T: ToCss + ?Sized {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: Write {
(*self).to_css(dest)
}
}
impl ToCss for str {
#[inline]
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: Write {
serialize_string(self, dest)
}
}
impl ToCss for String {
#[inline]
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: Write {
serialize_string(self, dest)
}
}
@@ -72,11 +72,62 @@ where
T: ToCss,
{
#[inline]
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: Write {
self.as_ref().map_or(Ok(()), |value| value.to_css(dest))
}
}
+/// A writer tailored for serialising CSS.
+///
+/// Coupled with SequenceWriter, this allows callers to transparently handle
+/// things like comma-separated values etc.
+pub struct CssWriter<'w, W: 'w> {
+ inner: &'w mut W,
+ prefix: Option<&'static str>,
+}
+
+impl<'w, W> CssWriter<'w, W>
+where
+ W: Write,
+{
+ /// Creates a new `CssWriter`.
+ #[inline]
+ pub fn new(inner: &'w mut W) -> Self {
+ Self { inner, prefix: Some("") }
+ }
+}
+
+impl<'w, W> Write for CssWriter<'w, W>
+where
+ W: Write,
+{
+ #[inline]
+ fn write_str(&mut self, s: &str) -> fmt::Result {
+ if s.is_empty() {
+ return Ok(());
+ }
+ if let Some(prefix) = self.prefix.take() {
+ // We are going to write things, but first we need to write
+ // the prefix that was set by `SequenceWriter::item`.
+ if !prefix.is_empty() {
+ self.inner.write_str(prefix)?;
+ }
+ }
+ self.inner.write_str(s)
+ }
+
+ #[inline]
+ fn write_char(&mut self, c: char) -> fmt::Result {
+ if let Some(prefix) = self.prefix.take() {
+ // See comment in `write_str`.
+ if !prefix.is_empty() {
+ self.inner.write_str(prefix)?;
+ }
+ }
+ self.inner.write_char(c)
+ }
+}
+
#[macro_export]
macro_rules! serialize_function {
($dest: expr, $name: ident($( $arg: expr, )+)) => {
@@ -96,22 +147,23 @@ macro_rules! serialize_function {
}
/// Convenience wrapper to serialise CSS values separated by a given string.
-pub struct SequenceWriter<'a, W> {
- writer: TrackedWriter<W>,
- separator: &'a str,
+pub struct SequenceWriter<'a, 'b: 'a, W: 'b> {
+ inner: &'a mut CssWriter<'b, W>,
+ separator: &'static str,
}
-impl<'a, W> SequenceWriter<'a, W>
+impl<'a, 'b, W> SequenceWriter<'a, 'b, W>
where
- W: Write,
+ W: Write + 'b,
{
/// Create a new sequence writer.
#[inline]
- pub fn new(writer: W, separator: &'a str) -> Self {
- SequenceWriter {
- writer: TrackedWriter::new(writer),
- separator: separator,
+ pub fn new(inner: &'a mut CssWriter<'b, W>, separator: &'static str) -> Self {
+ if inner.prefix.is_none() {
+ // See comment in `item`.
+ inner.prefix = Some("");
}
+ Self { inner, separator }
}
/// Serialises a CSS value, writing any separator as necessary.
@@ -125,89 +177,34 @@ where
where
T: ToCss,
{
- if self.writer.has_written {
- item.to_css(&mut PrefixedWriter::new(&mut self.writer, self.separator))
- } else {
- item.to_css(&mut self.writer)
- }
- }
-}
-
-struct TrackedWriter<W> {
- writer: W,
- has_written: bool,
-}
-
-impl<W> TrackedWriter<W>
-where
- W: Write,
-{
- #[inline]
- fn new(writer: W) -> Self {
- TrackedWriter {
- writer: writer,
- has_written: false,
+ let old_prefix = self.inner.prefix;
+ if old_prefix.is_none() {
+ // If there is no prefix in the inner writer, a previous
+ // call to this method produced output, which means we need
+ // to write the separator next time we produce output again.
+ self.inner.prefix = Some(self.separator);
}
- }
-}
-
-impl<W> Write for TrackedWriter<W>
-where
- W: Write,
-{
- #[inline]
- fn write_str(&mut self, s: &str) -> fmt::Result {
- if !s.is_empty() {
- self.has_written = true;
- }
- self.writer.write_str(s)
- }
-
- #[inline]
- fn write_char(&mut self, c: char) -> fmt::Result {
- self.has_written = true;
- self.writer.write_char(c)
- }
-}
-
-struct PrefixedWriter<'a, W> {
- writer: W,
- prefix: Option<&'a str>,
-}
-
-impl<'a, W> PrefixedWriter<'a, W>
-where
- W: Write,
-{
- #[inline]
- fn new(writer: W, prefix: &'a str) -> Self {
- PrefixedWriter {
- writer: writer,
- prefix: Some(prefix),
- }
- }
-}
-
-impl<'a, W> Write for PrefixedWriter<'a, W>
-where
- W: Write,
-{
- #[inline]
- fn write_str(&mut self, s: &str) -> fmt::Result {
- if !s.is_empty() {
- if let Some(prefix) = self.prefix.take() {
- self.writer.write_str(prefix)?;
+ item.to_css(&mut self.inner)?;
+ match (old_prefix, self.inner.prefix) {
+ (_, None) => {
+ // This call produced output and cleaned up after itself.
+ }
+ (None, Some(p)) => {
+ // Some previous call to `item` produced output,
+ // but this one did not, prefix should be the same as
+ // the one we set.
+ debug_assert_eq!(self.separator, p);
+ // We clean up here even though it's not necessary just
+ // to be able to do all these assertion checks.
+ self.inner.prefix = None;
+ }
+ (Some(old), Some(new)) => {
+ // No previous call to `item` produced output, and this one
+ // either.
+ debug_assert_eq!(old, new);
}
}
- self.writer.write_str(s)
- }
-
- #[inline]
- fn write_char(&mut self, c: char) -> fmt::Result {
- if let Some(prefix) = self.prefix.take() {
- self.writer.write_str(prefix)?;
- }
- self.writer.write_char(c)
+ Ok(())
}
}
@@ -332,7 +329,7 @@ impl OneOrMoreSeparated for UnicodeRange {
}
impl<T> ToCss for Vec<T> where T: ToCss + OneOrMoreSeparated {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: Write {
let mut iter = self.iter();
iter.next().unwrap().to_css(dest)?;
for item in iter {
@@ -344,7 +341,7 @@ impl<T> ToCss for Vec<T> where T: ToCss + OneOrMoreSeparated {
}
impl<T> ToCss for Box<T> where T: ?Sized + ToCss {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where W: Write,
{
(**self).to_css(dest)
@@ -352,7 +349,7 @@ impl<T> ToCss for Box<T> where T: ?Sized + ToCss {
}
impl<T> ToCss for Arc<T> where T: ?Sized + ToCss {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where W: Write,
{
(**self).to_css(dest)
@@ -360,7 +357,7 @@ impl<T> ToCss for Arc<T> where T: ?Sized + ToCss {
}
impl ToCss for Au {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: Write {
self.to_f64_px().to_css(dest)?;
dest.write_str("px")
}
@@ -369,7 +366,7 @@ impl ToCss for Au {
macro_rules! impl_to_css_for_predefined_type {
($name: ty) => {
impl<'a> ToCss for $name {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: Write {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result where W: Write {
::cssparser::ToCss::to_css(self, dest)
}
}
@@ -479,11 +476,11 @@ macro_rules! __define_css_keyword_enum__actual {
}
impl $crate::ToCss for $name {
- fn to_css<W>(&self, dest: &mut W) -> ::std::fmt::Result
+ fn to_css<W>(&self, dest: &mut $crate::CssWriter<W>) -> ::std::fmt::Result
where W: ::std::fmt::Write
{
match *self {
- $( $name::$variant => dest.write_str($css) ),+
+ $( $name::$variant => ::std::fmt::Write::write_str(dest, $css) ),+
}
}
}
diff --git a/components/style_traits/viewport.rs b/components/style_traits/viewport.rs
index c3538e4416b..e2f8c6baf6f 100644
--- a/components/style_traits/viewport.rs
+++ b/components/style_traits/viewport.rs
@@ -4,11 +4,11 @@
//! Helper types for the `@viewport` rule.
-use {CSSPixel, PinchZoomFactor, ParseError, ToCss};
+use {CSSPixel, CssWriter, ParseError, PinchZoomFactor, ToCss};
use cssparser::Parser;
use euclid::TypedSize2D;
#[allow(unused_imports)] use std::ascii::AsciiExt;
-use std::fmt;
+use std::fmt::{self, Write};
define_css_keyword_enum!(UserZoom:
"zoom" => Zoom,
@@ -42,8 +42,9 @@ pub struct ViewportConstraints {
}
impl ToCss for ViewportConstraints {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
- where W: fmt::Write
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
{
dest.write_str("@viewport { width: ")?;
self.size.width.to_css(dest)?;
@@ -86,7 +87,7 @@ pub enum Zoom {
}
impl ToCss for Zoom {
- fn to_css<W>(&self, dest: &mut W) -> fmt::Result
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where W: fmt::Write,
{
match *self {
diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs
index 06c76f3e7f0..4910aadd724 100644
--- a/ports/geckolib/glue.rs
+++ b/ports/geckolib/glue.rs
@@ -155,7 +155,7 @@ use style::values::distance::ComputeSquaredDistance;
use style::values::specified;
use style::values::specified::gecko::IntersectionObserverRootMargin;
use style::values::specified::source_size_list::SourceSizeList;
-use style_traits::{ParsingMode, StyleParseErrorKind, ToCss};
+use style_traits::{CssWriter, ParsingMode, StyleParseErrorKind, ToCss};
use super::error_reporter::ErrorReporter;
use super::stylesheet_loader::StylesheetLoader;
@@ -731,7 +731,7 @@ pub extern "C" fn Servo_Shorthand_AnimationValues_Serialize(shorthand_property:
values.iter().map(|v| AnimationValue::as_arc(unsafe { &&*v.mRawPtr }).uncompute()).collect();
let mut string = String::new();
- let rv = shorthand.longhands_to_css(declarations.iter(), &mut string);
+ let rv = shorthand.longhands_to_css(declarations.iter(), &mut CssWriter::new(&mut string));
if rv.is_ok() {
let buffer = unsafe { buffer.as_mut().unwrap() };
buffer.assign_utf8(&string);
@@ -1826,7 +1826,7 @@ pub extern "C" fn Servo_Keyframe_GetKeyText(
result: *mut nsAString
) {
read_locked_arc(keyframe, |keyframe: &Keyframe| {
- keyframe.selector.to_css(unsafe { result.as_mut().unwrap() }).unwrap()
+ keyframe.selector.to_css(&mut CssWriter::new(unsafe { result.as_mut().unwrap() })).unwrap()
})
}
@@ -1966,7 +1966,7 @@ pub extern "C" fn Servo_PageRule_SetStyle(rule: RawServoPageRuleBorrowed,
pub extern "C" fn Servo_SupportsRule_GetConditionText(rule: RawServoSupportsRuleBorrowed,
result: *mut nsAString) {
read_locked_arc(rule, |rule: &SupportsRule| {
- rule.condition.to_css(unsafe { result.as_mut().unwrap() }).unwrap();
+ rule.condition.to_css(&mut CssWriter::new(unsafe { result.as_mut().unwrap() })).unwrap();
})
}
@@ -1974,7 +1974,7 @@ pub extern "C" fn Servo_SupportsRule_GetConditionText(rule: RawServoSupportsRule
pub extern "C" fn Servo_DocumentRule_GetConditionText(rule: RawServoDocumentRuleBorrowed,
result: *mut nsAString) {
read_locked_arc(rule, |rule: &DocumentRule| {
- rule.condition.to_css(unsafe { result.as_mut().unwrap() }).unwrap();
+ rule.condition.to_css(&mut CssWriter::new(unsafe { result.as_mut().unwrap() })).unwrap();
})
}
@@ -1982,7 +1982,7 @@ pub extern "C" fn Servo_DocumentRule_GetConditionText(rule: RawServoDocumentRule
pub extern "C" fn Servo_FontFeatureValuesRule_GetFontFamily(rule: RawServoFontFeatureValuesRuleBorrowed,
result: *mut nsAString) {
read_locked_arc(rule, |rule: &FontFeatureValuesRule| {
- rule.font_family_to_css(unsafe { result.as_mut().unwrap() }).unwrap();
+ rule.font_family_to_css(&mut CssWriter::new(unsafe { result.as_mut().unwrap() })).unwrap();
})
}
@@ -1990,7 +1990,7 @@ pub extern "C" fn Servo_FontFeatureValuesRule_GetFontFamily(rule: RawServoFontFe
pub extern "C" fn Servo_FontFeatureValuesRule_GetValueText(rule: RawServoFontFeatureValuesRuleBorrowed,
result: *mut nsAString) {
read_locked_arc(rule, |rule: &FontFeatureValuesRule| {
- rule.value_to_css(unsafe { result.as_mut().unwrap() }).unwrap();
+ rule.value_to_css(&mut CssWriter::new(unsafe { result.as_mut().unwrap() })).unwrap();
})
}
@@ -2698,7 +2698,7 @@ pub extern "C" fn Servo_SerializeFontValueForCanvas(
};
let mut string = String::new();
- let rv = longhands.to_css_for_canvas(&mut string);
+ let rv = longhands.to_css_for_canvas(&mut CssWriter::new(&mut string));
debug_assert!(rv.is_ok());
let buffer = unsafe { buffer.as_mut().unwrap() };
@@ -2925,7 +2925,7 @@ pub extern "C" fn Servo_DeclarationBlock_HasCSSWideKeyword(
#[no_mangle]
pub extern "C" fn Servo_MediaList_GetText(list: RawServoMediaListBorrowed, result: *mut nsAString) {
read_locked_arc(list, |list: &MediaList| {
- list.to_css(unsafe { result.as_mut().unwrap() }).unwrap();
+ list.to_css(&mut CssWriter::new(unsafe { result.as_mut().unwrap() })).unwrap();
})
}
@@ -2981,7 +2981,7 @@ pub extern "C" fn Servo_MediaList_GetMediumAt(
) -> bool {
read_locked_arc(list, |list: &MediaList| {
if let Some(media_query) = list.media_queries.get(index as usize) {
- media_query.to_css(unsafe { result.as_mut().unwrap() }).unwrap();
+ media_query.to_css(&mut CssWriter::new(unsafe { result.as_mut().unwrap() })).unwrap();
true
} else {
false
@@ -4394,7 +4394,7 @@ pub extern "C" fn Servo_GetCustomPropertyValue(
None => return false,
};
- computed_value.to_css(unsafe { value.as_mut().unwrap() }).unwrap();
+ computed_value.to_css(&mut CssWriter::new(unsafe { value.as_mut().unwrap() })).unwrap();
true
}
diff --git a/tests/unit/style/media_queries.rs b/tests/unit/style/media_queries.rs
index 2cddcff5def..58b878bfb8d 100644
--- a/tests/unit/style/media_queries.rs
+++ b/tests/unit/style/media_queries.rs
@@ -279,8 +279,7 @@ fn test_mq_expressions() {
fn test_to_css() {
test_media_rule("@media print and (width: 43px) { }", |list, _| {
let q = &list.media_queries[0];
- let mut dest = String::new();
- assert_eq!(Ok(()), q.to_css(&mut dest));
+ let dest = q.to_css_string();
assert_eq!(dest, "print and (width: 43px)");
});
}