Skip to content

Commit

Permalink
Add CSSGroupingRule.{cssRules, insertRule(), deleteRule()}
Browse files Browse the repository at this point in the history
  • Loading branch information
Manishearth committed Nov 23, 2016
1 parent cada5d7 commit a9cd17a
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 8 deletions.
48 changes: 44 additions & 4 deletions components/script/dom/cssgroupingrule.rs
Expand Up @@ -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)
}
}
3 changes: 2 additions & 1 deletion components/script/dom/cssmediarule.rs
Expand Up @@ -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,
}
}
Expand Down
1 change: 1 addition & 0 deletions components/script/dom/cssrulelist.rs
Expand Up @@ -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 {
Expand Down
6 changes: 3 additions & 3 deletions components/script/dom/webidls/CSSGroupingRule.webidl
Expand Up @@ -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);
};

0 comments on commit a9cd17a

Please sign in to comment.