aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ. Ryan Stinnett <jryans@gmail.com>2017-04-14 14:04:34 +0800
committerJ. Ryan Stinnett <jryans@gmail.com>2017-04-14 17:22:16 +0800
commit8144aa11635531ecad37d3f1012e8c273c999f3f (patch)
tree32a473566b7e91aa9707aab50d1a6473719f43ea
parent6069e44f02aa748cba885162176204c6455b8259 (diff)
downloadservo-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.rs3
-rw-r--r--components/style/build_gecko.rs2
-rw-r--r--components/style/properties/declaration_block.rs5
-rw-r--r--ports/geckolib/glue.rs46
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