diff --git a/components/style/counter_style/mod.rs b/components/style/counter_style/mod.rs index 4aa4de89551..4e195dd15b8 100644 --- a/components/style/counter_style/mod.rs +++ b/components/style/counter_style/mod.rs @@ -11,7 +11,7 @@ use cssparser::{AtRuleParser, DeclarationListParser, DeclarationParser}; use cssparser::{Parser, Token, serialize_identifier, CowRcStr}; use error_reporting::{ContextualParseError, ParseErrorReporter}; #[cfg(feature = "gecko")] use gecko::rules::CounterStyleDescriptors; -#[cfg(feature = "gecko")] use gecko_bindings::structs::nsCSSCounterDesc; +#[cfg(feature = "gecko")] use gecko_bindings::structs::{ nsCSSCounterDesc, nsCSSValue }; use parser::{ParserContext, ParserErrorContext, Parse}; use selectors::parser::SelectorParseErrorKind; use shared_lock::{SharedRwLockReadGuard, ToCssWithGuard}; @@ -243,6 +243,30 @@ macro_rules! counter_style_descriptors { dest.write_str("}") } } + + /// Parse a descriptor into an `nsCSSValue`. + #[cfg(feature = "gecko")] + pub fn parse_counter_style_descriptor<'i, 't>( + context: &ParserContext, + input: &mut Parser<'i, 't>, + descriptor: nsCSSCounterDesc, + value: &mut nsCSSValue + ) -> Result<(), ParseError<'i>> { + match descriptor { + $( + nsCSSCounterDesc::$gecko_ident => { + let v: $ty = + input.parse_entirely(|i| Parse::parse(context, i))?; + value.set_from(v); + } + )* + nsCSSCounterDesc::eCSSCounterDesc_COUNT | + nsCSSCounterDesc::eCSSCounterDesc_UNKNOWN => { + panic!("invalid counter descriptor"); + } + } + Ok(()) + } } } diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index e9ef9d8104f..4ddb28f4f94 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -105,6 +105,8 @@ use style::gecko_bindings::structs::ServoTraversalFlags; use style::gecko_bindings::structs::StyleRuleInclusion; use style::gecko_bindings::structs::URLExtraData; use style::gecko_bindings::structs::gfxFontFeatureValueSet; +use style::gecko_bindings::structs::nsCSSCounterDesc; +use style::gecko_bindings::structs::nsCSSValue; use style::gecko_bindings::structs::nsCSSValueSharedList; use style::gecko_bindings::structs::nsCompatibility; use style::gecko_bindings::structs::nsIDocument; @@ -4749,3 +4751,36 @@ pub extern "C" fn Servo_ParseCounterStyleName( Err(_) => ptr::null_mut(), } } + +#[no_mangle] +pub extern "C" fn Servo_ParseCounterStyleDescriptor( + descriptor: nsCSSCounterDesc, + value: *const nsACString, + raw_extra_data: *mut URLExtraData, + result: *mut nsCSSValue, +) -> bool { + let value = unsafe { value.as_ref().unwrap().as_str_unchecked() }; + let url_data = unsafe { + if raw_extra_data.is_null() { + dummy_url_data() + } else { + RefPtr::from_ptr_ref(&raw_extra_data) + } + }; + let result = unsafe { result.as_mut().unwrap() }; + let mut input = ParserInput::new(&value); + let mut parser = Parser::new(&mut input); + let context = ParserContext::new( + Origin::Author, + url_data, + Some(CssRuleType::CounterStyle), + ParsingMode::DEFAULT, + QuirksMode::NoQuirks, + ); + counter_style::parse_counter_style_descriptor( + &context, + &mut parser, + descriptor, + result, + ).is_ok() +}