mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
geckolib: Add FFI function to parse a @counter-style name.
This commit is contained in:
parent
1e0b216ea0
commit
374f0091c1
3 changed files with 37 additions and 11 deletions
|
@ -22,8 +22,12 @@ use std::ops::Range;
|
||||||
use style_traits::{Comma, OneOrMoreSeparated, ParseError, StyleParseErrorKind, ToCss};
|
use style_traits::{Comma, OneOrMoreSeparated, ParseError, StyleParseErrorKind, ToCss};
|
||||||
use values::CustomIdent;
|
use values::CustomIdent;
|
||||||
|
|
||||||
/// Parse the prelude of an @counter-style rule
|
/// Parse a counter style name reference.
|
||||||
pub fn parse_counter_style_name<'i, 't>(input: &mut Parser<'i, 't>) -> Result<CustomIdent, ParseError<'i>> {
|
///
|
||||||
|
/// This allows the reserved counter style names "decimal" and "disc".
|
||||||
|
pub fn parse_counter_style_name<'i, 't>(
|
||||||
|
input: &mut Parser<'i, 't>
|
||||||
|
) -> Result<CustomIdent, ParseError<'i>> {
|
||||||
macro_rules! predefined {
|
macro_rules! predefined {
|
||||||
($($name: expr,)+) => {
|
($($name: expr,)+) => {
|
||||||
{
|
{
|
||||||
|
@ -41,7 +45,7 @@ pub fn parse_counter_style_name<'i, 't>(input: &mut Parser<'i, 't>) -> Result<Cu
|
||||||
if let Some(&lower_cased) = predefined(&ident) {
|
if let Some(&lower_cased) = predefined(&ident) {
|
||||||
Ok(CustomIdent(Atom::from(lower_cased)))
|
Ok(CustomIdent(Atom::from(lower_cased)))
|
||||||
} else {
|
} else {
|
||||||
// https://github.com/w3c/csswg-drafts/issues/1295 excludes "none"
|
// none is always an invalid <counter-style> value.
|
||||||
CustomIdent::from_ident(location, ident, &["none"])
|
CustomIdent::from_ident(location, ident, &["none"])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,6 +54,20 @@ pub fn parse_counter_style_name<'i, 't>(input: &mut Parser<'i, 't>) -> Result<Cu
|
||||||
include!("predefined.rs")
|
include!("predefined.rs")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Parse the prelude of an @counter-style rule
|
||||||
|
pub fn parse_counter_style_name_definition<'i, 't>(
|
||||||
|
input: &mut Parser<'i, 't>
|
||||||
|
) -> Result<CustomIdent, ParseError<'i>> {
|
||||||
|
parse_counter_style_name(input)
|
||||||
|
.and_then(|ident| {
|
||||||
|
if ident.0 == atom!("decimal") || ident.0 == atom!("disc") {
|
||||||
|
Err(input.new_custom_error(StyleParseErrorKind::UnspecifiedError))
|
||||||
|
} else {
|
||||||
|
Ok(ident)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
/// Parse the body (inside `{}`) of an @counter-style rule
|
/// Parse the body (inside `{}`) of an @counter-style rule
|
||||||
pub fn parse_counter_style_body<'i, 't, R>(name: CustomIdent,
|
pub fn parse_counter_style_body<'i, 't, R>(name: CustomIdent,
|
||||||
context: &ParserContext,
|
context: &ParserContext,
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//! Parsing of the stylesheet contents.
|
//! Parsing of the stylesheet contents.
|
||||||
|
|
||||||
use {Namespace, Prefix};
|
use {Namespace, Prefix};
|
||||||
use counter_style::{parse_counter_style_body, parse_counter_style_name};
|
use counter_style::{parse_counter_style_body, parse_counter_style_name_definition};
|
||||||
use cssparser::{AtRuleParser, AtRuleType, Parser, QualifiedRuleParser, RuleListParser};
|
use cssparser::{AtRuleParser, AtRuleType, Parser, QualifiedRuleParser, RuleListParser};
|
||||||
use cssparser::{CowRcStr, SourceLocation, BasicParseError, BasicParseErrorKind};
|
use cssparser::{CowRcStr, SourceLocation, BasicParseError, BasicParseErrorKind};
|
||||||
use error_reporting::{ContextualParseError, ParseErrorReporter};
|
use error_reporting::{ContextualParseError, ParseErrorReporter};
|
||||||
|
@ -383,13 +383,7 @@ impl<'a, 'b, 'i, R: ParseErrorReporter> AtRuleParser<'i> for NestedRuleParser<'a
|
||||||
// Support for this rule is not fully implemented in Servo yet.
|
// Support for this rule is not fully implemented in Servo yet.
|
||||||
return Err(input.new_custom_error(StyleParseErrorKind::UnsupportedAtRule(name.clone())))
|
return Err(input.new_custom_error(StyleParseErrorKind::UnsupportedAtRule(name.clone())))
|
||||||
}
|
}
|
||||||
let name = parse_counter_style_name(input)?;
|
let name = parse_counter_style_name_definition(input)?;
|
||||||
// ASCII-case-insensitive matches for "decimal" and "disc".
|
|
||||||
// The name is already lower-cased by `parse_counter_style_name`
|
|
||||||
// so we can use == here.
|
|
||||||
if name.0 == atom!("decimal") || name.0 == atom!("disc") {
|
|
||||||
return Err(input.new_custom_error(StyleParseErrorKind::UnspecifiedError))
|
|
||||||
}
|
|
||||||
Ok(AtRuleType::WithBlock(AtRuleBlockPrelude::CounterStyle(name)))
|
Ok(AtRuleType::WithBlock(AtRuleBlockPrelude::CounterStyle(name)))
|
||||||
},
|
},
|
||||||
"viewport" => {
|
"viewport" => {
|
||||||
|
|
|
@ -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;
|
||||||
|
@ -4735,3 +4736,16 @@ 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);
|
||||||
|
let mut parser = Parser::new(&mut input);
|
||||||
|
match parser.parse_entirely(counter_style::parse_counter_style_name_definition) {
|
||||||
|
Ok(name) => name.0.into_addrefed(),
|
||||||
|
Err(_) => ptr::null_mut(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue