diff options
author | Simon Sapin <simon.sapin@exyr.org> | 2016-11-28 17:48:32 +0100 |
---|---|---|
committer | Simon Sapin <simon.sapin@exyr.org> | 2016-11-28 18:01:02 +0100 |
commit | 70b250fe2ac43658a823cf5de4eb636f7b603d3d (patch) | |
tree | e51bdc123e16d01368168182f60c687658cfd10d | |
parent | f1d49d3773846a65cb403af4e041660fad3117be (diff) | |
download | servo-70b250fe2ac43658a823cf5de4eb636f7b603d3d.tar.gz servo-70b250fe2ac43658a823cf5de4eb636f7b603d3d.zip |
Use stylesheet’s base URL and ns prefixes in CSSOM insert/appendRule.
-rw-r--r-- | components/script/dom/csskeyframesrule.rs | 5 | ||||
-rw-r--r-- | components/script/dom/cssrulelist.rs | 4 | ||||
-rw-r--r-- | components/script/dom/cssstylesheet.rs | 4 | ||||
-rw-r--r-- | components/style/keyframes.rs | 11 | ||||
-rw-r--r-- | components/style/stylesheets.rs | 20 |
5 files changed, 24 insertions, 20 deletions
diff --git a/components/script/dom/csskeyframesrule.rs b/components/script/dom/csskeyframesrule.rs index bda3ee2ea20..41d7beeaf80 100644 --- a/components/script/dom/csskeyframesrule.rs +++ b/components/script/dom/csskeyframesrule.rs @@ -19,7 +19,7 @@ use parking_lot::RwLock; use std::sync::Arc; use style::keyframes::{Keyframe, KeyframeSelector}; use style::parser::ParserContextExtraData; -use style::stylesheets::{KeyframesRule, Origin}; +use style::stylesheets::KeyframesRule; use style_traits::ToCss; #[dom_struct] @@ -83,8 +83,7 @@ impl CSSKeyframesRuleMethods for CSSKeyframesRule { fn AppendRule(&self, rule: DOMString) { let global = self.global(); let window = global.as_window(); - let doc = window.Document(); - let rule = Keyframe::parse(&rule, Origin::Author, doc.url().clone(), + let rule = Keyframe::parse(&rule, self.cssrule.parent_stylesheet().style_stylesheet(), ParserContextExtraData::default()); if let Ok(rule) = rule { self.keyframesrule.write().keyframes.push(rule); diff --git a/components/script/dom/cssrulelist.rs b/components/script/dom/cssrulelist.rs index 643cce9a944..e51ae3c78be 100644 --- a/components/script/dom/cssrulelist.rs +++ b/components/script/dom/cssrulelist.rs @@ -84,10 +84,10 @@ impl CSSRuleList { let global = self.global(); let window = global.as_window(); - let doc = window.Document(); let index = idx as usize; - let new_rule = css_rules.insert_rule(rule, doc.url().clone(), index, nested)?; + let parent_stylesheet = self.parent_stylesheet.style_stylesheet(); + let new_rule = css_rules.insert_rule(rule, parent_stylesheet, index, nested)?; let parent_stylesheet = &*self.parent_stylesheet; let dom_rule = CSSRule::new_specific(&window, parent_stylesheet, new_rule); diff --git a/components/script/dom/cssstylesheet.rs b/components/script/dom/cssstylesheet.rs index 2e643f3e8a2..93aefa8f852 100644 --- a/components/script/dom/cssstylesheet.rs +++ b/components/script/dom/cssstylesheet.rs @@ -67,6 +67,10 @@ impl CSSStyleSheet { self.global().as_window().Document().invalidate_stylesheets(); } } + + pub fn style_stylesheet(&self) -> &StyleStyleSheet { + &self.style_stylesheet + } } impl CSSStyleSheetMethods for CSSStyleSheet { diff --git a/components/style/keyframes.rs b/components/style/keyframes.rs index 7c9b969a210..831627d42c3 100644 --- a/components/style/keyframes.rs +++ b/components/style/keyframes.rs @@ -9,11 +9,10 @@ use parser::{ParserContext, ParserContextExtraData, log_css_error}; use properties::{Importance, PropertyDeclaration, PropertyDeclarationBlock}; use properties::PropertyDeclarationParseResult; use properties::animated_properties::TransitionProperty; -use servo_url::ServoUrl; use std::fmt; use std::sync::Arc; use style_traits::ToCss; -use stylesheets::{MemoryHoleReporter, Origin}; +use stylesheets::{MemoryHoleReporter, Stylesheet}; /// A number from 1 to 100, indicating the percentage of the animation where /// this keyframe should run. @@ -108,11 +107,11 @@ impl ToCss for Keyframe { impl Keyframe { - pub fn parse(css: &str, origin: Origin, - base_url: ServoUrl, - extra_data: ParserContextExtraData) -> Result<Arc<RwLock<Self>>, ()> { + pub fn parse(css: &str, parent_stylesheet: &Stylesheet, extra_data: ParserContextExtraData) + -> Result<Arc<RwLock<Self>>, ()> { let error_reporter = Box::new(MemoryHoleReporter); - let context = ParserContext::new_with_extra_data(origin, &base_url, + let context = ParserContext::new_with_extra_data(parent_stylesheet.origin, + &parent_stylesheet.base_url, error_reporter, extra_data); let mut input = Parser::new(css); diff --git a/components/style/stylesheets.rs b/components/style/stylesheets.rs index 1529a2e77ef..f05cd4a7df6 100644 --- a/components/style/stylesheets.rs +++ b/components/style/stylesheets.rs @@ -88,7 +88,7 @@ impl CssRules { } // https://drafts.csswg.org/cssom/#insert-a-css-rule - pub fn insert_rule(&self, rule: &str, base_url: ServoUrl, index: usize, nested: bool) + pub fn insert_rule(&self, rule: &str, parent_stylesheet: &Stylesheet, index: usize, nested: bool) -> Result<CssRule, RulesMutateError> { let mut rules = self.0.write(); @@ -108,7 +108,7 @@ impl CssRules { // Step 3, 4 // XXXManishearth should we also store the namespace map? - let (new_rule, new_state) = try!(CssRule::parse(&rule, Origin::Author, base_url, + let (new_rule, new_state) = try!(CssRule::parse(&rule, parent_stylesheet, ParserContextExtraData::default(), state)); // Step 5 @@ -282,13 +282,15 @@ impl CssRule { // input state is None for a nested rule // Returns a parsed CSS rule and the final state of the parser - pub fn parse(css: &str, origin: Origin, - base_url: ServoUrl, - extra_data: ParserContextExtraData, - state: Option<State>) -> Result<(Self, State), SingleRuleParseError> { + pub fn parse(css: &str, + parent_stylesheet: &Stylesheet, + extra_data: ParserContextExtraData, + state: Option<State>) + -> Result<(Self, State), SingleRuleParseError> { let error_reporter = Box::new(MemoryHoleReporter); - let mut namespaces = Namespaces::default(); - let context = ParserContext::new_with_extra_data(origin, &base_url, + let mut namespaces = parent_stylesheet.namespaces.write(); + let context = ParserContext::new_with_extra_data(parent_stylesheet.origin, + &parent_stylesheet.base_url, error_reporter.clone(), extra_data); let mut input = Parser::new(css); @@ -296,7 +298,7 @@ impl CssRule { // nested rules are in the body state let state = state.unwrap_or(State::Body); let mut rule_parser = TopLevelRuleParser { - stylesheet_origin: origin, + stylesheet_origin: parent_stylesheet.origin, context: context, state: Cell::new(state), namespaces: &mut namespaces, |