Bug 1315155 - Make nsStyleContentData use nsStyleImageRequest for images. r?xidorn draft
authorCameron McCormack <cam@mcc.id.au>
Fri, 21 Oct 2016 08:14:56 +0800
changeset 433595 57f9adee6202fb8730b24ed1ee61a4956c73caa4
parent 433594 48b73ee0206428294d104ab302a407c944dce628
child 433596 b6955cabfdade95f166740214c14751525cbcbfb
push id34625
push userbmo:cam@mcc.id.au
push dateFri, 04 Nov 2016 03:04:28 +0000
reviewersxidorn
bugs1315155
milestone52.0a1
Bug 1315155 - Make nsStyleContentData use nsStyleImageRequest for images. r?xidorn MozReview-Commit-ID: 80gQBdNrGq1
layout/style/nsRuleNode.cpp
layout/style/nsStyleStruct.cpp
layout/style/nsStyleStruct.h
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -8839,18 +8839,18 @@ nsRuleNode::ComputeContentData(void* aSt
     count = 0;
     contentValueList = contentValue->GetListValue();
     while (contentValueList) {
       const nsCSSValue& value = contentValueList->mValue;
       nsCSSUnit unit = value.GetUnit();
       nsStyleContentData& data = content->ContentAt(count++);
       switch (unit) {
         case eCSSUnit_Image:
-          SetImageRequest([&](imgRequestProxy* req) {
-            data.SetImage(req);
+          SetStyleImageRequest([&](nsStyleImageRequest* req) {
+            data.SetImageRequest(req);
           }, mPresContext, value);
           break;
         case eCSSUnit_String:
         case eCSSUnit_Attr: {
           nsStyleContentType type =
             unit == eCSSUnit_String ? eStyleContentType_String
                                     : eStyleContentType_Attr;
           value.GetStringValue(buffer);
@@ -8990,25 +8990,16 @@ nsRuleNode::ComputeContentData(void* aSt
     }
     break;
   }
 
   default:
     MOZ_ASSERT(false, "unexpected value unit");
   }
 
-  // If we ended up with an image, track it.
-  for (uint32_t i = 0; i < content->ContentCount(); ++i) {
-    if (content->ContentAt(i).GetType() == eStyleContentType_Image &&
-        content->ContentAt(i).GetImage()) {
-      content->ContentAt(i).TrackImage(
-          aContext->PresContext()->Document()->ImageTracker());
-    }
-  }
-
   COMPUTE_END_RESET(Content, content)
 }
 
 const void*
 nsRuleNode::ComputeXULData(void* aStartStruct,
                            const nsRuleData* aRuleData,
                            nsStyleContext* aContext,
                            nsRuleNode* aHighestNode,
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -3499,38 +3499,34 @@ nsStyleVisibility::CalcDifference(const 
     }
   }
   return hint;
 }
 
 nsStyleContentData::~nsStyleContentData()
 {
   MOZ_COUNT_DTOR(nsStyleContentData);
-  MOZ_ASSERT(!mImageTracked,
-             "nsStyleContentData being destroyed while still tracking image!");
+
   if (mType == eStyleContentType_Image) {
-    NS_IF_RELEASE(mContent.mImage);
+    mContent.mImage->Release();
   } else if (mType == eStyleContentType_Counter ||
              mType == eStyleContentType_Counters) {
     mContent.mCounters->Release();
   } else if (mContent.mString) {
     free(mContent.mString);
   }
 }
 
 nsStyleContentData::nsStyleContentData(const nsStyleContentData& aOther)
   : mType(aOther.mType)
-#ifdef DEBUG
-  , mImageTracked(false)
-#endif
 {
   MOZ_COUNT_CTOR(nsStyleContentData);
   if (mType == eStyleContentType_Image) {
     mContent.mImage = aOther.mContent.mImage;
-    NS_IF_ADDREF(mContent.mImage);
+    mContent.mImage->AddRef();
   } else if (mType == eStyleContentType_Counter ||
              mType == eStyleContentType_Counters) {
     mContent.mCounters = aOther.mContent.mCounters;
     mContent.mCounters->AddRef();
   } else if (aOther.mContent.mString) {
     mContent.mString = NS_strdup(aOther.mContent.mString);
   } else {
     mContent.mString = nullptr;
@@ -3551,71 +3547,25 @@ nsStyleContentData::operator=(const nsSt
 
 bool
 nsStyleContentData::operator==(const nsStyleContentData& aOther) const
 {
   if (mType != aOther.mType) {
     return false;
   }
   if (mType == eStyleContentType_Image) {
-    if (!mContent.mImage || !aOther.mContent.mImage) {
-      return mContent.mImage == aOther.mContent.mImage;
-    }
-    bool eq;
-    nsCOMPtr<nsIURI> thisURI, otherURI;
-    mContent.mImage->GetURI(getter_AddRefs(thisURI));
-    aOther.mContent.mImage->GetURI(getter_AddRefs(otherURI));
-    return thisURI == otherURI ||  // handles null==null
-           (thisURI && otherURI &&
-            NS_SUCCEEDED(thisURI->Equals(otherURI, &eq)) &&
-            eq);
+    return DefinitelyEqualImages(mContent.mImage, aOther.mContent.mImage);
   }
   if (mType == eStyleContentType_Counter ||
       mType == eStyleContentType_Counters) {
     return *mContent.mCounters == *aOther.mContent.mCounters;
   }
   return safe_strcmp(mContent.mString, aOther.mContent.mString) == 0;
 }
 
-void
-nsStyleContentData::TrackImage(ImageTracker* aImageTracker)
-{
-  // Sanity
-  MOZ_ASSERT(!mImageTracked, "Already tracking image!");
-  MOZ_ASSERT(mType == eStyleContentType_Image,
-             "Trying to do image tracking on non-image!");
-  MOZ_ASSERT(mContent.mImage,
-             "Can't track image when there isn't one!");
-
-  aImageTracker->Add(mContent.mImage);
-
-  // Mark state
-#ifdef DEBUG
-  mImageTracked = true;
-#endif
-}
-
-void
-nsStyleContentData::UntrackImage(ImageTracker* aImageTracker)
-{
-  // Sanity
-  MOZ_ASSERT(mImageTracked, "Image not tracked!");
-  MOZ_ASSERT(mType == eStyleContentType_Image,
-             "Trying to do image tracking on non-image!");
-  MOZ_ASSERT(mContent.mImage,
-             "Can't untrack image when there isn't one!");
-
-  aImageTracker->Remove(mContent.mImage);
-
-  // Mark state
-#ifdef DEBUG
-  mImageTracked = false;
-#endif
-}
-
 
 //-----------------------
 // nsStyleContent
 //
 
 nsStyleContent::nsStyleContent(StyleStructContext aContext)
 {
   MOZ_COUNT_CTOR(nsStyleContent);
@@ -3624,24 +3574,16 @@ nsStyleContent::nsStyleContent(StyleStru
 nsStyleContent::~nsStyleContent()
 {
   MOZ_COUNT_DTOR(nsStyleContent);
 }
 
 void
 nsStyleContent::Destroy(nsPresContext* aContext)
 {
-  // Unregister any images we might have with the document.
-  for (auto& content : mContents) {
-    if (content.GetType() == eStyleContentType_Image &&
-        content.GetImage()) {
-      content.UntrackImage(aContext->Document()->ImageTracker());
-    }
-  }
-
   this->~nsStyleContent();
   aContext->PresShell()->FreeByObjectID(eArenaObjectID_nsStyleContent, this);
 }
 
 nsStyleContent::nsStyleContent(const nsStyleContent& aSource)
   : mContents(aSource.mContents)
   , mIncrements(aSource.mIncrements)
   , mResets(aSource.mResets)
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -3153,56 +3153,56 @@ enum nsStyleContentType {
   eStyleContentType_Uninitialized
 };
 
 class nsStyleContentData
 {
 public:
   nsStyleContentData()
     : mType(eStyleContentType_Uninitialized)
-#ifdef DEBUG
-    , mImageTracked(false)
-#endif
   {
     MOZ_COUNT_CTOR(nsStyleContentData);
     mContent.mString = nullptr;
   }
   nsStyleContentData(const nsStyleContentData&);
 
   ~nsStyleContentData();
   nsStyleContentData& operator=(const nsStyleContentData& aOther);
   bool operator==(const nsStyleContentData& aOther) const;
 
   bool operator!=(const nsStyleContentData& aOther) const {
     return !(*this == aOther);
   }
 
-  void TrackImage(mozilla::dom::ImageTracker* aImageTracker);
-  void UntrackImage(mozilla::dom::ImageTracker* aImageTracker);
-
   nsStyleContentType GetType() const { return mType; }
 
   char16_t* GetString() const
   {
     MOZ_ASSERT(mType == eStyleContentType_String ||
                mType == eStyleContentType_Attr);
     return mContent.mString;
   }
 
   nsCSSValue::Array* GetCounters() const
   {
     MOZ_ASSERT(mType == eStyleContentType_Counter ||
                mType == eStyleContentType_Counters);
     return mContent.mCounters;
   }
 
+  nsStyleImageRequest* GetImageRequest() const
+  {
+    MOZ_ASSERT(mType == eStyleContentType_Image);
+    return mContent.mImage;
+  }
+
   imgRequestProxy* GetImage() const
   {
     MOZ_ASSERT(mType == eStyleContentType_Image);
-    return mContent.mImage;
+    return mContent.mImage->get();
   }
 
   void SetKeyword(nsStyleContentType aType)
   {
     MOZ_ASSERT(aType == eStyleContentType_OpenQuote ||
                aType == eStyleContentType_CloseQuote ||
                aType == eStyleContentType_NoOpenQuote ||
                aType == eStyleContentType_NoCloseQuote ||
@@ -3230,35 +3230,32 @@ public:
     MOZ_ASSERT(aCounters);
     MOZ_ASSERT(mType == eStyleContentType_Uninitialized,
                "should only initialize nsStyleContentData once");
     mType = aType;
     mContent.mCounters = aCounters;
     mContent.mCounters->AddRef();
   }
 
-  void SetImage(imgRequestProxy* aRequest)
+  void SetImageRequest(nsStyleImageRequest* aRequest)
   {
     MOZ_ASSERT(mType == eStyleContentType_Uninitialized,
                "should only initialize nsStyleContentData once");
-    MOZ_ASSERT(!mImageTracked,
-               "Setting a new image without untracking the old one!");
-    NS_IF_ADDREF(mContent.mImage = aRequest);
+    MOZ_ASSERT(aRequest);
+    mContent.mImage = aRequest;
+    mContent.mImage->AddRef();
   }
 
 private:
   nsStyleContentType mType;
   union {
     char16_t *mString;
-    imgRequestProxy *mImage;
+    nsStyleImageRequest* mImage;
     nsCSSValue::Array* mCounters;
   } mContent;
-#ifdef DEBUG
-  bool mImageTracked;
-#endif
 };
 
 struct nsStyleCounterData
 {
   nsString  mCounter;
   int32_t   mValue;
 
   bool operator==(const nsStyleCounterData& aOther) const {