script/dom/css/
cssfontfeaturevaluesrule.rs1use 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 #[no_trace]
30 #[conditional_malloc_size_of]
31 font_feature_values_rule: Arc<FontFeatureValuesRule>,
32
33 annotation: MutNullableDom<CSSFontFeatureValuesMap>,
35
36 ornaments: MutNullableDom<CSSFontFeatureValuesMap>,
38
39 stylistic: MutNullableDom<CSSFontFeatureValuesMap>,
41
42 swash: MutNullableDom<CSSFontFeatureValuesMap>,
44
45 character_variant: MutNullableDom<CSSFontFeatureValuesMap>,
47
48 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 fn FontFamily(&self) -> DOMString {
103 self.font_feature_values_rule
104 .family_names
105 .to_css_string()
106 .into()
107 }
108
109 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 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 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 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 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 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}