diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2017-05-29 18:51:45 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-29 18:51:45 -0500 |
commit | 085743560caffc0d25c7225ac979a857efd82155 (patch) | |
tree | 39e758e6995507637e41be9d5de1b6bd624af82a | |
parent | 76daf462956a50c3348b6dac516d5f013355a88b (diff) | |
parent | 571d4c272b4e4233a6aa7dc9a5e57f2d474a5282 (diff) | |
download | servo-085743560caffc0d25c7225ac979a857efd82155.tar.gz servo-085743560caffc0d25c7225ac979a857efd82155.zip |
Auto merge of #17086 - upsuper:bug1352968, r=heycam
Add CSSOM support of @import rule for stylo
This is the Servo side change of [bug 1352968](https://bugzilla.mozilla.org/show_bug.cgi?id=1352968).
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/17086)
<!-- Reviewable:end -->
-rw-r--r-- | components/style/gecko/generated/bindings.rs | 26 | ||||
-rw-r--r-- | components/style/gecko/generated/structs_debug.rs | 13 | ||||
-rw-r--r-- | components/style/gecko/generated/structs_release.rs | 13 | ||||
-rw-r--r-- | components/style/stylesheets.rs | 12 | ||||
-rw-r--r-- | ports/geckolib/glue.rs | 32 |
5 files changed, 66 insertions, 30 deletions
diff --git a/components/style/gecko/generated/bindings.rs b/components/style/gecko/generated/bindings.rs index 2793625cd9c..29ab276e646 100644 --- a/components/style/gecko/generated/bindings.rs +++ b/components/style/gecko/generated/bindings.rs @@ -1740,10 +1740,6 @@ extern "C" { -> RawServoStyleSheetStrong; } extern "C" { - pub fn Servo_ImportRule_GetSheet(import_rule: RawServoImportRuleBorrowed) - -> RawServoStyleSheetStrong; -} -extern "C" { pub fn Servo_StyleSheet_ClearAndUpdate(stylesheet: RawServoStyleSheetBorrowed, loader: *mut Loader, @@ -1874,6 +1870,20 @@ extern "C" { result: *mut nsAString); } extern "C" { + pub fn Servo_CssRules_GetImportRuleAt(rules: ServoCssRulesBorrowed, + index: u32, line: *mut u32, + column: *mut u32) + -> RawServoImportRuleStrong; +} +extern "C" { + pub fn Servo_ImportRule_Debug(rule: RawServoImportRuleBorrowed, + result: *mut nsACString); +} +extern "C" { + pub fn Servo_ImportRule_GetCssText(rule: RawServoImportRuleBorrowed, + result: *mut nsAString); +} +extern "C" { pub fn Servo_Keyframe_Debug(rule: RawServoKeyframeBorrowed, result: *mut nsACString); } @@ -2001,6 +2011,14 @@ extern "C" { result: *mut nsAString); } extern "C" { + pub fn Servo_ImportRule_GetHref(rule: RawServoImportRuleBorrowed, + result: *mut nsAString); +} +extern "C" { + pub fn Servo_ImportRule_GetSheet(rule: RawServoImportRuleBorrowed) + -> *const RawServoStyleSheet; +} +extern "C" { pub fn Servo_Keyframe_GetKeyText(keyframe: RawServoKeyframeBorrowed, result: *mut nsAString); } diff --git a/components/style/gecko/generated/structs_debug.rs b/components/style/gecko/generated/structs_debug.rs index 9232136c300..c546ffde1d9 100644 --- a/components/style/gecko/generated/structs_debug.rs +++ b/components/style/gecko/generated/structs_debug.rs @@ -1555,11 +1555,6 @@ pub mod root { _unused: [u8; 0], } #[repr(C)] - #[derive(Debug, Copy, Clone)] - pub struct ImportRule { - _unused: [u8; 0], - } - #[repr(C)] #[derive(Debug)] pub struct Rule { pub _base: root::nsIDOMCSSRule, @@ -3349,6 +3344,11 @@ pub mod root { } #[repr(C)] #[derive(Debug, Copy, Clone)] + pub struct CSSImportRule { + _unused: [u8; 0], + } + #[repr(C)] + #[derive(Debug, Copy, Clone)] pub struct CSSRuleList { _unused: [u8; 0], } @@ -6692,6 +6692,7 @@ pub mod root { pub mTitle: ::nsstring::nsStringRepr, pub mDocument: *mut root::nsIDocument, pub mOwningNode: *mut root::nsINode, + pub mOwnerRule: *mut root::mozilla::dom::CSSImportRule, pub mMedia: root::RefPtr<root::mozilla::dom::MediaList>, pub mNext: root::RefPtr<root::mozilla::StyleSheet>, pub mParsingMode: root::mozilla::css::SheetParsingMode, @@ -6786,7 +6787,7 @@ pub mod root { } #[test] fn bindgen_test_layout_StyleSheet() { - assert_eq!(::std::mem::size_of::<StyleSheet>() , 152usize , concat + assert_eq!(::std::mem::size_of::<StyleSheet>() , 160usize , concat ! ( "Size of: " , stringify ! ( StyleSheet ) )); assert_eq! (::std::mem::align_of::<StyleSheet>() , 8usize , concat ! ( "Alignment of " , stringify ! ( StyleSheet ) )); diff --git a/components/style/gecko/generated/structs_release.rs b/components/style/gecko/generated/structs_release.rs index 880ab88cbfe..d0c0ada2591 100644 --- a/components/style/gecko/generated/structs_release.rs +++ b/components/style/gecko/generated/structs_release.rs @@ -1479,11 +1479,6 @@ pub mod root { _unused: [u8; 0], } #[repr(C)] - #[derive(Debug, Copy, Clone)] - pub struct ImportRule { - _unused: [u8; 0], - } - #[repr(C)] #[derive(Debug)] pub struct Rule { pub _base: root::nsIDOMCSSRule, @@ -3254,6 +3249,11 @@ pub mod root { } #[repr(C)] #[derive(Debug, Copy, Clone)] + pub struct CSSImportRule { + _unused: [u8; 0], + } + #[repr(C)] + #[derive(Debug, Copy, Clone)] pub struct CSSRuleList { _unused: [u8; 0], } @@ -6562,6 +6562,7 @@ pub mod root { pub mTitle: ::nsstring::nsStringRepr, pub mDocument: *mut root::nsIDocument, pub mOwningNode: *mut root::nsINode, + pub mOwnerRule: *mut root::mozilla::dom::CSSImportRule, pub mMedia: root::RefPtr<root::mozilla::dom::MediaList>, pub mNext: root::RefPtr<root::mozilla::StyleSheet>, pub mParsingMode: root::mozilla::css::SheetParsingMode, @@ -6656,7 +6657,7 @@ pub mod root { } #[test] fn bindgen_test_layout_StyleSheet() { - assert_eq!(::std::mem::size_of::<StyleSheet>() , 144usize , concat + assert_eq!(::std::mem::size_of::<StyleSheet>() , 152usize , concat ! ( "Size of: " , stringify ! ( StyleSheet ) )); assert_eq! (::std::mem::align_of::<StyleSheet>() , 8usize , concat ! ( "Alignment of " , stringify ! ( StyleSheet ) )); diff --git a/components/style/stylesheets.rs b/components/style/stylesheets.rs index e3dcfaa6b4e..8c01c2adf22 100644 --- a/components/style/stylesheets.rs +++ b/components/style/stylesheets.rs @@ -633,6 +633,9 @@ pub struct ImportRule { /// It contains an empty list of rules and namespace set that is updated /// when it loads. pub stylesheet: Arc<Stylesheet>, + + /// The line and column of the rule's source code. + pub source_location: SourceLocation, } impl Clone for ImportRule { @@ -641,6 +644,7 @@ impl Clone for ImportRule { ImportRule { url: self.url.clone(), stylesheet: Arc::new(stylesheet.clone()), + source_location: self.source_location.clone(), } } } @@ -1530,6 +1534,8 @@ impl<'a> AtRuleParser for TopLevelRuleParser<'a> { fn parse_prelude(&mut self, name: &str, input: &mut Parser) -> Result<AtRuleType<AtRulePrelude, CssRule>, ()> { + let location = get_location_with_offset(input.current_source_location(), + self.context.line_number_offset); match_ignore_ascii_case! { name, "import" => { if self.state.get() <= State::Imports { @@ -1561,7 +1567,8 @@ impl<'a> AtRuleParser for TopLevelRuleParser<'a> { dirty_on_viewport_size_change: AtomicBool::new(false), disabled: AtomicBool::new(false), quirks_mode: self.context.quirks_mode, - }) + }), + source_location: location, } }, &mut |import_rule| { Arc::new(self.shared_lock.wrap(import_rule)) @@ -1576,9 +1583,6 @@ impl<'a> AtRuleParser for TopLevelRuleParser<'a> { if self.state.get() <= State::Namespaces { self.state.set(State::Namespaces); - let location = get_location_with_offset(input.current_source_location(), - self.context.line_number_offset); - let prefix_result = input.try(|input| input.expect_ident()); let url = Namespace::from(try!(input.expect_url_or_string())); diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 37c9c70f6aa..9ddd0611e53 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -30,6 +30,7 @@ use style::gecko_bindings::bindings::{RawGeckoElementBorrowed, RawGeckoElementBo use style::gecko_bindings::bindings::{RawGeckoKeyframeListBorrowed, RawGeckoKeyframeListBorrowedMut}; use style::gecko_bindings::bindings::{RawServoDeclarationBlockBorrowed, RawServoDeclarationBlockStrong}; use style::gecko_bindings::bindings::{RawServoDocumentRule, RawServoDocumentRuleBorrowed}; +use style::gecko_bindings::bindings::{RawServoImportRule, RawServoImportRuleBorrowed}; use style::gecko_bindings::bindings::{RawServoKeyframe, RawServoKeyframeBorrowed, RawServoKeyframeStrong}; use style::gecko_bindings::bindings::{RawServoKeyframesRule, RawServoKeyframesRuleBorrowed}; use style::gecko_bindings::bindings::{RawServoMediaList, RawServoMediaListBorrowed, RawServoMediaListStrong}; @@ -56,8 +57,8 @@ use style::gecko_bindings::bindings::RawGeckoServoStyleRuleListBorrowedMut; use style::gecko_bindings::bindings::RawServoAnimationValueBorrowed; use style::gecko_bindings::bindings::RawServoAnimationValueMapBorrowedMut; use style::gecko_bindings::bindings::RawServoAnimationValueStrong; -use style::gecko_bindings::bindings::RawServoImportRuleBorrowed; use style::gecko_bindings::bindings::RawServoStyleRuleBorrowed; +use style::gecko_bindings::bindings::RawServoStyleSheet; use style::gecko_bindings::bindings::ServoComputedValuesBorrowedOrNull; use style::gecko_bindings::bindings::nsTArrayBorrowed_uintptr_t; use style::gecko_bindings::bindings::nsTimingFunctionBorrowed; @@ -988,6 +989,12 @@ impl_basic_rule_funcs! { (Style, StyleRule, RawServoStyleRule), to_css: Servo_StyleRule_GetCssText, } +impl_basic_rule_funcs! { (Import, ImportRule, RawServoImportRule), + getter: Servo_CssRules_GetImportRuleAt, + debug: Servo_ImportRule_Debug, + to_css: Servo_ImportRule_GetCssText, +} + impl_basic_rule_funcs_without_getter! { (Keyframe, RawServoKeyframe), debug: Servo_Keyframe_Debug, to_css: Servo_Keyframe_GetCssText, @@ -1078,6 +1085,20 @@ pub extern "C" fn Servo_StyleRule_GetSelectorText(rule: RawServoStyleRuleBorrowe } #[no_mangle] +pub extern "C" fn Servo_ImportRule_GetHref(rule: RawServoImportRuleBorrowed, result: *mut nsAString) { + read_locked_arc(rule, |rule: &ImportRule| { + write!(unsafe { &mut *result }, "{}", rule.url.as_str()).unwrap(); + }) +} + +#[no_mangle] +pub extern "C" fn Servo_ImportRule_GetSheet(rule: RawServoImportRuleBorrowed) -> *const RawServoStyleSheet { + read_locked_arc(rule, |rule: &ImportRule| { + rule.stylesheet.as_borrowed_opt().unwrap() as *const _ + }) +} + +#[no_mangle] pub extern "C" fn Servo_Keyframe_GetKeyText(keyframe: RawServoKeyframeBorrowed, result: *mut nsAString) { read_locked_arc(keyframe, |keyframe: &Keyframe| { keyframe.selector.to_css(unsafe { result.as_mut().unwrap() }).unwrap() @@ -2295,15 +2316,6 @@ pub extern "C" fn Servo_NoteExplicitHints(element: RawGeckoElementBorrowed, } #[no_mangle] -pub extern "C" fn Servo_ImportRule_GetSheet(import_rule: - RawServoImportRuleBorrowed) - -> RawServoStyleSheetStrong { - read_locked_arc(import_rule, |rule: &ImportRule| { - rule.stylesheet.clone().into_strong() - }) -} - -#[no_mangle] pub extern "C" fn Servo_TakeChangeHint(element: RawGeckoElementBorrowed) -> nsChangeHint { let element = GeckoElement(element); |