Skip to content

Commit

Permalink
style: Add FFI function to parse a @counter-style descriptor.
Browse files Browse the repository at this point in the history
  • Loading branch information
heycam committed Dec 5, 2017
1 parent 374f009 commit c49554d
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 1 deletion.
26 changes: 25 additions & 1 deletion components/style/counter_style/mod.rs
Expand Up @@ -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};
Expand Down Expand Up @@ -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(())
}
}
}

Expand Down
35 changes: 35 additions & 0 deletions ports/geckolib/glue.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -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()
}

0 comments on commit c49554d

Please sign in to comment.