mirror of
https://github.com/servo/servo.git
synced 2025-08-07 06:25:32 +01:00
Auto merge of #19441 - heycam:counter-parse, r=upsuper
add FFI functions for Gecko @counter-style value parsing Servo-side part of https://bugzilla.mozilla.org/show_bug.cgi?id=1420117, reviewed there by Xidorn. <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/19441) <!-- Reviewable:end -->
This commit is contained in:
commit
221d72a81e
5 changed files with 344 additions and 846 deletions
|
@ -11,7 +11,7 @@ use cssparser::{AtRuleParser, DeclarationListParser, DeclarationParser};
|
||||||
use cssparser::{Parser, Token, serialize_identifier, CowRcStr};
|
use cssparser::{Parser, Token, serialize_identifier, CowRcStr};
|
||||||
use error_reporting::{ContextualParseError, ParseErrorReporter};
|
use error_reporting::{ContextualParseError, ParseErrorReporter};
|
||||||
#[cfg(feature = "gecko")] use gecko::rules::CounterStyleDescriptors;
|
#[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 parser::{ParserContext, ParserErrorContext, Parse};
|
||||||
use selectors::parser::SelectorParseErrorKind;
|
use selectors::parser::SelectorParseErrorKind;
|
||||||
use shared_lock::{SharedRwLockReadGuard, ToCssWithGuard};
|
use shared_lock::{SharedRwLockReadGuard, ToCssWithGuard};
|
||||||
|
@ -225,6 +225,30 @@ macro_rules! counter_style_descriptors {
|
||||||
dest.write_str("}")
|
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(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -564,6 +564,8 @@ cfg_if! {
|
||||||
pub static nsGkAtoms_dateTime: *mut nsStaticAtom;
|
pub static nsGkAtoms_dateTime: *mut nsStaticAtom;
|
||||||
#[link_name = "_ZN9nsGkAtoms11datasourcesE"]
|
#[link_name = "_ZN9nsGkAtoms11datasourcesE"]
|
||||||
pub static nsGkAtoms_datasources: *mut nsStaticAtom;
|
pub static nsGkAtoms_datasources: *mut nsStaticAtom;
|
||||||
|
#[link_name = "_ZN9nsGkAtoms4dateE"]
|
||||||
|
pub static nsGkAtoms_date: *mut nsStaticAtom;
|
||||||
#[link_name = "_ZN9nsGkAtoms8datetimeE"]
|
#[link_name = "_ZN9nsGkAtoms8datetimeE"]
|
||||||
pub static nsGkAtoms_datetime: *mut nsStaticAtom;
|
pub static nsGkAtoms_datetime: *mut nsStaticAtom;
|
||||||
#[link_name = "_ZN9nsGkAtoms11datetimeboxE"]
|
#[link_name = "_ZN9nsGkAtoms11datetimeboxE"]
|
||||||
|
@ -5749,6 +5751,8 @@ cfg_if! {
|
||||||
pub static nsGkAtoms_dateTime: *mut nsStaticAtom;
|
pub static nsGkAtoms_dateTime: *mut nsStaticAtom;
|
||||||
#[link_name = "?datasources@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
|
#[link_name = "?datasources@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
|
||||||
pub static nsGkAtoms_datasources: *mut nsStaticAtom;
|
pub static nsGkAtoms_datasources: *mut nsStaticAtom;
|
||||||
|
#[link_name = "?date@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
|
||||||
|
pub static nsGkAtoms_date: *mut nsStaticAtom;
|
||||||
#[link_name = "?datetime@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
|
#[link_name = "?datetime@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
|
||||||
pub static nsGkAtoms_datetime: *mut nsStaticAtom;
|
pub static nsGkAtoms_datetime: *mut nsStaticAtom;
|
||||||
#[link_name = "?datetimebox@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
|
#[link_name = "?datetimebox@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
|
||||||
|
@ -10934,6 +10938,8 @@ cfg_if! {
|
||||||
pub static nsGkAtoms_dateTime: *mut nsStaticAtom;
|
pub static nsGkAtoms_dateTime: *mut nsStaticAtom;
|
||||||
#[link_name = "\x01?datasources@nsGkAtoms@@2PAVnsStaticAtom@@A"]
|
#[link_name = "\x01?datasources@nsGkAtoms@@2PAVnsStaticAtom@@A"]
|
||||||
pub static nsGkAtoms_datasources: *mut nsStaticAtom;
|
pub static nsGkAtoms_datasources: *mut nsStaticAtom;
|
||||||
|
#[link_name = "\x01?date@nsGkAtoms@@2PAVnsStaticAtom@@A"]
|
||||||
|
pub static nsGkAtoms_date: *mut nsStaticAtom;
|
||||||
#[link_name = "\x01?datetime@nsGkAtoms@@2PAVnsStaticAtom@@A"]
|
#[link_name = "\x01?datetime@nsGkAtoms@@2PAVnsStaticAtom@@A"]
|
||||||
pub static nsGkAtoms_datetime: *mut nsStaticAtom;
|
pub static nsGkAtoms_datetime: *mut nsStaticAtom;
|
||||||
#[link_name = "\x01?datetimebox@nsGkAtoms@@2PAVnsStaticAtom@@A"]
|
#[link_name = "\x01?datetimebox@nsGkAtoms@@2PAVnsStaticAtom@@A"]
|
||||||
|
@ -16122,6 +16128,8 @@ macro_rules! atom {
|
||||||
{{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_dateTime as *mut _) } }};
|
{{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_dateTime as *mut _) } }};
|
||||||
("datasources") =>
|
("datasources") =>
|
||||||
{{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_datasources as *mut _) } }};
|
{{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_datasources as *mut _) } }};
|
||||||
|
("date") =>
|
||||||
|
{{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_date as *mut _) } }};
|
||||||
("datetime") =>
|
("datetime") =>
|
||||||
{{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_datetime as *mut _) } }};
|
{{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_datetime as *mut _) } }};
|
||||||
("datetimebox") =>
|
("datetimebox") =>
|
||||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
|
@ -18,6 +18,7 @@ use std::ptr;
|
||||||
use style::applicable_declarations::ApplicableDeclarationBlock;
|
use style::applicable_declarations::ApplicableDeclarationBlock;
|
||||||
use style::context::{CascadeInputs, QuirksMode, SharedStyleContext, StyleContext};
|
use style::context::{CascadeInputs, QuirksMode, SharedStyleContext, StyleContext};
|
||||||
use style::context::ThreadLocalStyleContext;
|
use style::context::ThreadLocalStyleContext;
|
||||||
|
use style::counter_style;
|
||||||
use style::data::{ElementStyles, self};
|
use style::data::{ElementStyles, self};
|
||||||
use style::dom::{ShowSubtreeData, TDocument, TElement, TNode};
|
use style::dom::{ShowSubtreeData, TDocument, TElement, TNode};
|
||||||
use style::driver;
|
use style::driver;
|
||||||
|
@ -104,6 +105,8 @@ use style::gecko_bindings::structs::ServoTraversalFlags;
|
||||||
use style::gecko_bindings::structs::StyleRuleInclusion;
|
use style::gecko_bindings::structs::StyleRuleInclusion;
|
||||||
use style::gecko_bindings::structs::URLExtraData;
|
use style::gecko_bindings::structs::URLExtraData;
|
||||||
use style::gecko_bindings::structs::gfxFontFeatureValueSet;
|
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::nsCSSValueSharedList;
|
||||||
use style::gecko_bindings::structs::nsCompatibility;
|
use style::gecko_bindings::structs::nsCompatibility;
|
||||||
use style::gecko_bindings::structs::nsIDocument;
|
use style::gecko_bindings::structs::nsIDocument;
|
||||||
|
@ -4735,3 +4738,48 @@ pub unsafe extern "C" fn Servo_SourceSizeList_Evaluate(
|
||||||
pub unsafe extern "C" fn Servo_SourceSizeList_Drop(list: RawServoSourceSizeListOwned) {
|
pub unsafe extern "C" fn Servo_SourceSizeList_Drop(list: RawServoSourceSizeListOwned) {
|
||||||
let _ = list.into_box::<SourceSizeList>();
|
let _ = list.into_box::<SourceSizeList>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn Servo_ParseCounterStyleName(
|
||||||
|
value: *const nsACString,
|
||||||
|
) -> *mut nsAtom {
|
||||||
|
let value = unsafe { value.as_ref().unwrap().as_str_unchecked() };
|
||||||
|
let mut input = ParserInput::new(&value);
|
||||||
|
match Parser::new(&mut input).parse_entirely(counter_style::parse_counter_style_name) {
|
||||||
|
Ok(name) => name.0.into_addrefed(),
|
||||||
|
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