mirror of
https://github.com/servo/servo.git
synced 2025-06-19 06:38:59 +01:00
Implement the Servo parser for font descriptors Web API.
According to the spec, this parser should follow what we do for @font_face rule, so we use the same type to parse the input, instead of using the parser of their specified values.
This commit is contained in:
parent
8f30880d36
commit
1e29e64000
3 changed files with 992 additions and 326 deletions
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
|
@ -77,6 +77,7 @@ use style::gecko_bindings::bindings::RawServoDeclarationBlockBorrowedOrNull;
|
|||
use style::gecko_bindings::bindings::RawServoStyleRuleBorrowed;
|
||||
use style::gecko_bindings::bindings::RawServoStyleSet;
|
||||
use style::gecko_bindings::bindings::ServoStyleContextBorrowedOrNull;
|
||||
use style::gecko_bindings::bindings::nsCSSValueBorrowedMut;
|
||||
use style::gecko_bindings::bindings::nsTArrayBorrowed_uintptr_t;
|
||||
use style::gecko_bindings::bindings::nsTimingFunctionBorrowed;
|
||||
use style::gecko_bindings::bindings::nsTimingFunctionBorrowedMut;
|
||||
|
@ -85,7 +86,7 @@ use style::gecko_bindings::structs::{CallerType, CSSPseudoElementType, Composite
|
|||
use style::gecko_bindings::structs::{Loader, LoaderReusableStyleSheets};
|
||||
use style::gecko_bindings::structs::{RawServoStyleRule, ServoStyleContextStrong, RustString};
|
||||
use style::gecko_bindings::structs::{ServoStyleSheet, SheetParsingMode, nsAtom, nsCSSPropertyID};
|
||||
use style::gecko_bindings::structs::{nsCSSFontFaceRule, nsCSSCounterStyleRule};
|
||||
use style::gecko_bindings::structs::{nsCSSFontDesc, nsCSSFontFaceRule, nsCSSCounterStyleRule};
|
||||
use style::gecko_bindings::structs::{nsRestyleHint, nsChangeHint, PropertyValuePair};
|
||||
use style::gecko_bindings::structs::AtomArray;
|
||||
use style::gecko_bindings::structs::IterationCompositeOperation;
|
||||
|
@ -4734,6 +4735,81 @@ pub extern "C" fn Servo_ParseTransformIntoMatrix(
|
|||
true
|
||||
}
|
||||
|
||||
// https://drafts.csswg.org/css-font-loading/#dom-fontface-fontface
|
||||
#[no_mangle]
|
||||
pub extern "C" fn Servo_ParseFontDescriptor(
|
||||
desc_id: nsCSSFontDesc,
|
||||
value: *const nsAString,
|
||||
data: *mut URLExtraData,
|
||||
result: nsCSSValueBorrowedMut,
|
||||
) -> bool {
|
||||
use cssparser::UnicodeRange;
|
||||
use self::nsCSSFontDesc::*;
|
||||
use style::computed_values::{font_feature_settings, font_stretch, font_style};
|
||||
use style::font_face::{FontDisplay, FontWeight, Source};
|
||||
use style::properties::longhands::font_language_override;
|
||||
use style::values::computed::font::FamilyName;
|
||||
|
||||
let string = unsafe { (*value).to_string() };
|
||||
let mut input = ParserInput::new(&string);
|
||||
let mut parser = Parser::new(&mut input);
|
||||
let url_data = unsafe { RefPtr::from_ptr_ref(&data) };
|
||||
let context = ParserContext::new(
|
||||
Origin::Author,
|
||||
url_data,
|
||||
Some(CssRuleType::FontFace),
|
||||
ParsingMode::DEFAULT,
|
||||
QuirksMode::NoQuirks,
|
||||
);
|
||||
|
||||
macro_rules! parse_font_desc {
|
||||
(
|
||||
valid = [ $( $v_enum_name: ident / $t: ty, )* ]
|
||||
invalid = [ $( $i_enum_name: ident, )* ]
|
||||
) => {
|
||||
match desc_id {
|
||||
$(
|
||||
$v_enum_name => {
|
||||
let f = match parser.parse_entirely(|i| <$t as Parse>::parse(&context, i)) {
|
||||
Ok(f) => f,
|
||||
Err(..) => return false,
|
||||
};
|
||||
result.set_from(f);
|
||||
},
|
||||
)*
|
||||
$(
|
||||
$i_enum_name => {
|
||||
debug_assert!(false, "$i_enum_name is not a valid font descriptor");
|
||||
return false;
|
||||
},
|
||||
)*
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// We implement the parser of each arm according to the implementation of @font-face rule.
|
||||
// see component/style/font_face.rs for more detail.
|
||||
parse_font_desc!(
|
||||
valid = [
|
||||
eCSSFontDesc_Family / FamilyName,
|
||||
eCSSFontDesc_Style / font_style::T,
|
||||
eCSSFontDesc_Weight / FontWeight,
|
||||
eCSSFontDesc_Stretch / font_stretch::T,
|
||||
eCSSFontDesc_Src / Vec<Source>,
|
||||
eCSSFontDesc_UnicodeRange / Vec<UnicodeRange>,
|
||||
eCSSFontDesc_FontFeatureSettings / font_feature_settings::T,
|
||||
eCSSFontDesc_FontLanguageOverride / font_language_override::SpecifiedValue,
|
||||
eCSSFontDesc_Display / FontDisplay,
|
||||
]
|
||||
invalid = [
|
||||
eCSSFontDesc_UNKNOWN,
|
||||
eCSSFontDesc_COUNT,
|
||||
]
|
||||
);
|
||||
|
||||
true
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn Servo_SourceSizeList_Parse(
|
||||
value: *const nsACString,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue