diff --git a/components/style/gecko/values.rs b/components/style/gecko/values.rs index a4815222409..fe7096bed4b 100644 --- a/components/style/gecko/values.rs +++ b/components/style/gecko/values.rs @@ -446,4 +446,34 @@ impl CounterStyleOrNone { } } } + + /// Convert Gecko CounterStylePtr to CounterStyleOrNone. + pub fn from_gecko_value(gecko_value: &CounterStylePtr) -> Self { + use counter_style::{Symbol, Symbols}; + use gecko_bindings::bindings::Gecko_CounterStyle_GetName; + use gecko_bindings::bindings::Gecko_CounterStyle_GetSymbols; + use gecko_bindings::bindings::Gecko_CounterStyle_GetSystem; + use gecko_bindings::bindings::Gecko_CounterStyle_IsName; + use gecko_bindings::bindings::Gecko_CounterStyle_IsNone; + use values::CustomIdent; + use values::generics::SymbolsType; + + if unsafe { Gecko_CounterStyle_IsNone(gecko_value) } { + CounterStyleOrNone::None + } else if unsafe { Gecko_CounterStyle_IsName(gecko_value) } { + ns_auto_string!(name); + unsafe { Gecko_CounterStyle_GetName(gecko_value, &mut *name) }; + CounterStyleOrNone::Name(CustomIdent((&*name).into())) + } else { + let system = unsafe { Gecko_CounterStyle_GetSystem(gecko_value) }; + let symbol_type = SymbolsType::from_gecko_keyword(system as u32); + let symbols = unsafe { + let ref gecko_symbols = *Gecko_CounterStyle_GetSymbols(gecko_value); + gecko_symbols.iter().map(|gecko_symbol| { + Symbol::String(gecko_symbol.to_string()) + }).collect() + }; + CounterStyleOrNone::Symbols(symbol_type, Symbols(symbols)) + } + } } diff --git a/components/style/values/generics/mod.rs b/components/style/values/generics/mod.rs index 9456f0061c5..c11e088cb4c 100644 --- a/components/style/values/generics/mod.rs +++ b/components/style/values/generics/mod.rs @@ -50,6 +50,19 @@ impl SymbolsType { SymbolsType::Fixed => structs::NS_STYLE_COUNTER_SYSTEM_FIXED as u8, } } + + /// Convert Gecko value to symbol type. + pub fn from_gecko_keyword(gecko_value: u32) -> SymbolsType { + use gecko_bindings::structs; + match gecko_value { + structs::NS_STYLE_COUNTER_SYSTEM_CYCLIC => SymbolsType::Cyclic, + structs::NS_STYLE_COUNTER_SYSTEM_NUMERIC => SymbolsType::Numeric, + structs::NS_STYLE_COUNTER_SYSTEM_ALPHABETIC => SymbolsType::Alphabetic, + structs::NS_STYLE_COUNTER_SYSTEM_SYMBOLIC => SymbolsType::Symbolic, + structs::NS_STYLE_COUNTER_SYSTEM_FIXED => SymbolsType::Fixed, + x => panic!("Unexpected value for symbol type {}", x) + } + } } /// https://drafts.csswg.org/css-counter-styles/#typedef-counter-style