From a097a293b5b5caf6013bf28534d7a5d3b96acbf0 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Mon, 3 Apr 2017 21:17:11 +1000 Subject: [PATCH] Pass CSS loader to Servo for insertRule. --- components/script/dom/cssrulelist.rs | 5 ++++- components/style/stylesheets.rs | 15 +++++++++++---- ports/geckolib/glue.rs | 17 ++++++++++++++--- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/components/script/dom/cssrulelist.rs b/components/script/dom/cssrulelist.rs index 1f1573a05d5..4587659dfec 100644 --- a/components/script/dom/cssrulelist.rs +++ b/components/script/dom/cssrulelist.rs @@ -92,7 +92,10 @@ impl CSSRuleList { let parent_stylesheet = self.parent_stylesheet.style_stylesheet(); let new_rule = { let mut guard = parent_stylesheet.shared_lock.write(); - css_rules.write_with(&mut guard).insert_rule(rule, parent_stylesheet, index, nested)? + // FIXME We should probably pass in a proper StylesheetLoader. + // See servo/servo#16240 + css_rules.write_with(&mut guard).insert_rule(rule, parent_stylesheet, + index, nested, None)? // Drop `guard` here, // CSSRule::new_specific re-acquires the lock for @support and @media. }; diff --git a/components/style/stylesheets.rs b/components/style/stylesheets.rs index 9b75efb52cf..ff606827864 100644 --- a/components/style/stylesheets.rs +++ b/components/style/stylesheets.rs @@ -106,7 +106,12 @@ impl CssRules { } /// https://drafts.csswg.org/cssom/#insert-a-css-rule - pub fn insert_rule(&mut self, rule: &str, parent_stylesheet: &Stylesheet, index: usize, nested: bool) + pub fn insert_rule(&mut self, + rule: &str, + parent_stylesheet: &Stylesheet, + index: usize, + nested: bool, + loader: Option<&StylesheetLoader>) -> Result { // Step 1, 2 if index > self.0.len() { @@ -126,7 +131,8 @@ impl CssRules { // XXXManishearth should we also store the namespace map? let (new_rule, new_state) = try!(CssRule::parse(&rule, parent_stylesheet, - ParserContextExtraData::default(), state)); + ParserContextExtraData::default(), + state, loader)); // Step 5 // Computes the maximum allowed parser state at a given index. @@ -343,7 +349,8 @@ impl CssRule { pub fn parse(css: &str, parent_stylesheet: &Stylesheet, extra_data: ParserContextExtraData, - state: Option) + state: Option, + loader: Option<&StylesheetLoader>) -> Result<(Self, State), SingleRuleParseError> { let error_reporter = MemoryHoleReporter; let mut namespaces = parent_stylesheet.namespaces.write(); @@ -359,7 +366,7 @@ impl CssRule { stylesheet_origin: parent_stylesheet.origin, context: context, shared_lock: &parent_stylesheet.shared_lock, - loader: None, + loader: loader, state: Cell::new(state), namespaces: &mut namespaces, }; diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 00580613e2d..839d467503b 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -510,13 +510,24 @@ pub extern "C" fn Servo_CssRules_ListTypes(rules: ServoCssRulesBorrowed, } #[no_mangle] -pub extern "C" fn Servo_CssRules_InsertRule(rules: ServoCssRulesBorrowed, sheet: RawServoStyleSheetBorrowed, - rule: *const nsACString, index: u32, nested: bool, +pub extern "C" fn Servo_CssRules_InsertRule(rules: ServoCssRulesBorrowed, + sheet: RawServoStyleSheetBorrowed, + rule: *const nsACString, + index: u32, + nested: bool, + loader: *mut Loader, + gecko_stylesheet: *mut ServoStyleSheet, rule_type: *mut u16) -> nsresult { let sheet = Stylesheet::as_arc(&sheet); + let loader = if loader.is_null() { + None + } else { + Some(StylesheetLoader::new(loader, gecko_stylesheet)) + }; + let loader = loader.as_ref().map(|loader| loader as &StyleStylesheetLoader); let rule = unsafe { rule.as_ref().unwrap().as_str_unchecked() }; write_locked_arc(rules, |rules: &mut CssRules| { - match rules.insert_rule(rule, sheet, index as usize, nested) { + match rules.insert_rule(rule, sheet, index as usize, nested, loader) { Ok(new_rule) => { *unsafe { rule_type.as_mut().unwrap() } = new_rule.rule_type() as u16; nsresult::NS_OK