Bug 1290218 Part 5: Subclass StyleSheetInfo to move the ServoStyleSheet raw sheet into its mInner. draft
authorBrad Werth <bwerth@mozilla.com>
Tue, 14 Feb 2017 12:05:12 -0800
changeset 488923 5ebcc31ae4182aed5ab749b60c1403ecbdda9b75
parent 488922 baca84d8e6c043d06d2e9a46fb9807aadc69dddd
child 488924 901c93de8ea17900460582ca6f4b924561843e64
push id46687
push userbwerth@mozilla.com
push dateFri, 24 Feb 2017 01:52:48 +0000
bugs1290218
milestone54.0a1
Bug 1290218 Part 5: Subclass StyleSheetInfo to move the ServoStyleSheet raw sheet into its mInner. MozReview-Commit-ID: Cu0qp3e8L5n
layout/style/ServoStyleSheet.cpp
layout/style/ServoStyleSheet.h
--- a/layout/style/ServoStyleSheet.cpp
+++ b/layout/style/ServoStyleSheet.cpp
@@ -13,23 +13,34 @@
 #include "mozilla/dom/CSSRuleList.h"
 
 #include "mozAutoDocUpdate.h"
 
 using namespace mozilla::dom;
 
 namespace mozilla {
 
+// -------------------------------
+// CSS Style Sheet Inner Data Container
+//
+
+ServoStyleSheetInner::ServoStyleSheetInner(CORSMode aCORSMode,
+                                           ReferrerPolicy aReferrerPolicy,
+                                           const SRIMetadata& aIntegrity)
+  : StyleSheetInfo(aCORSMode, aReferrerPolicy, aIntegrity)
+{
+}
+
 ServoStyleSheet::ServoStyleSheet(css::SheetParsingMode aParsingMode,
                                  CORSMode aCORSMode,
                                  net::ReferrerPolicy aReferrerPolicy,
                                  const dom::SRIMetadata& aIntegrity)
   : StyleSheet(StyleBackendType::Servo, aParsingMode)
 {
-  mInner = new StyleSheetInfo(aCORSMode, aReferrerPolicy, aIntegrity);
+  mInner = new ServoStyleSheetInner(aCORSMode, aReferrerPolicy, aIntegrity);
   mInner->AddSheet(this);
 }
 
 ServoStyleSheet::~ServoStyleSheet()
 {
   UnparentChildren();
 
   DropRuleList();
@@ -49,17 +60,17 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(Se
 NS_IMPL_CYCLE_COLLECTION_UNLINK_END_INHERITED(StyleSheet)
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(ServoStyleSheet, StyleSheet)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mRuleList)
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
 
 bool
 ServoStyleSheet::HasRules() const
 {
-  return mSheet && Servo_StyleSheet_HasRules(mSheet);
+  return Inner()->mSheet && Servo_StyleSheet_HasRules(Inner()->mSheet);
 }
 
 nsresult
 ServoStyleSheet::ParseSheet(css::Loader* aLoader,
                             const nsAString& aInput,
                             nsIURI* aSheetURI,
                             nsIURI* aBaseURI,
                             nsIPrincipal* aSheetPrincipal,
@@ -70,33 +81,33 @@ ServoStyleSheet::ParseSheet(css::Loader*
   RefPtr<ThreadSafePrincipalHolder> principal =
     new ThreadSafePrincipalHolder(aSheetPrincipal);
 
   nsCString baseString;
   nsresult rv = aBaseURI->GetSpec(baseString);
   NS_ENSURE_SUCCESS(rv, rv);
 
   NS_ConvertUTF16toUTF8 input(aInput);
-  if (!mSheet) {
-    mSheet =
+  if (!Inner()->mSheet) {
+    Inner()->mSheet =
       Servo_StyleSheet_FromUTF8Bytes(aLoader, this, &input, mParsingMode,
                                      &baseString, base, referrer,
                                      principal).Consume();
   } else {
-    Servo_StyleSheet_ClearAndUpdate(mSheet, aLoader, this, &input, base,
+    Servo_StyleSheet_ClearAndUpdate(Inner()->mSheet, aLoader, this, &input, base,
                                     referrer, principal);
   }
 
   return NS_OK;
 }
 
 void
 ServoStyleSheet::LoadFailed()
 {
-  mSheet = Servo_StyleSheet_Empty(mParsingMode).Consume();
+  Inner()->mSheet = Servo_StyleSheet_Empty(mParsingMode).Consume();
 }
 
 void
 ServoStyleSheet::DropRuleList()
 {
   if (mRuleList) {
     mRuleList->DropReference();
     mRuleList = nullptr;
@@ -109,17 +120,18 @@ ServoStyleSheet::GetDOMOwnerRule() const
   NS_ERROR("stylo: Don't know how to get DOM owner rule for ServoStyleSheet");
   return nullptr;
 }
 
 CSSRuleList*
 ServoStyleSheet::GetCssRulesInternal(ErrorResult& aRv)
 {
   if (!mRuleList) {
-    RefPtr<ServoCssRules> rawRules = Servo_StyleSheet_GetRules(mSheet).Consume();
+    RefPtr<ServoCssRules> rawRules =
+      Servo_StyleSheet_GetRules(Inner()->mSheet).Consume();
     mRuleList = new ServoCSSRuleList(this, rawRules.forget());
   }
   return mRuleList;
 }
 
 uint32_t
 ServoStyleSheet::InsertRuleInternal(const nsAString& aRule,
                                     uint32_t aIndex, ErrorResult& aRv)
--- a/layout/style/ServoStyleSheet.h
+++ b/layout/style/ServoStyleSheet.h
@@ -18,16 +18,30 @@ namespace mozilla {
 
 class ServoCSSRuleList;
 
 namespace css {
 class Loader;
 class Rule;
 }
 
+// -------------------------------
+// Servo Style Sheet Inner Data Container
+//
+
+struct ServoStyleSheetInner : public StyleSheetInfo
+{
+  ServoStyleSheetInner(CORSMode aCORSMode,
+                       ReferrerPolicy aReferrerPolicy,
+                       const dom::SRIMetadata& aIntegrity);
+
+  RefPtr<RawServoStyleSheet> mSheet;
+};
+
+
 /**
  * CSS style sheet object that is a wrapper for a Servo Stylesheet.
  */
 class ServoStyleSheet : public StyleSheet
 {
 public:
   ServoStyleSheet(css::SheetParsingMode aParsingMode,
                   CORSMode aCORSMode,
@@ -48,48 +62,54 @@ public:
 
   /**
    * Called instead of ParseSheet to initialize the Servo stylesheet object
    * for a failed load. Either ParseSheet or LoadFailed must be called before
    * adding a ServoStyleSheet to a ServoStyleSet.
    */
   void LoadFailed();
 
-  RawServoStyleSheet* RawSheet() const { return mSheet; }
+  RawServoStyleSheet* RawSheet() const {
+    return Inner()->mSheet;
+  }
   void SetSheetForImport(RawServoStyleSheet* aSheet) {
-    MOZ_ASSERT(!mSheet);
-    mSheet = aSheet;
+    MOZ_ASSERT(!Inner()->mSheet);
+    Inner()->mSheet = aSheet;
   }
 
   // WebIDL CSSStyleSheet API
   // Can't be inline because we can't include ImportRule here.  And can't be
   // called GetOwnerRule because that would be ambiguous with the ImportRule
   // version.
   css::Rule* GetDOMOwnerRule() const final;
 
   void WillDirty() {}
   void DidDirty() {}
 
   bool IsModified() const final { return false; }
 
 protected:
   virtual ~ServoStyleSheet();
 
+  ServoStyleSheetInner* Inner() const
+  {
+    return static_cast<ServoStyleSheetInner*>(mInner);
+  }
+
   // Internal methods which do not have security check and completeness check.
   dom::CSSRuleList* GetCssRulesInternal(ErrorResult& aRv);
   uint32_t InsertRuleInternal(const nsAString& aRule,
                               uint32_t aIndex, ErrorResult& aRv);
   void DeleteRuleInternal(uint32_t aIndex, ErrorResult& aRv);
 
   void EnabledStateChangedInternal() {}
 
 private:
   void DropRuleList();
 
-  RefPtr<RawServoStyleSheet> mSheet;
   RefPtr<ServoCSSRuleList> mRuleList;
 
   friend class StyleSheet;
 };
 
 } // namespace mozilla
 
 #endif // mozilla_ServoStyleSheet_h