style/values/specified/
ui.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5//! Specified types for UI properties.
6
7use crate::parser::{Parse, ParserContext};
8use crate::values::generics::ui as generics;
9use crate::values::specified::color::Color;
10use crate::values::specified::image::Image;
11use crate::values::specified::Number;
12use cssparser::Parser;
13use std::fmt::{self, Write};
14use style_traits::{
15    CssWriter, KeywordsCollectFn, ParseError, SpecifiedValueInfo, StyleParseErrorKind, ToCss,
16};
17
18/// A specified value for the `cursor` property.
19pub type Cursor = generics::GenericCursor<CursorImage>;
20
21/// A specified value for item of `image cursors`.
22pub type CursorImage = generics::GenericCursorImage<Image, Number>;
23
24impl Parse for Cursor {
25    /// cursor: [<url> [<number> <number>]?]# [auto | default | ...]
26    fn parse<'i, 't>(
27        context: &ParserContext,
28        input: &mut Parser<'i, 't>,
29    ) -> Result<Self, ParseError<'i>> {
30        let mut images = vec![];
31        loop {
32            match input.try_parse(|input| CursorImage::parse(context, input)) {
33                Ok(image) => images.push(image),
34                Err(_) => break,
35            }
36            input.expect_comma()?;
37        }
38        Ok(Self {
39            images: images.into(),
40            keyword: CursorKind::parse(input)?,
41        })
42    }
43}
44
45impl Parse for CursorImage {
46    fn parse<'i, 't>(
47        context: &ParserContext,
48        input: &mut Parser<'i, 't>,
49    ) -> Result<Self, ParseError<'i>> {
50        use crate::Zero;
51
52        let image = Image::parse_only_url(context, input)?;
53        let mut has_hotspot = false;
54        let mut hotspot_x = Number::zero();
55        let mut hotspot_y = Number::zero();
56
57        if let Ok(x) = input.try_parse(|input| Number::parse(context, input)) {
58            has_hotspot = true;
59            hotspot_x = x;
60            hotspot_y = Number::parse(context, input)?;
61        }
62
63        Ok(Self {
64            image,
65            has_hotspot,
66            hotspot_x,
67            hotspot_y,
68        })
69    }
70}
71
72// This trait is manually implemented because we don't support the whole <image>
73// syntax for cursors
74impl SpecifiedValueInfo for CursorImage {
75    fn collect_completion_keywords(f: KeywordsCollectFn) {
76        f(&["url", "image-set"]);
77    }
78}
79/// Specified value of `-moz-force-broken-image-icon`
80#[derive(
81    Clone,
82    Copy,
83    Debug,
84    MallocSizeOf,
85    PartialEq,
86    SpecifiedValueInfo,
87    ToComputedValue,
88    ToResolvedValue,
89    ToShmem,
90)]
91#[repr(transparent)]
92pub struct BoolInteger(pub bool);
93
94impl BoolInteger {
95    /// Returns 0
96    #[inline]
97    pub fn zero() -> Self {
98        Self(false)
99    }
100}
101
102impl Parse for BoolInteger {
103    fn parse<'i, 't>(
104        _context: &ParserContext,
105        input: &mut Parser<'i, 't>,
106    ) -> Result<Self, ParseError<'i>> {
107        // We intentionally don't support calc values here.
108        match input.expect_integer()? {
109            0 => Ok(Self(false)),
110            1 => Ok(Self(true)),
111            _ => Err(input.new_custom_error(StyleParseErrorKind::UnspecifiedError)),
112        }
113    }
114}
115
116impl ToCss for BoolInteger {
117    fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
118    where
119        W: Write,
120    {
121        dest.write_str(if self.0 { "1" } else { "0" })
122    }
123}
124
125/// A specified value for `scrollbar-color` property
126pub type ScrollbarColor = generics::ScrollbarColor<Color>;
127
128impl Parse for ScrollbarColor {
129    fn parse<'i, 't>(
130        context: &ParserContext,
131        input: &mut Parser<'i, 't>,
132    ) -> Result<Self, ParseError<'i>> {
133        if input.try_parse(|i| i.expect_ident_matching("auto")).is_ok() {
134            return Ok(generics::ScrollbarColor::Auto);
135        }
136        Ok(generics::ScrollbarColor::Colors {
137            thumb: Color::parse(context, input)?,
138            track: Color::parse(context, input)?,
139        })
140    }
141}
142
143/// The specified value for the `user-select` property.
144///
145/// https://drafts.csswg.org/css-ui-4/#propdef-user-select
146#[allow(missing_docs)]
147#[derive(
148    Clone,
149    Copy,
150    Debug,
151    Eq,
152    MallocSizeOf,
153    Parse,
154    PartialEq,
155    SpecifiedValueInfo,
156    ToComputedValue,
157    ToCss,
158    ToResolvedValue,
159    ToShmem,
160)]
161#[repr(u8)]
162pub enum UserSelect {
163    Auto,
164    Text,
165    #[parse(aliases = "-moz-none")]
166    None,
167    /// Force selection of all children.
168    All,
169}
170
171/// The keywords allowed in the Cursor property.
172///
173/// https://drafts.csswg.org/css-ui-4/#propdef-cursor
174#[allow(missing_docs)]
175#[derive(
176    Clone,
177    Copy,
178    Debug,
179    Eq,
180    FromPrimitive,
181    MallocSizeOf,
182    Parse,
183    PartialEq,
184    SpecifiedValueInfo,
185    ToComputedValue,
186    ToCss,
187    ToResolvedValue,
188    ToShmem,
189)]
190#[repr(u8)]
191pub enum CursorKind {
192    None,
193    Default,
194    Pointer,
195    ContextMenu,
196    Help,
197    Progress,
198    Wait,
199    Cell,
200    Crosshair,
201    Text,
202    VerticalText,
203    Alias,
204    Copy,
205    Move,
206    NoDrop,
207    NotAllowed,
208    #[parse(aliases = "-moz-grab")]
209    Grab,
210    #[parse(aliases = "-moz-grabbing")]
211    Grabbing,
212    EResize,
213    NResize,
214    NeResize,
215    NwResize,
216    SResize,
217    SeResize,
218    SwResize,
219    WResize,
220    EwResize,
221    NsResize,
222    NeswResize,
223    NwseResize,
224    ColResize,
225    RowResize,
226    AllScroll,
227    #[parse(aliases = "-moz-zoom-in")]
228    ZoomIn,
229    #[parse(aliases = "-moz-zoom-out")]
230    ZoomOut,
231    Auto,
232}
233
234/// The keywords allowed in the -moz-theme property.
235#[derive(
236    Clone,
237    Copy,
238    Debug,
239    Eq,
240    FromPrimitive,
241    MallocSizeOf,
242    Parse,
243    PartialEq,
244    SpecifiedValueInfo,
245    ToComputedValue,
246    ToCss,
247    ToResolvedValue,
248    ToShmem,
249)]
250#[repr(u8)]
251pub enum MozTheme {
252    /// Choose the default (maybe native) rendering.
253    Auto,
254    /// Choose the non-native rendering.
255    NonNative,
256}
257
258/// The pointer-events property
259/// https://svgwg.org/svg2-draft/interact.html#PointerEventsProperty
260#[allow(missing_docs)]
261#[derive(
262    Clone,
263    Copy,
264    Debug,
265    Eq,
266    FromPrimitive,
267    MallocSizeOf,
268    Parse,
269    PartialEq,
270    SpecifiedValueInfo,
271    ToComputedValue,
272    ToCss,
273    ToResolvedValue,
274    ToShmem,
275)]
276#[repr(u8)]
277pub enum PointerEvents {
278    Auto,
279    None,
280    #[cfg(feature = "gecko")]
281    Visiblepainted,
282    #[cfg(feature = "gecko")]
283    Visiblefill,
284    #[cfg(feature = "gecko")]
285    Visiblestroke,
286    #[cfg(feature = "gecko")]
287    Visible,
288    #[cfg(feature = "gecko")]
289    Painted,
290    #[cfg(feature = "gecko")]
291    Fill,
292    #[cfg(feature = "gecko")]
293    Stroke,
294    #[cfg(feature = "gecko")]
295    All,
296}
297
298/// Internal property to represent the inert attribute state:
299/// https://html.spec.whatwg.org/multipage/#inert-subtrees
300#[allow(missing_docs)]
301#[derive(
302    Clone,
303    Copy,
304    Debug,
305    Eq,
306    FromPrimitive,
307    MallocSizeOf,
308    Parse,
309    PartialEq,
310    SpecifiedValueInfo,
311    ToComputedValue,
312    ToCss,
313    ToResolvedValue,
314    ToShmem,
315)]
316#[repr(u8)]
317pub enum Inert {
318    None,
319    Inert,
320}
321
322/// Internal -moz-user-focus property.
323/// https://developer.mozilla.org/en-US/docs/Web/CSS/-moz-user-focus
324#[allow(missing_docs)]
325#[derive(
326    Clone,
327    Copy,
328    Debug,
329    Eq,
330    FromPrimitive,
331    MallocSizeOf,
332    Parse,
333    PartialEq,
334    SpecifiedValueInfo,
335    ToComputedValue,
336    ToCss,
337    ToResolvedValue,
338    ToShmem,
339)]
340#[repr(u8)]
341pub enum UserFocus {
342    Normal,
343    None,
344    Ignore,
345}