From 9b63fedf59e9133d41c611795640b9a2f50f7262 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Mon, 4 Sep 2017 15:41:16 -0700 Subject: [PATCH 1/2] Don't convert property declarations to lowercase Property declarations are case-sensitive per spec and we should preserve that behavior. --- components/style/stylesheets/font_feature_values_rule.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/style/stylesheets/font_feature_values_rule.rs b/components/style/stylesheets/font_feature_values_rule.rs index 57fc9ccc786..e2adac1fc8b 100644 --- a/components/style/stylesheets/font_feature_values_rule.rs +++ b/components/style/stylesheets/font_feature_values_rule.rs @@ -210,7 +210,7 @@ impl<'a, 'b, 'i, T> DeclarationParser<'i> for FFVDeclarationsParser<'a, 'b, T> -> Result<(), ParseError<'i>> { let value = input.parse_entirely(|i| T::parse(self.context, i))?; let new = FFVDeclaration { - name: Atom::from(&*name).to_ascii_lowercase(), + name: Atom::from(&*name), value: value, }; update_or_push(&mut self.declarations, new); From dd8af182c10a434d9adbd848216560c85f05824e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Mon, 4 Sep 2017 15:43:59 -0700 Subject: [PATCH 2/2] Don't unnecessarily construct gfxFontFeatureValueSet If there is no font feature values inside document we should avoid creating unnecessary objects. --- components/style/gecko/generated/bindings.rs | 10 ++++++---- ports/geckolib/glue.rs | 19 ++++++++++++------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/components/style/gecko/generated/bindings.rs b/components/style/gecko/generated/bindings.rs index d39be9eeea9..ed316513dcb 100644 --- a/components/style/gecko/generated/bindings.rs +++ b/components/style/gecko/generated/bindings.rs @@ -913,6 +913,10 @@ extern "C" { extern "C" { pub fn Gecko_nsFont_Destroy(dst: *mut nsFont); } +extern "C" { + pub fn Gecko_ConstructFontFeatureValueSet() + -> *mut gfxFontFeatureValueSet; +} extern "C" { pub fn Gecko_AppendFeatureValueHashEntry(value_set: *mut gfxFontFeatureValueSet, @@ -2047,10 +2051,8 @@ extern "C" { } extern "C" { pub fn Servo_StyleSet_BuildFontFeatureValueSet(set: - RawServoStyleSetBorrowed, - list: - *mut gfxFontFeatureValueSet) - -> bool; + RawServoStyleSetBorrowed) + -> *mut gfxFontFeatureValueSet; } extern "C" { pub fn Servo_StyleSet_ResolveForDeclarations(set: diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index ec1f896c976..bbc43c63920 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -47,6 +47,7 @@ use style::gecko_bindings::bindings::{ServoCssRulesBorrowed, ServoCssRulesStrong use style::gecko_bindings::bindings::{nsACString, nsAString, nsCSSPropertyIDSetBorrowedMut}; use style::gecko_bindings::bindings::Gecko_AddPropertyToSet; use style::gecko_bindings::bindings::Gecko_AppendPropertyValuePair; +use style::gecko_bindings::bindings::Gecko_ConstructFontFeatureValueSet; use style::gecko_bindings::bindings::Gecko_GetOrCreateFinalKeyframe; use style::gecko_bindings::bindings::Gecko_GetOrCreateInitialKeyframe; use style::gecko_bindings::bindings::Gecko_GetOrCreateKeyframeAtStart; @@ -3555,26 +3556,30 @@ pub extern "C" fn Servo_StyleSet_GetCounterStyleRule(raw_data: RawServoStyleSetB #[no_mangle] pub extern "C" fn Servo_StyleSet_BuildFontFeatureValueSet( - raw_data: RawServoStyleSetBorrowed, - set: *mut gfxFontFeatureValueSet -) -> bool { + raw_data: RawServoStyleSetBorrowed) -> *mut gfxFontFeatureValueSet { let data = PerDocumentStyleData::from_ffi(raw_data).borrow(); let global_style_data = &*GLOBAL_STYLE_DATA; let guard = global_style_data.shared_lock.read(); + let has_rule = data.extra_style_data + .iter_origins() + .any(|(d, _)| !d.font_feature_values.is_empty()); + + if !has_rule { + return ptr::null_mut(); + } + let font_feature_values_iter = data.extra_style_data .iter_origins_rev() .flat_map(|(d, _)| d.font_feature_values.iter()); - let mut any_rule = false; + let set = unsafe { Gecko_ConstructFontFeatureValueSet() }; for src in font_feature_values_iter { - any_rule = true; let rule = src.read_with(&guard); rule.set_at_rules(set); } - - any_rule + set } #[no_mangle]