From f19b9763cf1f0634f1a2733e1ca2b857876c940d Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Fri, 28 Apr 2017 09:10:05 +0800 Subject: [PATCH 1/3] Move GetRules function into macro. --- ports/geckolib/glue.rs | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 492b19eb9cc..4b3c512a1ff 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -780,13 +780,30 @@ macro_rules! impl_basic_rule_funcs { } } +macro_rules! impl_group_rule_funcs { + { ($name:ident, $rule_type:ty, $raw_type:ty), + get_rules: $get_rules:ident, + $($basic:tt)+ + } => { + impl_basic_rule_funcs! { ($name, $rule_type, $raw_type), $($basic)+ } + + #[no_mangle] + pub extern "C" fn $get_rules(rule: &$raw_type) -> ServoCssRulesStrong { + read_locked_arc(rule, |rule: &$rule_type| { + rule.rules.clone().into_strong() + }) + } + } +} + impl_basic_rule_funcs! { (Style, StyleRule, RawServoStyleRule), getter: Servo_CssRules_GetStyleRuleAt, debug: Servo_StyleRule_Debug, to_css: Servo_StyleRule_GetCssText, } -impl_basic_rule_funcs! { (Media, MediaRule, RawServoMediaRule), +impl_group_rule_funcs! { (Media, MediaRule, RawServoMediaRule), + get_rules: Servo_MediaRule_GetRules, getter: Servo_CssRules_GetMediaRuleAt, debug: Servo_MediaRule_Debug, to_css: Servo_MediaRule_GetCssText, @@ -847,13 +864,6 @@ pub extern "C" fn Servo_MediaRule_GetMedia(rule: RawServoMediaRuleBorrowed) -> R }) } -#[no_mangle] -pub extern "C" fn Servo_MediaRule_GetRules(rule: RawServoMediaRuleBorrowed) -> ServoCssRulesStrong { - read_locked_arc(rule, |rule: &MediaRule| { - rule.rules.clone().into_strong() - }) -} - #[no_mangle] pub extern "C" fn Servo_NamespaceRule_GetPrefix(rule: RawServoNamespaceRuleBorrowed) -> *mut nsIAtom { read_locked_arc(rule, |rule: &NamespaceRule| { From 767e10b29dca4a03637fa6523e6662e31304a085 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Fri, 28 Apr 2017 09:10:06 +0800 Subject: [PATCH 2/3] Implement CSSOM support for @supports. --- components/style/gecko/arc_types.rs | 8 ++++++-- ports/geckolib/glue.rs | 18 +++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/components/style/gecko/arc_types.rs b/components/style/gecko/arc_types.rs index f733349e203..134f3d3062f 100644 --- a/components/style/gecko/arc_types.rs +++ b/components/style/gecko/arc_types.rs @@ -9,7 +9,7 @@ #![allow(non_snake_case, missing_docs)] use gecko_bindings::bindings::{RawServoMediaList, RawServoMediaRule, RawServoNamespaceRule, RawServoPageRule}; -use gecko_bindings::bindings::{RawServoStyleSheet, RawServoImportRule}; +use gecko_bindings::bindings::{RawServoStyleSheet, RawServoImportRule, RawServoSupportsRule}; use gecko_bindings::bindings::{ServoComputedValues, ServoCssRules}; use gecko_bindings::structs::{RawServoAnimationValue, RawServoAnimationValueMap}; use gecko_bindings::structs::{RawServoDeclarationBlock, RawServoStyleRule}; @@ -19,7 +19,8 @@ use parking_lot::RwLock; use properties::{ComputedValues, PropertyDeclarationBlock}; use properties::animated_properties::{AnimationValue, AnimationValueMap}; use shared_lock::Locked; -use stylesheets::{CssRules, Stylesheet, StyleRule, ImportRule, MediaRule, NamespaceRule, PageRule}; +use stylesheets::{CssRules, Stylesheet, StyleRule, ImportRule, MediaRule}; +use stylesheets::{NamespaceRule, PageRule, SupportsRule}; macro_rules! impl_arc_ffi { ($servo_type:ty => $gecko_type:ty [$addref:ident, $release:ident]) => { @@ -75,3 +76,6 @@ impl_arc_ffi!(Locked => RawServoNamespaceRule impl_arc_ffi!(Locked => RawServoPageRule [Servo_PageRule_AddRef, Servo_PageRule_Release]); + +impl_arc_ffi!(Locked => RawServoSupportsRule + [Servo_SupportsRule_AddRef, Servo_SupportsRule_Release]); diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 4b3c512a1ff..e06e235cbab 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -36,6 +36,7 @@ use style::gecko_bindings::bindings::{RawServoPageRule, RawServoPageRuleBorrowed use style::gecko_bindings::bindings::{RawServoStyleSetBorrowed, RawServoStyleSetOwned}; use style::gecko_bindings::bindings::{RawServoStyleSheetBorrowed, ServoComputedValuesBorrowed}; use style::gecko_bindings::bindings::{RawServoStyleSheetStrong, ServoComputedValuesStrong}; +use style::gecko_bindings::bindings::{RawServoSupportsRule, RawServoSupportsRuleBorrowed}; use style::gecko_bindings::bindings::{ServoCssRulesBorrowed, ServoCssRulesStrong}; use style::gecko_bindings::bindings::{nsACString, nsAString}; use style::gecko_bindings::bindings::Gecko_AnimationAppendKeyframe; @@ -84,7 +85,7 @@ use style::shared_lock::{SharedRwLock, SharedRwLockReadGuard, StylesheetGuards, use style::string_cache::Atom; use style::stylesheets::{CssRule, CssRules, CssRuleType, CssRulesHelpers}; use style::stylesheets::{ImportRule, MediaRule, NamespaceRule, Origin}; -use style::stylesheets::{PageRule, Stylesheet, StyleRule}; +use style::stylesheets::{PageRule, Stylesheet, StyleRule, SupportsRule}; use style::stylesheets::StylesheetLoader as StyleStylesheetLoader; use style::supports::parse_condition_or_declaration; use style::thread_state; @@ -821,6 +822,13 @@ impl_basic_rule_funcs! { (Page, PageRule, RawServoPageRule), to_css: Servo_PageRule_GetCssText, } +impl_group_rule_funcs! { (Supports, SupportsRule, RawServoSupportsRule), + get_rules: Servo_SupportsRule_GetRules, + getter: Servo_CssRules_GetSupportsRuleAt, + debug: Servo_SupportsRule_Debug, + to_css: Servo_SupportsRule_GetCssText, +} + #[no_mangle] pub extern "C" fn Servo_CssRules_GetFontFaceRuleAt(rules: ServoCssRulesBorrowed, index: u32) -> *mut nsCSSFontFaceRule @@ -892,6 +900,14 @@ pub extern "C" fn Servo_PageRule_SetStyle(rule: RawServoPageRuleBorrowed, }) } +#[no_mangle] +pub extern "C" fn Servo_SupportsRule_GetConditionText(rule: RawServoSupportsRuleBorrowed, + result: *mut nsAString) { + read_locked_arc(rule, |rule: &SupportsRule| { + rule.condition.to_css(unsafe { result.as_mut().unwrap() }).unwrap(); + }) +} + #[no_mangle] pub extern "C" fn Servo_ComputedValues_GetForAnonymousBox(parent_style_or_null: ServoComputedValuesBorrowedOrNull, pseudo_tag: *mut nsIAtom, From 81af3be0343c85f3c2543cacc2e13972e4ca4805 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Fri, 28 Apr 2017 16:55:01 +0800 Subject: [PATCH 3/3] Update binding files. --- components/style/gecko_bindings/bindings.rs | 41 +++++++++++++++++++-- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/components/style/gecko_bindings/bindings.rs b/components/style/gecko_bindings/bindings.rs index f0cbccc54dc..65950283385 100644 --- a/components/style/gecko_bindings/bindings.rs +++ b/components/style/gecko_bindings/bindings.rs @@ -244,6 +244,11 @@ pub type RawServoPageRuleBorrowed<'a> = &'a RawServoPageRule; pub type RawServoPageRuleBorrowedOrNull<'a> = Option<&'a RawServoPageRule>; enum RawServoPageRuleVoid { } pub struct RawServoPageRule(RawServoPageRuleVoid); +pub type RawServoSupportsRuleStrong = ::gecko_bindings::sugar::ownership::Strong; +pub type RawServoSupportsRuleBorrowed<'a> = &'a RawServoSupportsRule; +pub type RawServoSupportsRuleBorrowedOrNull<'a> = Option<&'a RawServoSupportsRule>; +enum RawServoSupportsRuleVoid { } +pub struct RawServoSupportsRule(RawServoSupportsRuleVoid); pub type RawServoStyleSetOwned = ::gecko_bindings::sugar::ownership::Owned; pub type RawServoStyleSetOwnedOrNull = ::gecko_bindings::sugar::ownership::OwnedOrNull; pub type RawServoStyleSetBorrowed<'a> = &'a RawServoStyleSet; @@ -399,6 +404,12 @@ extern "C" { extern "C" { pub fn Servo_PageRule_Release(ptr: RawServoPageRuleBorrowed); } +extern "C" { + pub fn Servo_SupportsRule_AddRef(ptr: RawServoSupportsRuleBorrowed); +} +extern "C" { + pub fn Servo_SupportsRule_Release(ptr: RawServoSupportsRuleBorrowed); +} extern "C" { pub fn Servo_StyleSet_Drop(ptr: RawServoStyleSetOwned); } @@ -1665,6 +1676,10 @@ extern "C" { pub fn Servo_MediaRule_GetCssText(rule: RawServoMediaRuleBorrowed, result: *mut nsAString); } +extern "C" { + pub fn Servo_MediaRule_GetRules(rule: RawServoMediaRuleBorrowed) + -> ServoCssRulesStrong; +} extern "C" { pub fn Servo_CssRules_GetNamespaceRuleAt(rules: ServoCssRulesBorrowed, index: u32) @@ -1690,6 +1705,23 @@ extern "C" { pub fn Servo_PageRule_GetCssText(rule: RawServoPageRuleBorrowed, result: *mut nsAString); } +extern "C" { + pub fn Servo_CssRules_GetSupportsRuleAt(rules: ServoCssRulesBorrowed, + index: u32) + -> RawServoSupportsRuleStrong; +} +extern "C" { + pub fn Servo_SupportsRule_Debug(rule: RawServoSupportsRuleBorrowed, + result: *mut nsACString); +} +extern "C" { + pub fn Servo_SupportsRule_GetCssText(rule: RawServoSupportsRuleBorrowed, + result: *mut nsAString); +} +extern "C" { + pub fn Servo_SupportsRule_GetRules(rule: RawServoSupportsRuleBorrowed) + -> ServoCssRulesStrong; +} extern "C" { pub fn Servo_CssRules_GetFontFaceRuleAt(rules: ServoCssRulesBorrowed, index: u32) @@ -1712,10 +1744,6 @@ extern "C" { pub fn Servo_MediaRule_GetMedia(rule: RawServoMediaRuleBorrowed) -> RawServoMediaListStrong; } -extern "C" { - pub fn Servo_MediaRule_GetRules(rule: RawServoMediaRuleBorrowed) - -> ServoCssRulesStrong; -} extern "C" { pub fn Servo_NamespaceRule_GetPrefix(rule: RawServoNamespaceRuleBorrowed) -> *mut nsIAtom; @@ -1733,6 +1761,11 @@ extern "C" { declarations: RawServoDeclarationBlockBorrowed); } +extern "C" { + pub fn Servo_SupportsRule_GetConditionText(rule: + RawServoSupportsRuleBorrowed, + result: *mut nsAString); +} extern "C" { pub fn Servo_ParseProperty(property: nsCSSPropertyID, value: *const nsACString,