diff options
author | Emilio Cobos Álvarez <emilio@crisal.io> | 2016-12-16 12:13:32 +0100 |
---|---|---|
committer | Emilio Cobos Álvarez <emilio@crisal.io> | 2016-12-16 16:57:20 +0100 |
commit | b86aa41568463ed8454037dbd4247dd939c3f114 (patch) | |
tree | 4ba96d2ae5393d7c75346dfbd5cb360b9dd3e795 | |
parent | ca93a2dcec06bbae68b17a2faf11ca53d0691fe5 (diff) | |
download | servo-b86aa41568463ed8454037dbd4247dd939c3f114.tar.gz servo-b86aa41568463ed8454037dbd4247dd939c3f114.zip |
script: Add CSSImportRule WebIDL interface.
-rw-r--r-- | components/script/dom/bindings/trace.rs | 8 | ||||
-rw-r--r-- | components/script/dom/cssimportrule.rs | 53 | ||||
-rw-r--r-- | components/script/dom/cssrule.rs | 4 | ||||
-rw-r--r-- | components/script/dom/mod.rs | 1 | ||||
-rw-r--r-- | components/script/dom/webidls/CSSImportRule.webidl | 11 | ||||
-rw-r--r-- | tests/wpt/mozilla/tests/mozilla/interfaces.html | 1 |
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", |