use dom_struct::dom_struct;
use js::context::JSContext;
use script_bindings::reflector::reflect_dom_object_with_cx;
use style::font_face::DescriptorId;
use crate::dom::GlobalScope;
use crate::dom::bindings::codegen::Bindings::CSSFontFaceDescriptorsBinding::CSSFontFaceDescriptorsMethods;
use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::bindings::str::DOMString;
use crate::dom::css::cssfontfacerule::CSSFontFaceRule;
use crate::dom::css::cssstyledeclaration::CSSStyleDeclaration;
use crate::dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleOwner};
#[dom_struct]
pub(crate) struct CSSFontFaceDescriptors {
style_declaration: CSSStyleDeclaration,
font_face_rule: Dom<CSSFontFaceRule>,
}
impl CSSFontFaceDescriptors {
pub(crate) fn new_inherited(font_face_rule: &CSSFontFaceRule) -> CSSFontFaceDescriptors {
CSSFontFaceDescriptors {
style_declaration: CSSStyleDeclaration::new_inherited(
CSSStyleOwner::Null,
None,
CSSModificationAccess::Readonly,
),
font_face_rule: Dom::from_ref(font_face_rule),
}
}
pub(crate) fn new(
cx: &mut JSContext,
global: &GlobalScope,
font_face_rule: &CSSFontFaceRule,
) -> DomRoot<CSSFontFaceDescriptors> {
reflect_dom_object_with_cx(
Box::new(CSSFontFaceDescriptors::new_inherited(font_face_rule)),
global,
cx,
)
}
pub(crate) fn get_property_value(&self, property: &str) -> DOMString {
let Ok(descriptor_id) = DescriptorId::from_ident(property) else {
return Default::default();
};
self.font_face_rule.get_descriptor(descriptor_id)
}
}
impl CSSFontFaceDescriptorsMethods<crate::DomTypeHolder> for CSSFontFaceDescriptors {
fn Src(&self) -> DOMString {
self.font_face_rule.get_descriptor(DescriptorId::Src)
}
fn FontFamily(&self) -> DOMString {
self.font_face_rule.get_descriptor(DescriptorId::FontFamily)
}
fn Font_family(&self) -> DOMString {
self.font_face_rule.get_descriptor(DescriptorId::FontFamily)
}
fn FontStyle(&self) -> DOMString {
self.font_face_rule.get_descriptor(DescriptorId::FontStyle)
}
fn Font_style(&self) -> DOMString {
self.font_face_rule.get_descriptor(DescriptorId::FontStyle)
}
fn FontWeight(&self) -> DOMString {
self.font_face_rule.get_descriptor(DescriptorId::FontWeight)
}
fn Font_weight(&self) -> DOMString {
self.font_face_rule.get_descriptor(DescriptorId::FontWeight)
}
fn FontStretch(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::FontStretch)
}
fn Font_stretch(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::FontStretch)
}
fn FontWidth(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::FontStretch)
}
fn Font_width(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::FontStretch)
}
fn UnicodeRange(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::UnicodeRange)
}
fn Unicode_range(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::UnicodeRange)
}
fn FontFeatureSettings(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::FontFeatureSettings)
}
fn Font_feature_settings(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::FontFeatureSettings)
}
fn FontVariationSettings(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::FontVariationSettings)
}
fn Font_variation_settings(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::FontVariationSettings)
}
fn FontDisplay(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::FontDisplay)
}
fn Font_display(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::FontDisplay)
}
fn FontLanguageOverride(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::FontLanguageOverride)
}
fn Font_language_override(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::FontLanguageOverride)
}
fn AscentOverride(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::AscentOverride)
}
fn Ascent_override(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::AscentOverride)
}
fn DescentOverride(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::DescentOverride)
}
fn Descent_override(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::DescentOverride)
}
fn LineGapOverride(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::LineGapOverride)
}
fn Line_gap_override(&self) -> DOMString {
self.font_face_rule
.get_descriptor(DescriptorId::LineGapOverride)
}
fn IndexedGetter(&self, index: u32) -> Option<DOMString> {
self.font_face_rule.get_descriptor_by_index(index)
}
fn Length(&self, _cx: &JSContext) -> u32 {
self.font_face_rule.descriptor_length() as u32
}
}