diff --git a/components/style/properties/counted_unknown_properties.py b/components/style/properties/counted_unknown_properties.py index 6a562a9abab..fffac5ff589 100644 --- a/components/style/properties/counted_unknown_properties.py +++ b/components/style/properties/counted_unknown_properties.py @@ -38,7 +38,6 @@ COUNTED_UNKNOWN_PROPERTIES = [ "-webkit-writing-mode", "baseline-shift", "-webkit-hyphenate-character", - "page", "-webkit-highlight", "background-repeat-x", "-webkit-padding-end", diff --git a/components/style/properties/longhands/page.mako.rs b/components/style/properties/longhands/page.mako.rs index 298456cb753..ec41989a137 100644 --- a/components/style/properties/longhands/page.mako.rs +++ b/components/style/properties/longhands/page.mako.rs @@ -19,3 +19,13 @@ ${helpers.predefined_type( animation_value_type="none", rule_types_allowed=PAGE_RULE, )} + +${helpers.predefined_type( + "page", + "PageName", + "computed::PageName::auto()", + engines="gecko", + gecko_pref="layout.css.named-pages.enabled", + spec="https://drafts.csswg.org/css-page-3/#using-named-pages", + animation_value_type="discrete", +)} diff --git a/components/style/values/computed/mod.rs b/components/style/values/computed/mod.rs index 9beab014ff5..6990fc65fe6 100644 --- a/components/style/values/computed/mod.rs +++ b/components/style/values/computed/mod.rs @@ -72,7 +72,7 @@ pub use self::list::ListStyleType; pub use self::list::Quotes; pub use self::motion::{OffsetPath, OffsetRotate}; pub use self::outline::OutlineStyle; -pub use self::page::{Orientation, PageSize, PaperSize}; +pub use self::page::{Orientation, PageName, PageSize, PaperSize}; pub use self::percentage::{NonNegativePercentage, Percentage}; pub use self::position::AspectRatio; pub use self::position::{ diff --git a/components/style/values/computed/page.rs b/components/style/values/computed/page.rs index 27b16d0af15..080681e008f 100644 --- a/components/style/values/computed/page.rs +++ b/components/style/values/computed/page.rs @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -//! Computed @page at-rule properties +//! Computed @page at-rule properties and named-page style properties use crate::values::computed::length::NonNegativeLength; use crate::values::computed::{Context, ToComputedValue}; @@ -13,6 +13,7 @@ use crate::values::specified::page as specified; pub use generics::page::GenericPageSize; pub use generics::page::Orientation; pub use generics::page::PaperSize; +pub use specified::PageName; /// Computed value of the @page size descriptor /// diff --git a/components/style/values/specified/mod.rs b/components/style/values/specified/mod.rs index 3c3c9b8d1ce..c776af5f201 100644 --- a/components/style/values/specified/mod.rs +++ b/components/style/values/specified/mod.rs @@ -69,7 +69,7 @@ pub use self::list::ListStyleType; pub use self::list::Quotes; pub use self::motion::{OffsetPath, OffsetRotate}; pub use self::outline::OutlineStyle; -pub use self::page::{Orientation, PageSize, PaperSize}; +pub use self::page::{Orientation, PageName, PageSize, PaperSize}; pub use self::percentage::{NonNegativePercentage, Percentage}; pub use self::position::AspectRatio; pub use self::position::{ diff --git a/components/style/values/specified/page.rs b/components/style/values/specified/page.rs index 4d96b532689..e6d5347e378 100644 --- a/components/style/values/specified/page.rs +++ b/components/style/values/specified/page.rs @@ -2,10 +2,10 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -//! Specified @page at-rule properties +//! Specified @page at-rule properties and named-page style properties use crate::parser::{Parse, ParserContext}; -use crate::values::generics; +use crate::values::{generics, CustomIdent}; use crate::values::generics::size::Size2D; use crate::values::specified::length::NonNegativeLength; use cssparser::Parser; @@ -46,3 +46,43 @@ impl Parse for PageSize { Ok(PageSize::Auto) } } + +/// Page name value. +/// +/// https://drafts.csswg.org/css-page-3/#using-named-pages +#[derive(Clone, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo, ToCss, ToComputedValue, ToResolvedValue, ToShmem)] +#[repr(C, u8)] +pub enum PageName { + /// `auto` value. + Auto, + /// Page name value + PageName(CustomIdent), +} + +impl Parse for PageName { + fn parse<'i, 't>( + _context: &ParserContext, + input: &mut Parser<'i, 't>, + ) -> Result> { + let location = input.current_source_location(); + let ident = input.expect_ident()?; + Ok(match_ignore_ascii_case! { ident, + "auto" => PageName::auto(), + _ => PageName::PageName(CustomIdent::from_ident(location, ident, &[])?), + }) + } +} + +impl PageName { + /// `auto` value. + #[inline] + pub fn auto() -> Self { + PageName::Auto + } + + /// Whether this is the `auto` value. + #[inline] + pub fn is_auto(&self) -> bool { + matches!(*self, PageName::Auto) + } +}