use dom_struct::dom_struct;
use js::context::JSContext;
use script_bindings::dom::MutNullableDom;
use script_bindings::reflector::reflect_dom_object_with_cx;
use servo_arc::Arc;
use style::shared_lock::ToCssWithGuard;
use style::stylesheets::{CssRuleType, FontFeatureValuesRule};
use style_traits::ToCss;
use super::cssrule::{CSSRule, SpecificCSSRule};
use super::cssstylesheet::CSSStyleSheet;
use crate::dom::bindings::codegen::Bindings::CSSFontFeatureValuesRuleBinding::CSSFontFeatureValuesRuleMethods;
use crate::dom::bindings::reflector::DomGlobal;
use crate::dom::bindings::root::DomRoot;
use crate::dom::bindings::str::DOMString;
use crate::dom::cssfontfeaturevaluesmap::CSSFontFeatureValuesMap;
use crate::dom::cssgroupingrule::CSSGroupingRule;
use crate::dom::window::Window;
#[dom_struct]
pub(crate) struct CSSFontFeatureValuesRule {
css_rule: CSSRule,
#[no_trace]
#[conditional_malloc_size_of]
font_feature_values_rule: Arc<FontFeatureValuesRule>,
annotation: MutNullableDom<CSSFontFeatureValuesMap>,
ornaments: MutNullableDom<CSSFontFeatureValuesMap>,
stylistic: MutNullableDom<CSSFontFeatureValuesMap>,
swash: MutNullableDom<CSSFontFeatureValuesMap>,
character_variant: MutNullableDom<CSSFontFeatureValuesMap>,
styleset: MutNullableDom<CSSFontFeatureValuesMap>,
}
impl CSSFontFeatureValuesRule {
fn new_inherited(
parent_rule: Option<&CSSGroupingRule>,
parent_stylesheet: &CSSStyleSheet,
font_feature_values_rule: Arc<FontFeatureValuesRule>,
) -> CSSFontFeatureValuesRule {
CSSFontFeatureValuesRule {
css_rule: CSSRule::new_inherited(parent_rule, parent_stylesheet),
font_feature_values_rule,
annotation: Default::default(),
ornaments: Default::default(),
stylistic: Default::default(),
swash: Default::default(),
character_variant: Default::default(),
styleset: Default::default(),
}
}
pub(crate) fn new(
cx: &mut JSContext,
window: &Window,
parent_rule: Option<&CSSGroupingRule>,
parent_stylesheet: &CSSStyleSheet,
font_feature_values_rule: Arc<FontFeatureValuesRule>,
) -> DomRoot<CSSFontFeatureValuesRule> {
reflect_dom_object_with_cx(
Box::new(CSSFontFeatureValuesRule::new_inherited(
parent_rule,
parent_stylesheet,
font_feature_values_rule,
)),
window,
cx,
)
}
}
impl SpecificCSSRule for CSSFontFeatureValuesRule {
fn ty(&self) -> CssRuleType {
CssRuleType::FontFeatureValues
}
fn get_css(&self) -> DOMString {
let guard = self.css_rule.shared_lock().read();
self.font_feature_values_rule.to_css_string(&guard).into()
}
}
impl CSSFontFeatureValuesRuleMethods<crate::DomTypeHolder> for CSSFontFeatureValuesRule {
fn FontFamily(&self) -> DOMString {
self.font_feature_values_rule
.family_names
.to_css_string()
.into()
}
fn Annotation(&self, cx: &mut JSContext) -> DomRoot<CSSFontFeatureValuesMap> {
self.annotation.or_init(|| {
let global = self.global();
CSSFontFeatureValuesMap::build_from(
cx,
&global,
&self.font_feature_values_rule.annotation,
)
})
}
fn Ornaments(&self, cx: &mut JSContext) -> DomRoot<CSSFontFeatureValuesMap> {
self.ornaments.or_init(|| {
let global = self.global();
CSSFontFeatureValuesMap::build_from(
cx,
&global,
&self.font_feature_values_rule.ornaments,
)
})
}
fn Stylistic(&self, cx: &mut JSContext) -> DomRoot<CSSFontFeatureValuesMap> {
self.stylistic.or_init(|| {
let global = self.global();
CSSFontFeatureValuesMap::build_from(
cx,
&global,
&self.font_feature_values_rule.stylistic,
)
})
}
fn Swash(&self, cx: &mut JSContext) -> DomRoot<CSSFontFeatureValuesMap> {
self.swash.or_init(|| {
let global = self.global();
CSSFontFeatureValuesMap::build_from(cx, &global, &self.font_feature_values_rule.swash)
})
}
fn CharacterVariant(&self, cx: &mut JSContext) -> DomRoot<CSSFontFeatureValuesMap> {
self.character_variant.or_init(|| {
let global = self.global();
CSSFontFeatureValuesMap::build_from(
cx,
&global,
&self.font_feature_values_rule.character_variant,
)
})
}
fn Styleset(&self, cx: &mut JSContext) -> DomRoot<CSSFontFeatureValuesMap> {
self.styleset.or_init(|| {
let global = self.global();
CSSFontFeatureValuesMap::build_from(
cx,
&global,
&self.font_feature_values_rule.styleset,
)
})
}
}