diff options
-rw-r--r-- | components/script/dom/cssgroupingrule.rs | 48 | ||||
-rw-r--r-- | components/script/dom/cssmediarule.rs | 3 | ||||
-rw-r--r-- | components/script/dom/cssrulelist.rs | 1 | ||||
-rw-r--r-- | components/script/dom/webidls/CSSGroupingRule.webidl | 6 |
4 files changed, 50 insertions, 8 deletions
diff --git a/components/script/dom/cssgroupingrule.rs b/components/script/dom/cssgroupingrule.rs index 34d7a9d15b6..4c08727b229 100644 --- a/components/script/dom/cssgroupingrule.rs +++ b/components/script/dom/cssgroupingrule.rs @@ -2,29 +2,69 @@ * 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::reflector::Reflectable; use dom::bindings::codegen::Bindings::CSSGroupingRuleBinding; -use dom::bindings::js::Root; +use dom::bindings::codegen::Bindings::CSSGroupingRuleBinding::CSSGroupingRuleMethods; +use dom::bindings::codegen::Bindings::CSSRuleBinding::CSSRuleBinding::CSSRuleMethods; +use dom::bindings::error::{ErrorResult, Fallible}; +use dom::bindings::inheritance::Castable; +use dom::bindings::js::{JS, MutNullableHeap, Root}; use dom::bindings::reflector::reflect_dom_object; +use dom::bindings::str::DOMString; use dom::cssrule::CSSRule; +use dom::cssrulelist::{CSSRuleList, RulesSource}; use dom::cssstylesheet::CSSStyleSheet; use dom::window::Window; +use style::stylesheets::CssRules as StyleCssRules; #[dom_struct] pub struct CSSGroupingRule { cssrule: CSSRule, + #[ignore_heap_size_of = "Arc"] + rules: StyleCssRules, + rulelist: MutNullableHeap<JS<CSSRuleList>>, } impl CSSGroupingRule { - pub fn new_inherited(parent: Option<&CSSStyleSheet>) -> CSSGroupingRule { + pub fn new_inherited(parent: Option<&CSSStyleSheet>, + rules: StyleCssRules) -> CSSGroupingRule { CSSGroupingRule { cssrule: CSSRule::new_inherited(parent), + rules: rules, + rulelist: MutNullableHeap::new(None), } } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent: Option<&CSSStyleSheet>) -> Root<CSSGroupingRule> { - reflect_dom_object(box CSSGroupingRule::new_inherited(parent), + pub fn new(window: &Window, parent: Option<&CSSStyleSheet>, rules: StyleCssRules) -> Root<CSSGroupingRule> { + reflect_dom_object(box CSSGroupingRule::new_inherited(parent, rules), window, CSSGroupingRuleBinding::Wrap) } + + fn rulelist(&self) -> Root<CSSRuleList> { + let sheet = self.upcast::<CSSRule>().GetParentStyleSheet(); + let sheet = sheet.as_ref().map(|s| &**s); + self.rulelist.or_init(|| CSSRuleList::new(self.global().as_window(), + sheet, + RulesSource::Rules(self.rules.clone()))) + } +} + +impl CSSGroupingRuleMethods for CSSGroupingRule { + // https://drafts.csswg.org/cssom/#dom-cssgroupingrule-cssrules + fn CssRules(&self) -> Root<CSSRuleList> { + // XXXManishearth check origin clean flag + self.rulelist() + } + + // https://drafts.csswg.org/cssom/#dom-cssgroupingrule-insertrule + fn InsertRule(&self, rule: DOMString, index: u32) -> Fallible<u32> { + self.rulelist().insert_rule(&rule, index, /* nested */ true) + } + + // https://drafts.csswg.org/cssom/#dom-cssgroupingrule-deleterule + fn DeleteRule(&self, index: u32) -> ErrorResult { + self.rulelist().remove_rule(index) + } } diff --git a/components/script/dom/cssmediarule.rs b/components/script/dom/cssmediarule.rs index d6eef1319f7..67933fccd3b 100644 --- a/components/script/dom/cssmediarule.rs +++ b/components/script/dom/cssmediarule.rs @@ -24,8 +24,9 @@ pub struct CSSMediaRule { impl CSSMediaRule { fn new_inherited(parent: Option<&CSSStyleSheet>, mediarule: Arc<RwLock<MediaRule>>) -> CSSMediaRule { + let list = mediarule.read().rules.clone(); CSSMediaRule { - cssrule: CSSGroupingRule::new_inherited(parent), + cssrule: CSSGroupingRule::new_inherited(parent, list), mediarule: mediarule, } } diff --git a/components/script/dom/cssrulelist.rs b/components/script/dom/cssrulelist.rs index f7969aeb984..225f04a560d 100644 --- a/components/script/dom/cssrulelist.rs +++ b/components/script/dom/cssrulelist.rs @@ -20,6 +20,7 @@ use style::stylesheets::{CssRules, KeyframesRule, Origin}; use style::stylesheets::CssRule as StyleCssRule; no_jsmanaged_fields!(RulesSource); +no_jsmanaged_fields!(CssRules); #[dom_struct] pub struct CSSRuleList { diff --git a/components/script/dom/webidls/CSSGroupingRule.webidl b/components/script/dom/webidls/CSSGroupingRule.webidl index 6a317191ff6..9f8347a17d5 100644 --- a/components/script/dom/webidls/CSSGroupingRule.webidl +++ b/components/script/dom/webidls/CSSGroupingRule.webidl @@ -5,8 +5,8 @@ // https://drafts.csswg.org/cssom/#the-cssgroupingrule-interface [Exposed=Window] interface CSSGroupingRule : CSSRule { - // [SameObject] readonly attribute CSSRuleList cssRules; - // unsigned long insertRule(DOMString rule, unsigned long index); - // void deleteRule(unsigned long index); + [SameObject] readonly attribute CSSRuleList cssRules; + [Throws] unsigned long insertRule(DOMString rule, unsigned long index); + [Throws] void deleteRule(unsigned long index); }; |