From 2175785ca65ac228b26d79e50fe2398f841a30eb Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Mon, 13 Mar 2017 17:40:56 +1100 Subject: [PATCH] Add raw Servo types for MediaList and MediaRule. --- components/style/gecko/arc_types.rs | 10 ++++- components/style/gecko_bindings/bindings.rs | 43 +++++++++++++++++++++ ports/geckolib/glue.rs | 41 +++++++++++++++++++- 3 files changed, 92 insertions(+), 2 deletions(-) diff --git a/components/style/gecko/arc_types.rs b/components/style/gecko/arc_types.rs index 72f044c1c71e..95eff643161a 100644 --- a/components/style/gecko/arc_types.rs +++ b/components/style/gecko/arc_types.rs @@ -8,14 +8,16 @@ #![allow(non_snake_case, missing_docs)] +use gecko_bindings::bindings::{RawServoMediaList, RawServoMediaRule}; use gecko_bindings::bindings::{RawServoStyleSheet, RawServoStyleRule, RawServoImportRule}; use gecko_bindings::bindings::{ServoComputedValues, ServoCssRules}; use gecko_bindings::structs::{RawServoAnimationValue, RawServoDeclarationBlock}; use gecko_bindings::sugar::ownership::{HasArcFFI, HasFFI}; +use media_queries::MediaList; use parking_lot::RwLock; use properties::{ComputedValues, PropertyDeclarationBlock}; use properties::animated_properties::AnimationValue; -use stylesheets::{CssRules, Stylesheet, StyleRule, ImportRule}; +use stylesheets::{CssRules, Stylesheet, StyleRule, ImportRule, MediaRule}; macro_rules! impl_arc_ffi { ($servo_type:ty => $gecko_type:ty [$addref:ident, $release:ident]) => { @@ -56,3 +58,9 @@ impl_arc_ffi!(RwLock => RawServoImportRule impl_arc_ffi!(AnimationValue => RawServoAnimationValue [Servo_AnimationValue_AddRef, Servo_AnimationValue_Release]); + +impl_arc_ffi!(RwLock => RawServoMediaList + [Servo_MediaList_AddRef, Servo_MediaList_Release]); + +impl_arc_ffi!(RwLock => RawServoMediaRule + [Servo_MediaRule_AddRef, Servo_MediaRule_Release]); diff --git a/components/style/gecko_bindings/bindings.rs b/components/style/gecko_bindings/bindings.rs index a4454c460391..cb707ef3694c 100644 --- a/components/style/gecko_bindings/bindings.rs +++ b/components/style/gecko_bindings/bindings.rs @@ -4,6 +4,16 @@ pub use nsstring::{nsACString, nsAString, nsString}; type nsACString_internal = nsACString; type nsAString_internal = nsAString; use gecko_bindings::structs::mozilla::css::URLValue; +pub type RawServoMediaListStrong = ::gecko_bindings::sugar::ownership::Strong; +pub type RawServoMediaListBorrowedOrNull<'a> = Option<&'a RawServoMediaList>; +pub type RawServoMediaListBorrowed<'a> = &'a RawServoMediaList; +enum RawServoMediaListVoid{ } +pub struct RawServoMediaList(RawServoMediaListVoid); +pub type RawServoMediaRuleStrong = ::gecko_bindings::sugar::ownership::Strong; +pub type RawServoMediaRuleBorrowedOrNull<'a> = Option<&'a RawServoMediaRule>; +pub type RawServoMediaRuleBorrowed<'a> = &'a RawServoMediaRule; +enum RawServoMediaRuleVoid{ } +pub struct RawServoMediaRule(RawServoMediaRuleVoid); use gecko_bindings::structs::RawGeckoDocument; use gecko_bindings::structs::RawGeckoElement; use gecko_bindings::structs::RawGeckoKeyframeList; @@ -286,12 +296,24 @@ extern "C" { pub fn Servo_DeclarationBlock_Release(ptr: RawServoDeclarationBlockBorrowed); } +extern "C" { + pub fn Servo_MediaList_AddRef(ptr: RawServoMediaListBorrowed); +} +extern "C" { + pub fn Servo_MediaList_Release(ptr: RawServoMediaListBorrowed); +} extern "C" { pub fn Servo_StyleRule_AddRef(ptr: RawServoStyleRuleBorrowed); } extern "C" { pub fn Servo_StyleRule_Release(ptr: RawServoStyleRuleBorrowed); } +extern "C" { + pub fn Servo_MediaRule_AddRef(ptr: RawServoMediaRuleBorrowed); +} +extern "C" { + pub fn Servo_MediaRule_Release(ptr: RawServoMediaRuleBorrowed); +} extern "C" { pub fn Servo_ImportRule_AddRef(ptr: RawServoImportRuleBorrowed); } @@ -1328,6 +1350,11 @@ extern "C" { index: u32) -> RawServoStyleRuleStrong; } +extern "C" { + pub fn Servo_CssRules_GetMediaRuleAt(rules: ServoCssRulesBorrowed, + index: u32) + -> RawServoMediaRuleStrong; +} extern "C" { pub fn Servo_CssRules_InsertRule(rules: ServoCssRulesBorrowed, sheet: RawServoStyleSheetBorrowed, @@ -1360,6 +1387,22 @@ extern "C" { pub fn Servo_StyleRule_GetSelectorText(rule: RawServoStyleRuleBorrowed, result: *mut nsAString_internal); } +extern "C" { + pub fn Servo_MediaRule_Debug(rule: RawServoMediaRuleBorrowed, + result: *mut nsACString_internal); +} +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_MediaRule_GetCssText(rule: RawServoMediaRuleBorrowed, + result: *mut nsAString_internal); +} extern "C" { pub fn Servo_ParseProperty(property: *const nsACString_internal, value: *const nsACString_internal, diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 1a3ee5ac9a93..40cd97d3679d 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -32,6 +32,7 @@ use style::gecko::wrapper::GeckoElement; use style::gecko_bindings::bindings; use style::gecko_bindings::bindings::{RawGeckoKeyframeListBorrowed, RawGeckoKeyframeListBorrowedMut}; use style::gecko_bindings::bindings::{RawServoDeclarationBlockBorrowed, RawServoDeclarationBlockStrong}; +use style::gecko_bindings::bindings::{RawServoMediaRuleBorrowed, RawServoMediaRuleStrong}; use style::gecko_bindings::bindings::{RawServoStyleRuleBorrowed, RawServoStyleRuleStrong}; use style::gecko_bindings::bindings::{RawServoStyleSetBorrowed, RawServoStyleSetOwned}; use style::gecko_bindings::bindings::{RawServoStyleSheetBorrowed, ServoComputedValuesBorrowed}; @@ -44,6 +45,7 @@ use style::gecko_bindings::bindings::RawGeckoElementBorrowed; use style::gecko_bindings::bindings::RawServoAnimationValueBorrowed; use style::gecko_bindings::bindings::RawServoAnimationValueStrong; use style::gecko_bindings::bindings::RawServoImportRuleBorrowed; +use style::gecko_bindings::bindings::RawServoMediaListStrong; use style::gecko_bindings::bindings::ServoComputedValuesBorrowedOrNull; use style::gecko_bindings::bindings::nsTArrayBorrowed_uintptr_t; use style::gecko_bindings::structs; @@ -72,7 +74,7 @@ use style::restyle_hints::{self, RestyleHint}; use style::selector_parser::PseudoElementCascadeType; use style::sequential; use style::string_cache::Atom; -use style::stylesheets::{CssRule, CssRules, Origin, Stylesheet, StyleRule, ImportRule}; +use style::stylesheets::{CssRule, CssRules, ImportRule, MediaRule, Origin, Stylesheet, StyleRule}; use style::stylesheets::StylesheetLoader as StyleStylesheetLoader; use style::supports::parse_condition_or_declaration; use style::thread_state; @@ -518,6 +520,18 @@ pub extern "C" fn Servo_CssRules_GetStyleRuleAt(rules: ServoCssRulesBorrowed, in } } +#[no_mangle] +pub extern "C" fn Servo_CssRules_GetMediaRuleAt(rules: ServoCssRulesBorrowed, index: u32) + -> RawServoMediaRuleStrong { + let rules = RwLock::::as_arc(&rules).read(); + match rules.0[index as usize] { + CssRule::Media(ref rule) => rule.clone().into_strong(), + _ => { + unreachable!("GetMediaRuleAt should only be called on a media rule"); + } + } +} + #[no_mangle] pub extern "C" fn Servo_CssRules_InsertRule(rules: ServoCssRulesBorrowed, sheet: RawServoStyleSheetBorrowed, rule: *const nsACString, index: u32, nested: bool, @@ -576,6 +590,31 @@ pub extern "C" fn Servo_StyleRule_GetSelectorText(rule: RawServoStyleRuleBorrowe rule.read().selectors.to_css(unsafe { result.as_mut().unwrap() }).unwrap(); } +#[no_mangle] +pub extern "C" fn Servo_MediaRule_Debug(rule: RawServoMediaRuleBorrowed, result: *mut nsACString) -> () { + let rule = RwLock::::as_arc(&rule); + let result = unsafe { result.as_mut().unwrap() }; + write!(result, "{:?}", *rule.read()).unwrap(); +} + +#[no_mangle] +pub extern "C" fn Servo_MediaRule_GetMedia(rule: RawServoMediaRuleBorrowed) -> RawServoMediaListStrong { + let rule = RwLock::::as_arc(&rule); + rule.read().media_queries.clone().into_strong() +} + +#[no_mangle] +pub extern "C" fn Servo_MediaRule_GetRules(rule: RawServoMediaRuleBorrowed) -> ServoCssRulesStrong { + let rule = RwLock::::as_arc(&rule); + rule.read().rules.clone().into_strong() +} + +#[no_mangle] +pub extern "C" fn Servo_MediaRule_GetCssText(rule: RawServoMediaRuleBorrowed, result: *mut nsAString) -> () { + let rule = RwLock::::as_arc(&rule); + rule.read().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,