Bug 1358993 - (Part 1) [servo] Store the pointer of reusable sheets in StylesheetLoader. draft
authorKuoE0 <kuoe0.tw@gmail.com>
Thu, 18 May 2017 17:15:16 +0800
changeset 587577 18da361f8c88efe55f6b0022cdd5fa64adcd6fa3
parent 587503 bdb2387396b4a74dfefb7c983733eed3625e906a
child 587578 eb5c481192177229d1ed11ffa300bb484ae19137
push id61757
push userbmo:kuoe0@mozilla.com
push dateThu, 01 Jun 2017 10:13:23 +0000
bugs1358993
milestone55.0a1
Bug 1358993 - (Part 1) [servo] Store the pointer of reusable sheets in StylesheetLoader. MozReview-Commit-ID: DZP2bChjj3k
servo/ports/geckolib/glue.rs
servo/ports/geckolib/stylesheet_loader.rs
--- 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)
     }