From 0236a6ce998cfbf587211530816850dea593bbab Mon Sep 17 00:00:00 2001 From: Bobby Holley Date: Mon, 12 Feb 2018 15:29:31 -0800 Subject: [PATCH] Stylo: Pass an explicit parent SheetLoadData for child stylesheet loads. MozReview-Commit-ID: 7XNu42NtITm --- components/style/gecko/generated/bindings.rs | 3 +++ ports/geckolib/glue.rs | 10 +++++++--- ports/geckolib/stylesheet_loader.rs | 8 +++++--- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/components/style/gecko/generated/bindings.rs b/components/style/gecko/generated/bindings.rs index bbc833f1f8b..5a4845e727e 100644 --- a/components/style/gecko/generated/bindings.rs +++ b/components/style/gecko/generated/bindings.rs @@ -235,6 +235,7 @@ use gecko_bindings::structs::nscoord; use gecko_bindings::structs::nsresult; use gecko_bindings::structs::Loader; use gecko_bindings::structs::LoaderReusableStyleSheets; +use gecko_bindings::structs::SheetLoadData; use gecko_bindings::structs::ServoStyleSheet; use gecko_bindings::structs::ServoComputedData; use gecko_bindings::structs::ServoStyleContext; @@ -664,6 +665,7 @@ extern "C" { pub fn Gecko_LoadStyleSheet( loader: *mut Loader, parent: *mut ServoStyleSheet, + parent_load_data: *mut SheetLoadData, reusable_sheets: *mut LoaderReusableStyleSheets, base_url_data: *mut RawGeckoURLExtraData, url_bytes: *const u8, @@ -2093,6 +2095,7 @@ extern "C" { pub fn Servo_StyleSheet_FromUTF8Bytes( loader: *mut Loader, gecko_stylesheet: *mut ServoStyleSheet, + load_data: *mut SheetLoadData, data: *const u8, data_len: usize, parsing_mode: SheetParsingMode, diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 59fdffaf3ef..093e558488d 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -90,7 +90,7 @@ use style::gecko_bindings::structs; use style::gecko_bindings::structs::{CallerType, CSSPseudoElementType, CompositeOperation}; use style::gecko_bindings::structs::{Loader, LoaderReusableStyleSheets}; use style::gecko_bindings::structs::{RawServoStyleRule, ServoStyleContextStrong, RustString}; -use style::gecko_bindings::structs::{ServoStyleSheet, SheetParsingMode, nsAtom, nsCSSPropertyID}; +use style::gecko_bindings::structs::{ServoStyleSheet, SheetLoadData, SheetParsingMode, nsAtom, nsCSSPropertyID}; use style::gecko_bindings::structs::{nsCSSFontDesc, nsCSSFontFaceRule, nsCSSCounterStyleRule}; use style::gecko_bindings::structs::{nsRestyleHint, nsChangeHint, PropertyValuePair}; use style::gecko_bindings::structs::AtomArray; @@ -1067,10 +1067,14 @@ pub extern "C" fn Servo_StyleSheet_Empty(mode: SheetParsingMode) -> RawServoStyl ).into_strong() } +/// Note: The load_data corresponds to this sheet, and is passed as the parent +/// load data for child sheet loads. It may be null for certain cases where we +/// know we won't have child loads. #[no_mangle] pub extern "C" fn Servo_StyleSheet_FromUTF8Bytes( loader: *mut Loader, stylesheet: *mut ServoStyleSheet, + load_data: *mut SheetLoadData, data: *const u8, data_len: usize, mode: SheetParsingMode, @@ -1094,7 +1098,7 @@ pub extern "C" fn Servo_StyleSheet_FromUTF8Bytes( let loader = if loader.is_null() { None } else { - Some(StylesheetLoader::new(loader, stylesheet, reusable_sheets)) + Some(StylesheetLoader::new(loader, stylesheet, load_data, reusable_sheets)) }; // FIXME(emilio): loader.as_ref() doesn't typecheck for some reason? @@ -1538,7 +1542,7 @@ pub extern "C" fn Servo_CssRules_InsertRule( let loader = if loader.is_null() { None } else { - Some(StylesheetLoader::new(loader, gecko_stylesheet, ptr::null_mut())) + Some(StylesheetLoader::new(loader, gecko_stylesheet, ptr::null_mut(), ptr::null_mut())) }; let loader = loader.as_ref().map(|loader| loader as &StyleStylesheetLoader); let rule = unsafe { rule.as_ref().unwrap().as_str_unchecked() }; diff --git a/ports/geckolib/stylesheet_loader.rs b/ports/geckolib/stylesheet_loader.rs index fde5ad35dc5..e40fb2c05b9 100644 --- a/ports/geckolib/stylesheet_loader.rs +++ b/ports/geckolib/stylesheet_loader.rs @@ -6,7 +6,7 @@ use cssparser::SourceLocation; use servo_arc::Arc; use style::gecko::data::GeckoStyleSheet; use style::gecko_bindings::bindings::Gecko_LoadStyleSheet; -use style::gecko_bindings::structs::{Loader, ServoStyleSheet, LoaderReusableStyleSheets}; +use style::gecko_bindings::structs::{Loader, ServoStyleSheet, SheetLoadData, LoaderReusableStyleSheets}; use style::gecko_bindings::sugar::ownership::FFIArcHelpers; use style::media_queries::MediaList; use style::parser::ParserContext; @@ -15,13 +15,14 @@ use style::stylesheets::{ImportRule, StylesheetLoader as StyleStylesheetLoader}; use style::stylesheets::import_rule::ImportSheet; use style::values::specified::url::SpecifiedUrl; -pub struct StylesheetLoader(*mut Loader, *mut ServoStyleSheet, *mut LoaderReusableStyleSheets); +pub struct StylesheetLoader(*mut Loader, *mut ServoStyleSheet, *mut SheetLoadData, *mut LoaderReusableStyleSheets); impl StylesheetLoader { pub fn new(loader: *mut Loader, parent: *mut ServoStyleSheet, + parent_load_data: *mut SheetLoadData, reusable_sheets: *mut LoaderReusableStyleSheets) -> Self { - StylesheetLoader(loader, parent, reusable_sheets) + StylesheetLoader(loader, parent, parent_load_data, reusable_sheets) } } @@ -45,6 +46,7 @@ impl StyleStylesheetLoader for StylesheetLoader { Gecko_LoadStyleSheet(self.0, self.1, self.2, + self.3, base_url_data, spec_bytes, spec_len as u32,