mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
style: Add FFI function to parse a @counter-style descriptor.
This commit is contained in:
parent
374f0091c1
commit
c49554d4c4
2 changed files with 60 additions and 1 deletions
|
@ -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(())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue