Skip to main content

script/dom/css/
cssfontfeaturevaluesrule.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
5use dom_struct::dom_struct;
6use js::context::JSContext;
7use script_bindings::dom::MutNullableDom;
8use script_bindings::reflector::reflect_dom_object_with_cx;
9use servo_arc::Arc;
10use style::shared_lock::ToCssWithGuard;
11use style::stylesheets::{CssRuleType, FontFeatureValuesRule};
12use style_traits::ToCss;
13
14use super::cssrule::{CSSRule, SpecificCSSRule};
15use super::cssstylesheet::CSSStyleSheet;
16use crate::dom::bindings::codegen::Bindings::CSSFontFeatureValuesRuleBinding::CSSFontFeatureValuesRuleMethods;
17use crate::dom::bindings::reflector::DomGlobal;
18use crate::dom::bindings::root::DomRoot;
19use crate::dom::bindings::str::DOMString;
20use crate::dom::cssfontfeaturevaluesmap::CSSFontFeatureValuesMap;
21use crate::dom::cssgroupingrule::CSSGroupingRule;
22use crate::dom::window::Window;
23
24#[dom_struct]
25pub(crate) struct CSSFontFeatureValuesRule {
26    css_rule: CSSRule,
27
28    /// A reference to the `@font-feature-values` rule as it is stored by stylo.
29    #[no_trace]
30    #[conditional_malloc_size_of]
31    font_feature_values_rule: Arc<FontFeatureValuesRule>,
32
33    /// <https://drafts.csswg.org/css-fonts/#dom-cssfontfeaturevaluesrule-annotation>
34    annotation: MutNullableDom<CSSFontFeatureValuesMap>,
35
36    /// <https://drafts.csswg.org/css-fonts/#dom-cssfontfeaturevaluesrule-ornaments>
37    ornaments: MutNullableDom<CSSFontFeatureValuesMap>,
38
39    /// <https://drafts.csswg.org/css-fonts/#dom-cssfontfeaturevaluesrule-stylistic>
40    stylistic: MutNullableDom<CSSFontFeatureValuesMap>,
41
42    /// <https://drafts.csswg.org/css-fonts/#dom-cssfontfeaturevaluesrule-swash>
43    swash: MutNullableDom<CSSFontFeatureValuesMap>,
44
45    /// <https://drafts.csswg.org/css-fonts/#dom-cssfontfeaturevaluesrule-charactervariant>
46    character_variant: MutNullableDom<CSSFontFeatureValuesMap>,
47
48    /// <https://drafts.csswg.org/css-fonts/#dom-cssfontfeaturevaluesrule-styleset>
49    styleset: MutNullableDom<CSSFontFeatureValuesMap>,
50}
51
52impl CSSFontFeatureValuesRule {
53    fn new_inherited(
54        parent_rule: Option<&CSSGroupingRule>,
55        parent_stylesheet: &CSSStyleSheet,
56        font_feature_values_rule: Arc<FontFeatureValuesRule>,
57    ) -> CSSFontFeatureValuesRule {
58        CSSFontFeatureValuesRule {
59            css_rule: CSSRule::new_inherited(parent_rule, parent_stylesheet),
60            font_feature_values_rule,
61            annotation: Default::default(),
62            ornaments: Default::default(),
63            stylistic: Default::default(),
64            swash: Default::default(),
65            character_variant: Default::default(),
66            styleset: Default::default(),
67        }
68    }
69
70    pub(crate) fn new(
71        cx: &mut JSContext,
72        window: &Window,
73        parent_rule: Option<&CSSGroupingRule>,
74        parent_stylesheet: &CSSStyleSheet,
75        font_feature_values_rule: Arc<FontFeatureValuesRule>,
76    ) -> DomRoot<CSSFontFeatureValuesRule> {
77        reflect_dom_object_with_cx(
78            Box::new(CSSFontFeatureValuesRule::new_inherited(
79                parent_rule,
80                parent_stylesheet,
81                font_feature_values_rule,
82            )),
83            window,
84            cx,
85        )
86    }
87}
88
89impl SpecificCSSRule for CSSFontFeatureValuesRule {
90    fn ty(&self) -> CssRuleType {
91        CssRuleType::FontFeatureValues
92    }
93
94    fn get_css(&self) -> DOMString {
95        let guard = self.css_rule.shared_lock().read();
96        self.font_feature_values_rule.to_css_string(&guard).into()
97    }
98}
99
100impl CSSFontFeatureValuesRuleMethods<crate::DomTypeHolder> for CSSFontFeatureValuesRule {
101    /// <https://drafts.csswg.org/css-fonts/#dom-cssfontfeaturevaluesrule-fontfamily>
102    fn FontFamily(&self) -> DOMString {
103        self.font_feature_values_rule
104            .family_names
105            .to_css_string()
106            .into()
107    }
108
109    /// <https://drafts.csswg.org/css-fonts/#dom-cssfontfeaturevaluesrule-annotation>
110    fn Annotation(&self, cx: &mut JSContext) -> DomRoot<CSSFontFeatureValuesMap> {
111        self.annotation.or_init(|| {
112            let global = self.global();
113            CSSFontFeatureValuesMap::build_from(
114                cx,
115                &global,
116                &self.font_feature_values_rule.annotation,
117            )
118        })
119    }
120
121    /// <https://drafts.csswg.org/css-fonts/#dom-cssfontfeaturevaluesrule-ornaments>
122    fn Ornaments(&self, cx: &mut JSContext) -> DomRoot<CSSFontFeatureValuesMap> {
123        self.ornaments.or_init(|| {
124            let global = self.global();
125            CSSFontFeatureValuesMap::build_from(
126                cx,
127                &global,
128                &self.font_feature_values_rule.ornaments,
129            )
130        })
131    }
132
133    /// <https://drafts.csswg.org/css-fonts/#dom-cssfontfeaturevaluesrule-stylistic>
134    fn Stylistic(&self, cx: &mut JSContext) -> DomRoot<CSSFontFeatureValuesMap> {
135        self.stylistic.or_init(|| {
136            let global = self.global();
137            CSSFontFeatureValuesMap::build_from(
138                cx,
139                &global,
140                &self.font_feature_values_rule.stylistic,
141            )
142        })
143    }
144
145    /// <https://drafts.csswg.org/css-fonts/#dom-cssfontfeaturevaluesrule-swash>
146    fn Swash(&self, cx: &mut JSContext) -> DomRoot<CSSFontFeatureValuesMap> {
147        self.swash.or_init(|| {
148            let global = self.global();
149            CSSFontFeatureValuesMap::build_from(cx, &global, &self.font_feature_values_rule.swash)
150        })
151    }
152
153    /// <https://drafts.csswg.org/css-fonts/#dom-cssfontfeaturevaluesrule-charactervariant>
154    fn CharacterVariant(&self, cx: &mut JSContext) -> DomRoot<CSSFontFeatureValuesMap> {
155        self.character_variant.or_init(|| {
156            let global = self.global();
157            CSSFontFeatureValuesMap::build_from(
158                cx,
159                &global,
160                &self.font_feature_values_rule.character_variant,
161            )
162        })
163    }
164
165    /// <https://drafts.csswg.org/css-fonts/#dom-cssfontfeaturevaluesrule-styleset>
166    fn Styleset(&self, cx: &mut JSContext) -> DomRoot<CSSFontFeatureValuesMap> {
167        self.styleset.or_init(|| {
168            let global = self.global();
169            CSSFontFeatureValuesMap::build_from(
170                cx,
171                &global,
172                &self.font_feature_values_rule.styleset,
173            )
174        })
175    }
176}