diff --git a/components/style/properties/longhands/box.mako.rs b/components/style/properties/longhands/box.mako.rs index bd4a4d2ac24..5a0f893cc63 100644 --- a/components/style/properties/longhands/box.mako.rs +++ b/components/style/properties/longhands/box.mako.rs @@ -438,22 +438,22 @@ ${helpers.single_keyword( )} ${helpers.predefined_type( - "page-break-after", + "break-after", "BreakBetween", "computed::BreakBetween::Auto", needs_context=False, products="gecko", - spec="https://drafts.csswg.org/css2/page.html#propdef-page-break-after", + spec="https://drafts.csswg.org/css-break/#propdef-break-after", animation_value_type="discrete", )} ${helpers.predefined_type( - "page-break-before", + "break-before", "BreakBetween", "computed::BreakBetween::Auto", needs_context=False, products="gecko", - spec="https://drafts.csswg.org/css2/page.html#propdef-page-break-before", + spec="https://drafts.csswg.org/css-break/#propdef-break-before", animation_value_type="discrete", )} diff --git a/components/style/properties/shorthands/box.mako.rs b/components/style/properties/shorthands/box.mako.rs index 95c31453a04..f424ddb37c2 100644 --- a/components/style/properties/shorthands/box.mako.rs +++ b/components/style/properties/shorthands/box.mako.rs @@ -447,3 +447,49 @@ macro_rules! try_parse_one { } } + +<%helpers:shorthand + name="page-break-before" + flags="SHORTHAND_IN_GETCS IS_LEGACY_SHORTHAND" + sub_properties="break-before" + spec="https://drafts.csswg.org/css2/page.html#propdef-page-break-before" +> + pub fn parse_value<'i>( + _: &ParserContext, + input: &mut Parser<'i, '_>, + ) -> Result> { + use crate::values::specified::box_::BreakBetween; + Ok(expanded! { + break_before: BreakBetween::parse_legacy(input)?, + }) + } + + impl<'a> ToCss for LonghandsToSerialize<'a> { + fn to_css(&self, dest: &mut CssWriter) -> fmt::Result where W: fmt::Write { + self.break_before.to_css_legacy(dest) + } + } + + +<%helpers:shorthand + name="page-break-after" + flags="SHORTHAND_IN_GETCS IS_LEGACY_SHORTHAND" + sub_properties="break-after" + spec="https://drafts.csswg.org/css2/page.html#propdef-page-break-after" +> + pub fn parse_value<'i>( + _: &ParserContext, + input: &mut Parser<'i, '_>, + ) -> Result> { + use crate::values::specified::box_::BreakBetween; + Ok(expanded! { + break_after: BreakBetween::parse_legacy(input)?, + }) + } + + impl<'a> ToCss for LonghandsToSerialize<'a> { + fn to_css(&self, dest: &mut CssWriter) -> fmt::Result where W: fmt::Write { + self.break_after.to_css_legacy(dest) + } + } + diff --git a/components/style/values/specified/box.rs b/components/style/values/specified/box.rs index 021ff54e053..9210c49e88f 100644 --- a/components/style/values/specified/box.rs +++ b/components/style/values/specified/box.rs @@ -1286,13 +1286,60 @@ pub enum Appearance { )] #[repr(u8)] pub enum BreakBetween { - Auto, Always, + Auto, + Page, Avoid, Left, Right, } +impl BreakBetween { + /// Parse a legacy break-between value for `page-break-*`. + /// + /// See https://drafts.csswg.org/css-break/#page-break-properties. + #[inline] + pub fn parse_legacy<'i>( + input: &mut Parser<'i, '_>, + ) -> Result> { + let location = input.current_source_location(); + let ident = input.expect_ident()?; + let break_value = match BreakBetween::from_ident(ident) { + Ok(v) => v, + Err(()) => return Err(location.new_custom_error( + SelectorParseErrorKind::UnexpectedIdent(ident.clone()) + )), + }; + match break_value { + BreakBetween::Always => Ok(BreakBetween::Page), + BreakBetween::Auto | + BreakBetween::Avoid | + BreakBetween::Left | + BreakBetween::Right => Ok(break_value), + BreakBetween::Page => { + Err(location.new_custom_error(SelectorParseErrorKind::UnexpectedIdent(ident.clone()))) + } + } + } + + /// Serialize a legacy break-between value for `page-break-*`. + /// + /// See https://drafts.csswg.org/css-break/#page-break-properties. + pub fn to_css_legacy(&self, dest: &mut CssWriter) -> fmt::Result + where + W: Write, + { + match *self { + BreakBetween::Auto | + BreakBetween::Avoid | + BreakBetween::Left | + BreakBetween::Right => self.to_css(dest), + BreakBetween::Page => dest.write_str("always"), + BreakBetween::Always => Ok(()), + } + } +} + /// A kind of break within a box. /// /// https://drafts.csswg.org/css-break/#break-within