Bug 1358993 - (Part 1) [servo] Store the pointer of reusable sheets in StylesheetLoader.
MozReview-Commit-ID: DZP2bChjj3k
--- a/servo/ports/geckolib/glue.rs
+++ b/servo/ports/geckolib/glue.rs
@@ -65,17 +65,17 @@ use style::gecko_bindings::bindings::nsT
use style::gecko_bindings::bindings::nsTimingFunctionBorrowedMut;
use style::gecko_bindings::structs;
use style::gecko_bindings::structs::{CSSPseudoElementType, CompositeOperation};
use style::gecko_bindings::structs::{RawServoStyleRule, ServoStyleSheet};
use style::gecko_bindings::structs::{SheetParsingMode, nsIAtom, nsCSSPropertyID};
use style::gecko_bindings::structs::{nsCSSFontFaceRule, nsCSSCounterStyleRule};
use style::gecko_bindings::structs::{nsRestyleHint, nsChangeHint, PropertyValuePair};
use style::gecko_bindings::structs::IterationCompositeOperation;
-use style::gecko_bindings::structs::Loader;
+use style::gecko_bindings::structs::{Loader, LoaderReusableStyleSheets};
use style::gecko_bindings::structs::MallocSizeOf;
use style::gecko_bindings::structs::RawGeckoPresContextOwned;
use style::gecko_bindings::structs::ServoElementSnapshotTable;
use style::gecko_bindings::structs::StyleRuleInclusion;
use style::gecko_bindings::structs::URLExtraData;
use style::gecko_bindings::structs::nsCSSValueSharedList;
use style::gecko_bindings::structs::nsCompatibility;
use style::gecko_bindings::structs::nsresult;
@@ -673,17 +673,17 @@ pub extern "C" fn Servo_StyleSheet_FromU
SheetParsingMode::eAgentSheetFeatures => Origin::UserAgent,
SheetParsingMode::eSafeAgentSheetFeatures => Origin::UserAgent,
};
let url_data = unsafe { RefPtr::from_ptr_ref(&extra_data) };
let loader = if loader.is_null() {
None
} else {
- Some(StylesheetLoader::new(loader, stylesheet))
+ Some(StylesheetLoader::new(loader, stylesheet, ptr::null_mut()))
};
// FIXME(emilio): loader.as_ref() doesn't typecheck for some reason?
let loader: Option<&StyleStylesheetLoader> = match loader {
None => None,
Some(ref s) => Some(s),
};
@@ -702,25 +702,26 @@ pub extern "C" fn Servo_StyleSheet_FromU
}
#[no_mangle]
pub extern "C" fn Servo_StyleSheet_ClearAndUpdate(stylesheet: RawServoStyleSheetBorrowed,
loader: *mut Loader,
gecko_stylesheet: *mut ServoStyleSheet,
data: *const nsACString,
extra_data: *mut URLExtraData,
- line_number_offset: u32)
+ line_number_offset: u32,
+ reusable_sheets: *mut LoaderReusableStyleSheets)
{
let input = unsafe { data.as_ref().unwrap().as_str_unchecked() };
let url_data = unsafe { RefPtr::from_ptr_ref(&extra_data) };
let loader = if loader.is_null() {
None
} else {
- Some(StylesheetLoader::new(loader, gecko_stylesheet))
+ Some(StylesheetLoader::new(loader, gecko_stylesheet, reusable_sheets))
};
// FIXME(emilio): loader.as_ref() doesn't typecheck for some reason?
let loader: Option<&StyleStylesheetLoader> = match loader {
None => None,
Some(ref s) => Some(s),
};
@@ -876,17 +877,17 @@ pub extern "C" fn Servo_CssRules_InsertR
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))
+ Some(StylesheetLoader::new(loader, gecko_stylesheet, ptr::null_mut()))
};
let loader = loader.as_ref().map(|loader| loader as &StyleStylesheetLoader);
let rule = unsafe { rule.as_ref().unwrap().as_str_unchecked() };
let global_style_data = &*GLOBAL_STYLE_DATA;
match Locked::<CssRules>::as_arc(&rules).insert_rule(&global_style_data.shared_lock,
rule,
sheet,
--- a/servo/ports/geckolib/stylesheet_loader.rs
+++ b/servo/ports/geckolib/stylesheet_loader.rs
@@ -1,25 +1,27 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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 style::gecko_bindings::bindings::Gecko_LoadStyleSheet;
-use style::gecko_bindings::structs::{Loader, ServoStyleSheet};
+use style::gecko_bindings::structs::{Loader, ServoStyleSheet, LoaderReusableStyleSheets};
use style::gecko_bindings::sugar::ownership::{HasArcFFI, FFIArcHelpers};
use style::media_queries::MediaList;
use style::shared_lock::Locked;
use style::stylearc::Arc;
use style::stylesheets::{ImportRule, Stylesheet, StylesheetLoader as StyleStylesheetLoader};
-pub struct StylesheetLoader(*mut Loader, *mut ServoStyleSheet);
+pub struct StylesheetLoader(*mut Loader, *mut ServoStyleSheet, *mut LoaderReusableStyleSheets);
impl StylesheetLoader {
- pub fn new(loader: *mut Loader, parent: *mut ServoStyleSheet) -> Self {
- StylesheetLoader(loader, parent)
+ pub fn new(loader: *mut Loader,
+ parent: *mut ServoStyleSheet,
+ reusable_sheets: *mut LoaderReusableStyleSheets) -> Self {
+ StylesheetLoader(loader, parent, reusable_sheets)
}
}
impl StyleStylesheetLoader for StylesheetLoader {
fn request_stylesheet(
&self,
media: Arc<Locked<MediaList>>,
make_import: &mut FnMut(Arc<Locked<MediaList>>) -> ImportRule,
@@ -32,16 +34,17 @@ impl StyleStylesheetLoader for Styleshee
// but the Url it points to or the allocating backing the String inside that Url won’t,
// so this raw pointer will still be valid.
let (spec_bytes, spec_len): (*const u8, usize) = import.url.as_slice_components();
let base_url_data = import.url.extra_data.get();
unsafe {
Gecko_LoadStyleSheet(self.0,
self.1,
+ self.2,
Stylesheet::arc_as_borrowed(&import.stylesheet),
base_url_data,
spec_bytes,
spec_len as u32,
media.into_strong())
}
make_arc(import)
}