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 values for outline properties
6 
7 use crate::parser::{Parse, ParserContext};
8 use crate::values::specified::BorderStyle;
9 use cssparser::Parser;
10 use selectors::parser::SelectorParseErrorKind;
11 use style_traits::ParseError;
12 
13 #[derive(
14     Clone,
15     Copy,
16     Debug,
17     Eq,
18     MallocSizeOf,
19     Ord,
20     PartialEq,
21     PartialOrd,
22     SpecifiedValueInfo,
23     ToComputedValue,
24     ToCss,
25     ToResolvedValue,
26     ToShmem,
27 )]
28 #[repr(C, u8)]
29 /// <https://drafts.csswg.org/css-ui/#propdef-outline-style>
30 pub enum OutlineStyle {
31     /// auto
32     Auto,
33     /// <border-style>
34     BorderStyle(BorderStyle),
35 }
36 
37 impl OutlineStyle {
38     #[inline]
39     /// Get default value as None
none() -> OutlineStyle40     pub fn none() -> OutlineStyle {
41         OutlineStyle::BorderStyle(BorderStyle::None)
42     }
43 
44     #[inline]
45     /// Get value for None or Hidden
none_or_hidden(&self) -> bool46     pub fn none_or_hidden(&self) -> bool {
47         match *self {
48             OutlineStyle::Auto => false,
49             OutlineStyle::BorderStyle(ref style) => style.none_or_hidden(),
50         }
51     }
52 }
53 
54 impl Parse for OutlineStyle {
parse<'i, 't>( _context: &ParserContext, input: &mut Parser<'i, 't>, ) -> Result<OutlineStyle, ParseError<'i>>55     fn parse<'i, 't>(
56         _context: &ParserContext,
57         input: &mut Parser<'i, 't>,
58     ) -> Result<OutlineStyle, ParseError<'i>> {
59         if let Ok(border_style) = input.try_parse(BorderStyle::parse) {
60             if let BorderStyle::Hidden = border_style {
61                 return Err(input
62                     .new_custom_error(SelectorParseErrorKind::UnexpectedIdent("hidden".into())));
63             }
64 
65             return Ok(OutlineStyle::BorderStyle(border_style));
66         }
67 
68         input.expect_ident_matching("auto")?;
69         Ok(OutlineStyle::Auto)
70     }
71 }
72