aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2017-05-29 18:51:45 -0500
committerGitHub <noreply@github.com>2017-05-29 18:51:45 -0500
commit085743560caffc0d25c7225ac979a857efd82155 (patch)
tree39e758e6995507637e41be9d5de1b6bd624af82a
parent76daf462956a50c3348b6dac516d5f013355a88b (diff)
parent571d4c272b4e4233a6aa7dc9a5e57f2d474a5282 (diff)
downloadservo-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.rs26
-rw-r--r--components/style/gecko/generated/structs_debug.rs13
-rw-r--r--components/style/gecko/generated/structs_release.rs13
-rw-r--r--components/style/stylesheets.rs12
-rw-r--r--ports/geckolib/glue.rs32
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);