diff options
author | J. Ryan Stinnett <jryans@gmail.com> | 2017-04-14 14:04:34 +0800 |
---|---|---|
committer | J. Ryan Stinnett <jryans@gmail.com> | 2017-04-14 17:22:16 +0800 |
commit | 8144aa11635531ecad37d3f1012e8c273c999f3f (patch) | |
tree | 32a473566b7e91aa9707aab50d1a6473719f43ea | |
parent | 6069e44f02aa748cba885162176204c6455b8259 (diff) | |
download | servo-8144aa11635531ecad37d3f1012e8c273c999f3f.tar.gz servo-8144aa11635531ecad37d3f1012e8c273c999f3f.zip |
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
-rw-r--r-- | components/script/dom/cssstyledeclaration.rs | 3 | ||||
-rw-r--r-- | components/style/build_gecko.rs | 2 | ||||
-rw-r--r-- | components/style/properties/declaration_block.rs | 5 | ||||
-rw-r--r-- | ports/geckolib/glue.rs | 46 |
4 files changed, 34 insertions, 22 deletions
diff --git a/components/script/dom/cssstyledeclaration.rs b/components/script/dom/cssstyledeclaration.rs index 25b99479b7a..22fd1194034 100644 --- a/components/script/dom/cssstyledeclaration.rs +++ b/components/script/dom/cssstyledeclaration.rs @@ -18,6 +18,7 @@ use servo_url::ServoUrl; use std::ascii::AsciiExt; use std::sync::Arc; use style::attr::AttrValue; +use style::parser::LengthParsingMode; use style::properties::{Importance, PropertyDeclarationBlock, PropertyId, LonghandId, ShorthandId}; use style::properties::{parse_one_declaration, parse_style_attribute}; use style::selector_parser::PseudoElement; @@ -257,7 +258,7 @@ impl CSSStyleDeclaration { let window = self.owner.window(); let result = parse_one_declaration(id, &value, &self.owner.base_url(), - window.css_error_reporter()); + window.css_error_reporter(), LengthParsingMode::Default); // Step 7 let parsed = match result { diff --git a/components/style/build_gecko.rs b/components/style/build_gecko.rs index 65b323ecb16..92d512ee75c 100644 --- a/components/style/build_gecko.rs +++ b/components/style/build_gecko.rs @@ -467,6 +467,7 @@ mod bindings { "mozilla::Side", "mozilla::binding_danger::AssertAndSuppressCleanupPolicy", "RawServoAnimationValueMapBorrowed", + "mozilla::LengthParsingMode", ]; let opaque_types = [ "std::pair__PCCP", @@ -721,6 +722,7 @@ mod bindings { "ServoStyleSheet", "EffectCompositor_CascadeLevel", "UpdateAnimationsTasks", + "LengthParsingMode", ]; struct ArrayType { cpp_type: &'static str, diff --git a/components/style/properties/declaration_block.rs b/components/style/properties/declaration_block.rs index 1eaa49321f3..7c443f99401 100644 --- a/components/style/properties/declaration_block.rs +++ b/components/style/properties/declaration_block.rs @@ -633,13 +633,14 @@ pub fn parse_style_attribute(input: &str, pub fn parse_one_declaration(id: PropertyId, input: &str, url_data: &UrlExtraData, - error_reporter: &ParseErrorReporter) + error_reporter: &ParseErrorReporter, + length_parsing_mode: LengthParsingMode) -> Result<ParsedDeclaration, ()> { let context = ParserContext::new(Origin::Author, url_data, error_reporter, Some(CssRuleType::Style), - LengthParsingMode::Default); + length_parsing_mode); Parser::new(input).parse_entirely(|parser| { ParsedDeclaration::parse(id, &context, parser) .map_err(|_| ()) diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index b3ee9f14374..58d4d8f7a4e 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -71,7 +71,7 @@ use style::gecko_properties::{self, style_structs}; use style::keyframes::KeyframesStepValue; use style::media_queries::{MediaList, parse_media_query_list}; use style::parallel; -use style::parser::ParserContext; +use style::parser::{LengthParsingMode, ParserContext}; use style::properties::{CascadeFlags, ComputedValues, Importance, ParsedDeclaration}; use style::properties::{PropertyDeclarationBlock, PropertyId}; 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 reporter = StdoutErrorReporter; 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)) { 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 reporter = StdoutErrorReporter; 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() }; match transition_timing_function::single_value::parse(&context, &mut Parser::new(&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, - 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 url_data = unsafe { RefPtr::from_ptr_ref(&data) }; - if let Ok(parsed) = parse_one_declaration(property_id, value, url_data, - &StdoutErrorReporter) { + let length_parsing_mode = match length_parsing_mode { + 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 }; write_locked_arc(declarations, |decls: &mut PropertyDeclarationBlock| { parsed.expand_set_into(decls, importance) @@ -1177,19 +1181,19 @@ fn set_property(declarations: RawServoDeclarationBlockBorrowed, property_id: Pro #[no_mangle] pub extern "C" fn Servo_DeclarationBlock_SetProperty(declarations: RawServoDeclarationBlockBorrowed, property: *const nsACString, value: *const nsACString, - is_important: bool, - data: *mut URLExtraData) -> bool { + is_important: bool, data: *mut URLExtraData, + length_parsing_mode: structs::LengthParsingMode) -> bool { set_property(declarations, get_property_id_from_property!(property, false), - value, is_important, data) + value, is_important, data, length_parsing_mode) } #[no_mangle] pub extern "C" fn Servo_DeclarationBlock_SetPropertyById(declarations: RawServoDeclarationBlockBorrowed, property: nsCSSPropertyID, value: *const nsACString, - is_important: bool, - data: *mut URLExtraData) -> bool { + is_important: bool, data: *mut URLExtraData, + length_parsing_mode: structs::LengthParsingMode) -> bool { 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) { @@ -1248,7 +1252,8 @@ pub extern "C" fn Servo_MediaList_SetText(list: RawServoMediaListBorrowed, text: let mut parser = Parser::new(&text); let url_data = unsafe { dummy_url_data() }; 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 = 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 url_data = unsafe { dummy_url_data() }; 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.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 url_data = unsafe { dummy_url_data() }; 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)) } @@ -1642,7 +1649,7 @@ pub extern "C" fn Servo_DeclarationBlock_SetBackgroundImage(declarations: let string = unsafe { (*value).to_string() }; let error_reporter = StdoutErrorReporter; 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) { let decl = PropertyDeclaration::BackgroundImage(BackgroundImage( 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 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] @@ -1691,7 +1698,8 @@ pub extern "C" fn Servo_CSSSupports(cond: *const nsACString) -> bool { if let Ok(cond) = cond { let url_data = unsafe { dummy_url_data() }; 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) } else { false |