Bug 1315155 - Make nsStyleContentData use nsStyleImageRequest for images. r?xidorn
MozReview-Commit-ID: 80gQBdNrGq1
--- 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 {