Move "remove a CSS rule" algorithm to style

This commit is contained in:
Xidorn Quan 2016-11-24 12:30:08 +11:00
parent 134ef33842
commit 03bcb7a26a
2 changed files with 28 additions and 26 deletions

View file

@ -16,7 +16,6 @@ use dom::window::Window;
use parking_lot::RwLock;
use std::sync::Arc;
use style::stylesheets::{CssRules, KeyframesRule, RulesMutateError};
use style::stylesheets::CssRule as StyleCssRule;
no_jsmanaged_fields!(RulesSource);
no_jsmanaged_fields!(CssRules);
@ -97,37 +96,14 @@ impl CSSRuleList {
Ok((idx))
}
// https://drafts.csswg.org/cssom/#remove-a-css-rule
// https://drafts.csswg.org/css-animations/#dom-csskeyframesrule-deleterule
// In case of a keyframe rule, index must be valid.
pub fn remove_rule(&self, index: u32) -> ErrorResult {
let index = index as usize;
match self.rules {
RulesSource::Rules(ref css_rules) => {
// https://drafts.csswg.org/cssom/#remove-a-css-rule
{
let rules = css_rules.0.read();
// Step 1, 2
if index >= rules.len() {
return Err(Error::IndexSize);
}
// Step 3
let ref rule = rules[index];
// Step 4
if let StyleCssRule::Namespace(..) = *rule {
if !CssRules::only_ns_or_import(&rules) {
return Err(Error::InvalidState);
}
}
}
// Step 5, 6
css_rules.remove_rule(index)?;
let mut dom_rules = self.dom_rules.borrow_mut();
css_rules.0.write().remove(index);
dom_rules[index].get().map(|r| r.detach());
dom_rules.remove(index);
Ok(())

View file

@ -119,7 +119,7 @@ impl CssRules {
}
}
/// https://drafts.csswg.org/cssom/#insert-a-css-rule
// https://drafts.csswg.org/cssom/#insert-a-css-rule
pub fn insert_rule(&self, rule: &str, base_url: ServoUrl, index: usize, nested: bool)
-> Result<CssRule, RulesMutateError> {
let mut rules = self.0.write();
@ -158,6 +158,32 @@ impl CssRules {
rules.insert(index, new_rule.clone());
Ok(new_rule)
}
// https://drafts.csswg.org/cssom/#remove-a-css-rule
pub fn remove_rule(&self, index: usize) -> Result<(), RulesMutateError> {
let mut rules = self.0.write();
// Step 1, 2
if index >= rules.len() {
return Err(RulesMutateError::IndexSize);
}
{
// Step 3
let ref rule = rules[index];
// Step 4
if let CssRule::Namespace(..) = *rule {
if !CssRules::only_ns_or_import(&rules) {
return Err(RulesMutateError::InvalidState);
}
}
}
// Step 5, 6
rules.remove(index);
Ok(())
}
}
#[derive(Debug)]