mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Expose CSS length mode in Stylo glue
Add length mode args to Stylo glue functions so that Gecko can enable the special SVG mode as needed. MozReview-Commit-ID: 1luM13MFEXX
This commit is contained in:
parent
6069e44f02
commit
8144aa1163
4 changed files with 34 additions and 22 deletions
|
@ -18,6 +18,7 @@ use servo_url::ServoUrl;
|
||||||
use std::ascii::AsciiExt;
|
use std::ascii::AsciiExt;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use style::attr::AttrValue;
|
use style::attr::AttrValue;
|
||||||
|
use style::parser::LengthParsingMode;
|
||||||
use style::properties::{Importance, PropertyDeclarationBlock, PropertyId, LonghandId, ShorthandId};
|
use style::properties::{Importance, PropertyDeclarationBlock, PropertyId, LonghandId, ShorthandId};
|
||||||
use style::properties::{parse_one_declaration, parse_style_attribute};
|
use style::properties::{parse_one_declaration, parse_style_attribute};
|
||||||
use style::selector_parser::PseudoElement;
|
use style::selector_parser::PseudoElement;
|
||||||
|
@ -257,7 +258,7 @@ impl CSSStyleDeclaration {
|
||||||
let window = self.owner.window();
|
let window = self.owner.window();
|
||||||
let result =
|
let result =
|
||||||
parse_one_declaration(id, &value, &self.owner.base_url(),
|
parse_one_declaration(id, &value, &self.owner.base_url(),
|
||||||
window.css_error_reporter());
|
window.css_error_reporter(), LengthParsingMode::Default);
|
||||||
|
|
||||||
// Step 7
|
// Step 7
|
||||||
let parsed = match result {
|
let parsed = match result {
|
||||||
|
|
|
@ -467,6 +467,7 @@ mod bindings {
|
||||||
"mozilla::Side",
|
"mozilla::Side",
|
||||||
"mozilla::binding_danger::AssertAndSuppressCleanupPolicy",
|
"mozilla::binding_danger::AssertAndSuppressCleanupPolicy",
|
||||||
"RawServoAnimationValueMapBorrowed",
|
"RawServoAnimationValueMapBorrowed",
|
||||||
|
"mozilla::LengthParsingMode",
|
||||||
];
|
];
|
||||||
let opaque_types = [
|
let opaque_types = [
|
||||||
"std::pair__PCCP",
|
"std::pair__PCCP",
|
||||||
|
@ -721,6 +722,7 @@ mod bindings {
|
||||||
"ServoStyleSheet",
|
"ServoStyleSheet",
|
||||||
"EffectCompositor_CascadeLevel",
|
"EffectCompositor_CascadeLevel",
|
||||||
"UpdateAnimationsTasks",
|
"UpdateAnimationsTasks",
|
||||||
|
"LengthParsingMode",
|
||||||
];
|
];
|
||||||
struct ArrayType {
|
struct ArrayType {
|
||||||
cpp_type: &'static str,
|
cpp_type: &'static str,
|
||||||
|
|
|
@ -633,13 +633,14 @@ pub fn parse_style_attribute(input: &str,
|
||||||
pub fn parse_one_declaration(id: PropertyId,
|
pub fn parse_one_declaration(id: PropertyId,
|
||||||
input: &str,
|
input: &str,
|
||||||
url_data: &UrlExtraData,
|
url_data: &UrlExtraData,
|
||||||
error_reporter: &ParseErrorReporter)
|
error_reporter: &ParseErrorReporter,
|
||||||
|
length_parsing_mode: LengthParsingMode)
|
||||||
-> Result<ParsedDeclaration, ()> {
|
-> Result<ParsedDeclaration, ()> {
|
||||||
let context = ParserContext::new(Origin::Author,
|
let context = ParserContext::new(Origin::Author,
|
||||||
url_data,
|
url_data,
|
||||||
error_reporter,
|
error_reporter,
|
||||||
Some(CssRuleType::Style),
|
Some(CssRuleType::Style),
|
||||||
LengthParsingMode::Default);
|
length_parsing_mode);
|
||||||
Parser::new(input).parse_entirely(|parser| {
|
Parser::new(input).parse_entirely(|parser| {
|
||||||
ParsedDeclaration::parse(id, &context, parser)
|
ParsedDeclaration::parse(id, &context, parser)
|
||||||
.map_err(|_| ())
|
.map_err(|_| ())
|
||||||
|
|
|
@ -71,7 +71,7 @@ use style::gecko_properties::{self, style_structs};
|
||||||
use style::keyframes::KeyframesStepValue;
|
use style::keyframes::KeyframesStepValue;
|
||||||
use style::media_queries::{MediaList, parse_media_query_list};
|
use style::media_queries::{MediaList, parse_media_query_list};
|
||||||
use style::parallel;
|
use style::parallel;
|
||||||
use style::parser::ParserContext;
|
use style::parser::{LengthParsingMode, ParserContext};
|
||||||
use style::properties::{CascadeFlags, ComputedValues, Importance, ParsedDeclaration};
|
use style::properties::{CascadeFlags, ComputedValues, Importance, ParsedDeclaration};
|
||||||
use style::properties::{PropertyDeclarationBlock, PropertyId};
|
use style::properties::{PropertyDeclarationBlock, PropertyId};
|
||||||
use style::properties::SKIP_ROOT_AND_ITEM_BASED_DISPLAY_FIXUP;
|
use style::properties::SKIP_ROOT_AND_ITEM_BASED_DISPLAY_FIXUP;
|
||||||
|
@ -1004,7 +1004,7 @@ pub extern "C" fn Servo_ParseProperty(property: *const nsACString, value: *const
|
||||||
let url_data = unsafe { RefPtr::from_ptr_ref(&data) };
|
let url_data = unsafe { RefPtr::from_ptr_ref(&data) };
|
||||||
let reporter = StdoutErrorReporter;
|
let reporter = StdoutErrorReporter;
|
||||||
let context = ParserContext::new(Origin::Author, url_data, &reporter,
|
let context = ParserContext::new(Origin::Author, url_data, &reporter,
|
||||||
Some(CssRuleType::Style), LengthMode::Default);
|
Some(CssRuleType::Style), LengthParsingMode::Default);
|
||||||
|
|
||||||
match ParsedDeclaration::parse(id, &context, &mut Parser::new(value)) {
|
match ParsedDeclaration::parse(id, &context, &mut Parser::new(value)) {
|
||||||
Ok(parsed) => {
|
Ok(parsed) => {
|
||||||
|
@ -1027,7 +1027,7 @@ pub extern "C" fn Servo_ParseEasing(easing: *const nsAString,
|
||||||
let url_data = unsafe { RefPtr::from_ptr_ref(&data) };
|
let url_data = unsafe { RefPtr::from_ptr_ref(&data) };
|
||||||
let reporter = StdoutErrorReporter;
|
let reporter = StdoutErrorReporter;
|
||||||
let context = ParserContext::new(Origin::Author, url_data, &reporter,
|
let context = ParserContext::new(Origin::Author, url_data, &reporter,
|
||||||
Some(CssRuleType::Style), LengthMode::Default);
|
Some(CssRuleType::Style), LengthParsingMode::Default);
|
||||||
let easing = unsafe { (*easing).to_string() };
|
let easing = unsafe { (*easing).to_string() };
|
||||||
match transition_timing_function::single_value::parse(&context, &mut Parser::new(&easing)) {
|
match transition_timing_function::single_value::parse(&context, &mut Parser::new(&easing)) {
|
||||||
Ok(parsed_easing) => {
|
Ok(parsed_easing) => {
|
||||||
|
@ -1159,12 +1159,16 @@ pub extern "C" fn Servo_DeclarationBlock_GetPropertyIsImportant(declarations: Ra
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_property(declarations: RawServoDeclarationBlockBorrowed, property_id: PropertyId,
|
fn set_property(declarations: RawServoDeclarationBlockBorrowed, property_id: PropertyId,
|
||||||
value: *const nsACString, is_important: bool, data: *mut URLExtraData) -> bool {
|
value: *const nsACString, is_important: bool, data: *mut URLExtraData,
|
||||||
|
length_parsing_mode: structs::LengthParsingMode) -> bool {
|
||||||
let value = unsafe { value.as_ref().unwrap().as_str_unchecked() };
|
let value = unsafe { value.as_ref().unwrap().as_str_unchecked() };
|
||||||
|
|
||||||
let url_data = unsafe { RefPtr::from_ptr_ref(&data) };
|
let url_data = unsafe { RefPtr::from_ptr_ref(&data) };
|
||||||
if let Ok(parsed) = parse_one_declaration(property_id, value, url_data,
|
let length_parsing_mode = match length_parsing_mode {
|
||||||
&StdoutErrorReporter) {
|
structs::LengthParsingMode::Default => LengthParsingMode::Default,
|
||||||
|
structs::LengthParsingMode::SVG => LengthParsingMode::SVG,
|
||||||
|
};
|
||||||
|
if let Ok(parsed) = parse_one_declaration(property_id, value, url_data, &StdoutErrorReporter,
|
||||||
|
length_parsing_mode) {
|
||||||
let importance = if is_important { Importance::Important } else { Importance::Normal };
|
let importance = if is_important { Importance::Important } else { Importance::Normal };
|
||||||
write_locked_arc(declarations, |decls: &mut PropertyDeclarationBlock| {
|
write_locked_arc(declarations, |decls: &mut PropertyDeclarationBlock| {
|
||||||
parsed.expand_set_into(decls, importance)
|
parsed.expand_set_into(decls, importance)
|
||||||
|
@ -1177,19 +1181,19 @@ fn set_property(declarations: RawServoDeclarationBlockBorrowed, property_id: Pro
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn Servo_DeclarationBlock_SetProperty(declarations: RawServoDeclarationBlockBorrowed,
|
pub extern "C" fn Servo_DeclarationBlock_SetProperty(declarations: RawServoDeclarationBlockBorrowed,
|
||||||
property: *const nsACString, value: *const nsACString,
|
property: *const nsACString, value: *const nsACString,
|
||||||
is_important: bool,
|
is_important: bool, data: *mut URLExtraData,
|
||||||
data: *mut URLExtraData) -> bool {
|
length_parsing_mode: structs::LengthParsingMode) -> bool {
|
||||||
set_property(declarations, get_property_id_from_property!(property, false),
|
set_property(declarations, get_property_id_from_property!(property, false),
|
||||||
value, is_important, data)
|
value, is_important, data, length_parsing_mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn Servo_DeclarationBlock_SetPropertyById(declarations: RawServoDeclarationBlockBorrowed,
|
pub extern "C" fn Servo_DeclarationBlock_SetPropertyById(declarations: RawServoDeclarationBlockBorrowed,
|
||||||
property: nsCSSPropertyID, value: *const nsACString,
|
property: nsCSSPropertyID, value: *const nsACString,
|
||||||
is_important: bool,
|
is_important: bool, data: *mut URLExtraData,
|
||||||
data: *mut URLExtraData) -> bool {
|
length_parsing_mode: structs::LengthParsingMode) -> bool {
|
||||||
set_property(declarations, get_property_id_from_nscsspropertyid!(property, false),
|
set_property(declarations, get_property_id_from_nscsspropertyid!(property, false),
|
||||||
value, is_important, data)
|
value, is_important, data, length_parsing_mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn remove_property(declarations: RawServoDeclarationBlockBorrowed, property_id: PropertyId) {
|
fn remove_property(declarations: RawServoDeclarationBlockBorrowed, property_id: PropertyId) {
|
||||||
|
@ -1248,7 +1252,8 @@ pub extern "C" fn Servo_MediaList_SetText(list: RawServoMediaListBorrowed, text:
|
||||||
let mut parser = Parser::new(&text);
|
let mut parser = Parser::new(&text);
|
||||||
let url_data = unsafe { dummy_url_data() };
|
let url_data = unsafe { dummy_url_data() };
|
||||||
let reporter = StdoutErrorReporter;
|
let reporter = StdoutErrorReporter;
|
||||||
let context = ParserContext::new_for_cssom(url_data, &reporter, Some(CssRuleType::Media), LengthMode::Default);
|
let context = ParserContext::new_for_cssom(url_data, &reporter, Some(CssRuleType::Media),
|
||||||
|
LengthParsingMode::Default);
|
||||||
write_locked_arc(list, |list: &mut MediaList| {
|
write_locked_arc(list, |list: &mut MediaList| {
|
||||||
*list = parse_media_query_list(&context, &mut parser);
|
*list = parse_media_query_list(&context, &mut parser);
|
||||||
})
|
})
|
||||||
|
@ -1278,7 +1283,8 @@ pub extern "C" fn Servo_MediaList_AppendMedium(list: RawServoMediaListBorrowed,
|
||||||
let new_medium = unsafe { new_medium.as_ref().unwrap().as_str_unchecked() };
|
let new_medium = unsafe { new_medium.as_ref().unwrap().as_str_unchecked() };
|
||||||
let url_data = unsafe { dummy_url_data() };
|
let url_data = unsafe { dummy_url_data() };
|
||||||
let reporter = StdoutErrorReporter;
|
let reporter = StdoutErrorReporter;
|
||||||
let context = ParserContext::new_for_cssom(url_data, &reporter, Some(CssRuleType::Media), LengthMode::Default);
|
let context = ParserContext::new_for_cssom(url_data, &reporter, Some(CssRuleType::Media),
|
||||||
|
LengthParsingMode::Default);
|
||||||
write_locked_arc(list, |list: &mut MediaList| {
|
write_locked_arc(list, |list: &mut MediaList| {
|
||||||
list.append_medium(&context, new_medium);
|
list.append_medium(&context, new_medium);
|
||||||
})
|
})
|
||||||
|
@ -1290,7 +1296,8 @@ pub extern "C" fn Servo_MediaList_DeleteMedium(list: RawServoMediaListBorrowed,
|
||||||
let old_medium = unsafe { old_medium.as_ref().unwrap().as_str_unchecked() };
|
let old_medium = unsafe { old_medium.as_ref().unwrap().as_str_unchecked() };
|
||||||
let url_data = unsafe { dummy_url_data() };
|
let url_data = unsafe { dummy_url_data() };
|
||||||
let reporter = StdoutErrorReporter;
|
let reporter = StdoutErrorReporter;
|
||||||
let context = ParserContext::new_for_cssom(url_data, &reporter, Some(CssRuleType::Media), LengthMode::Default);
|
let context = ParserContext::new_for_cssom(url_data, &reporter, Some(CssRuleType::Media),
|
||||||
|
LengthParsingMode::Default);
|
||||||
write_locked_arc(list, |list: &mut MediaList| list.delete_medium(&context, old_medium))
|
write_locked_arc(list, |list: &mut MediaList| list.delete_medium(&context, old_medium))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1642,7 +1649,7 @@ pub extern "C" fn Servo_DeclarationBlock_SetBackgroundImage(declarations:
|
||||||
let string = unsafe { (*value).to_string() };
|
let string = unsafe { (*value).to_string() };
|
||||||
let error_reporter = StdoutErrorReporter;
|
let error_reporter = StdoutErrorReporter;
|
||||||
let context = ParserContext::new(Origin::Author, url_data, &error_reporter,
|
let context = ParserContext::new(Origin::Author, url_data, &error_reporter,
|
||||||
Some(CssRuleType::Style), LengthMode::Default);
|
Some(CssRuleType::Style), LengthParsingMode::Default);
|
||||||
if let Ok(url) = SpecifiedUrl::parse_from_string(string.into(), &context) {
|
if let Ok(url) = SpecifiedUrl::parse_from_string(string.into(), &context) {
|
||||||
let decl = PropertyDeclaration::BackgroundImage(BackgroundImage(
|
let decl = PropertyDeclaration::BackgroundImage(BackgroundImage(
|
||||||
vec![SingleBackgroundImage(
|
vec![SingleBackgroundImage(
|
||||||
|
@ -1680,7 +1687,7 @@ pub extern "C" fn Servo_CSSSupports2(property: *const nsACString, value: *const
|
||||||
let value = unsafe { value.as_ref().unwrap().as_str_unchecked() };
|
let value = unsafe { value.as_ref().unwrap().as_str_unchecked() };
|
||||||
|
|
||||||
let url_data = unsafe { dummy_url_data() };
|
let url_data = unsafe { dummy_url_data() };
|
||||||
parse_one_declaration(id, &value, url_data, &StdoutErrorReporter).is_ok()
|
parse_one_declaration(id, &value, url_data, &StdoutErrorReporter, LengthParsingMode::Default).is_ok()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
@ -1691,7 +1698,8 @@ pub extern "C" fn Servo_CSSSupports(cond: *const nsACString) -> bool {
|
||||||
if let Ok(cond) = cond {
|
if let Ok(cond) = cond {
|
||||||
let url_data = unsafe { dummy_url_data() };
|
let url_data = unsafe { dummy_url_data() };
|
||||||
let reporter = StdoutErrorReporter;
|
let reporter = StdoutErrorReporter;
|
||||||
let context = ParserContext::new_for_cssom(url_data, &reporter, Some(CssRuleType::Style), LengthMode::Default);
|
let context = ParserContext::new_for_cssom(url_data, &reporter, Some(CssRuleType::Style),
|
||||||
|
LengthParsingMode::Default);
|
||||||
cond.eval(&context)
|
cond.eval(&context)
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue