aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <emilio@crisal.io>2016-12-16 12:13:32 +0100
committerEmilio Cobos Álvarez <emilio@crisal.io>2016-12-16 16:57:20 +0100
commitb86aa41568463ed8454037dbd4247dd939c3f114 (patch)
tree4ba96d2ae5393d7c75346dfbd5cb360b9dd3e795
parentca93a2dcec06bbae68b17a2faf11ca53d0691fe5 (diff)
downloadservo-b86aa41568463ed8454037dbd4247dd939c3f114.tar.gz
servo-b86aa41568463ed8454037dbd4247dd939c3f114.zip
script: Add CSSImportRule WebIDL interface.
-rw-r--r--components/script/dom/bindings/trace.rs8
-rw-r--r--components/script/dom/cssimportrule.rs53
-rw-r--r--components/script/dom/cssrule.rs4
-rw-r--r--components/script/dom/mod.rs1
-rw-r--r--components/script/dom/webidls/CSSImportRule.webidl11
-rw-r--r--tests/wpt/mozilla/tests/mozilla/interfaces.html1
6 files changed, 77 insertions, 1 deletions
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs
index ad8dc6b935e..3365c106bd9 100644
--- a/components/script/dom/bindings/trace.rs
+++ b/components/script/dom/bindings/trace.rs
@@ -98,7 +98,7 @@ use style::keyframes::Keyframe;
use style::media_queries::MediaList;
use style::properties::PropertyDeclarationBlock;
use style::selector_parser::{PseudoElement, Snapshot};
-use style::stylesheets::{CssRules, KeyframesRule, MediaRule, NamespaceRule, StyleRule};
+use style::stylesheets::{CssRules, KeyframesRule, MediaRule, NamespaceRule, StyleRule, ImportRule};
use style::values::specified::Length;
use style::viewport::ViewportRule;
use time::Duration;
@@ -525,6 +525,12 @@ unsafe impl JSTraceable for RwLock<KeyframesRule> {
}
}
+unsafe impl JSTraceable for RwLock<ImportRule> {
+ unsafe fn trace(&self, _trc: *mut JSTracer) {
+ // Do nothing.
+ }
+}
+
unsafe impl JSTraceable for RwLock<MediaRule> {
unsafe fn trace(&self, _trc: *mut JSTracer) {
// Do nothing.
diff --git a/components/script/dom/cssimportrule.rs b/components/script/dom/cssimportrule.rs
new file mode 100644
index 00000000000..582a6f597f9
--- /dev/null
+++ b/components/script/dom/cssimportrule.rs
@@ -0,0 +1,53 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+use dom::bindings::codegen::Bindings::CSSImportRuleBinding;
+use dom::bindings::js::Root;
+use dom::bindings::reflector::reflect_dom_object;
+use dom::bindings::str::DOMString;
+use dom::cssrule::{CSSRule, SpecificCSSRule};
+use dom::cssstylesheet::CSSStyleSheet;
+use dom::window::Window;
+use parking_lot::RwLock;
+use std::sync::Arc;
+use style::stylesheets::ImportRule;
+use style_traits::ToCss;
+
+#[dom_struct]
+pub struct CSSImportRule {
+ cssrule: CSSRule,
+ #[ignore_heap_size_of = "Arc"]
+ import_rule: Arc<RwLock<ImportRule>>,
+}
+
+impl CSSImportRule {
+ fn new_inherited(parent_stylesheet: &CSSStyleSheet,
+ import_rule: Arc<RwLock<ImportRule>>)
+ -> Self {
+ CSSImportRule {
+ cssrule: CSSRule::new_inherited(parent_stylesheet),
+ import_rule: import_rule,
+ }
+ }
+
+ #[allow(unrooted_must_root)]
+ pub fn new(window: &Window,
+ parent_stylesheet: &CSSStyleSheet,
+ import_rule: Arc<RwLock<ImportRule>>) -> Root<Self> {
+ reflect_dom_object(box Self::new_inherited(parent_stylesheet, import_rule),
+ window,
+ CSSImportRuleBinding::Wrap)
+ }
+}
+
+impl SpecificCSSRule for CSSImportRule {
+ fn ty(&self) -> u16 {
+ use dom::bindings::codegen::Bindings::CSSRuleBinding::CSSRuleConstants;
+ CSSRuleConstants::IMPORT_RULE
+ }
+
+ fn get_css(&self) -> DOMString {
+ self.import_rule.read().to_css_string().into()
+ }
+}
diff --git a/components/script/dom/cssrule.rs b/components/script/dom/cssrule.rs
index 603354c8621..27b439f9dc4 100644
--- a/components/script/dom/cssrule.rs
+++ b/components/script/dom/cssrule.rs
@@ -9,6 +9,7 @@ use dom::bindings::js::{JS, Root};
use dom::bindings::reflector::{Reflector, reflect_dom_object};
use dom::bindings::str::DOMString;
use dom::cssfontfacerule::CSSFontFaceRule;
+use dom::cssimportrule::CSSImportRule;
use dom::csskeyframerule::CSSKeyframeRule;
use dom::csskeyframesrule::CSSKeyframesRule;
use dom::cssmediarule::CSSMediaRule;
@@ -64,6 +65,8 @@ impl CSSRule {
rule as &SpecificCSSRule
} else if let Some(rule) = self.downcast::<CSSKeyframeRule>() {
rule as &SpecificCSSRule
+ } else if let Some(rule) = self.downcast::<CSSImportRule>() {
+ rule as &SpecificCSSRule
} else {
unreachable!()
}
@@ -75,6 +78,7 @@ impl CSSRule {
rule: StyleCssRule) -> Root<CSSRule> {
// be sure to update the match in as_specific when this is updated
match rule {
+ StyleCssRule::Import(s) => Root::upcast(CSSImportRule::new(window, parent_stylesheet, s)),
StyleCssRule::Style(s) => Root::upcast(CSSStyleRule::new(window, parent_stylesheet, s)),
StyleCssRule::FontFace(s) => Root::upcast(CSSFontFaceRule::new(window, parent_stylesheet, s)),
StyleCssRule::Keyframes(s) => Root::upcast(CSSKeyframesRule::new(window, parent_stylesheet, s)),
diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs
index 03847518408..b432b5a12e5 100644
--- a/components/script/dom/mod.rs
+++ b/components/script/dom/mod.rs
@@ -244,6 +244,7 @@ pub mod crypto;
pub mod css;
pub mod cssfontfacerule;
pub mod cssgroupingrule;
+pub mod cssimportrule;
pub mod csskeyframerule;
pub mod csskeyframesrule;
pub mod cssmediarule;
diff --git a/components/script/dom/webidls/CSSImportRule.webidl b/components/script/dom/webidls/CSSImportRule.webidl
new file mode 100644
index 00000000000..b8131a7bb87
--- /dev/null
+++ b/components/script/dom/webidls/CSSImportRule.webidl
@@ -0,0 +1,11 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// https://drafts.csswg.org/cssom/#cssimportrule
+[Exposed=Window]
+interface CSSImportRule : CSSRule {
+ // readonly attribute DOMString href;
+ // [SameObject, PutForwards=mediaText] readonly attribute MediaList media;
+ // [SameObject] readonly attribute CSSStyleSheet styleSheet;
+};
diff --git a/tests/wpt/mozilla/tests/mozilla/interfaces.html b/tests/wpt/mozilla/tests/mozilla/interfaces.html
index a658a8eb346..85e6335aafb 100644
--- a/tests/wpt/mozilla/tests/mozilla/interfaces.html
+++ b/tests/wpt/mozilla/tests/mozilla/interfaces.html
@@ -22,6 +22,7 @@ test_interfaces([
"CSS",
"CSSFontFaceRule",
"CSSGroupingRule",
+ "CSSImportRule",
"CSSKeyframeRule",
"CSSKeyframesRule",
"CSSMediaRule",