Bug 1310463 - Part 1: Make list-style-image use nsStyleImageRequest for storage. r=xidorn
MozReview-Commit-ID: ENTo2HNbBpN
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -7961,28 +7961,28 @@ nsRuleNode::ComputeListData(void* aStart
break;
default:
NS_NOTREACHED("Unexpected value unit");
}
// list-style-image: url, none, inherit
const nsCSSValue* imageValue = aRuleData->ValueForListStyleImage();
if (eCSSUnit_Image == imageValue->GetUnit()) {
- SetImageRequest([&](imgRequestProxy* req) {
- list->SetListStyleImage(req);
+ SetStyleImageRequest([&](nsStyleImageRequest* req) {
+ list->mListStyleImage = req;
}, mPresContext, *imageValue);
}
else if (eCSSUnit_None == imageValue->GetUnit() ||
eCSSUnit_Initial == imageValue->GetUnit()) {
- list->SetListStyleImage(nullptr);
+ list->mListStyleImage = nullptr;
}
else if (eCSSUnit_Inherit == imageValue->GetUnit() ||
eCSSUnit_Unset == imageValue->GetUnit()) {
conditions.SetUncacheable();
- list->SetListStyleImage(parentList->GetListStyleImage());
+ list->mListStyleImage = parentList->mListStyleImage;
}
// list-style-position: enum, inherit, initial
SetValue(*aRuleData->ValueForListStylePosition(),
list->mListStylePosition, conditions,
SETVAL_ENUMERATED | SETVAL_UNSET_INHERIT,
parentList->mListStylePosition,
NS_STYLE_LIST_STYLE_POSITION_OUTSIDE);
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -653,25 +653,36 @@ nsStyleList::nsStyleList(StyleStructCont
nsStyleList::~nsStyleList()
{
MOZ_COUNT_DTOR(nsStyleList);
}
nsStyleList::nsStyleList(const nsStyleList& aSource)
: mListStylePosition(aSource.mListStylePosition)
+ , mListStyleImage(aSource.mListStyleImage)
, mCounterStyle(aSource.mCounterStyle)
, mQuotes(aSource.mQuotes)
, mImageRegion(aSource.mImageRegion)
{
- SetListStyleImage(aSource.GetListStyleImage());
MOZ_COUNT_CTOR(nsStyleList);
}
void
+nsStyleList::FinishStyle(nsPresContext* aPresContext)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aPresContext->StyleSet()->IsServo());
+
+ if (mListStyleImage && !mListStyleImage->IsResolved()) {
+ mListStyleImage->Resolve(aPresContext);
+ }
+}
+
+void
nsStyleList::SetQuotesInherit(const nsStyleList* aOther)
{
mQuotes = aOther->mQuotes;
}
void
nsStyleList::SetQuotesInitial()
{
@@ -725,17 +736,17 @@ nsStyleList::CalcDifference(const nsStyl
if (mQuotes != aNewData.mQuotes &&
(mQuotes || aNewData.mQuotes) &&
GetQuotePairs() != aNewData.GetQuotePairs()) {
return nsChangeHint_ReconstructFrame;
}
if (mListStylePosition != aNewData.mListStylePosition) {
return nsChangeHint_ReconstructFrame;
}
- if (EqualImages(mListStyleImage, aNewData.mListStyleImage) &&
+ if (DefinitelyEqualImages(mListStyleImage, aNewData.mListStyleImage) &&
mCounterStyle == aNewData.mCounterStyle) {
if (mImageRegion.IsEqualInterior(aNewData.mImageRegion)) {
return nsChangeHint(0);
}
if (mImageRegion.width == aNewData.mImageRegion.width &&
mImageRegion.height == aNewData.mImageRegion.height) {
return NS_STYLE_HINT_VISUAL;
}
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -1510,17 +1510,18 @@ private:
~nsStyleQuoteValues() {}
};
struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleList
{
explicit nsStyleList(StyleStructContext aContext);
nsStyleList(const nsStyleList& aStyleList);
~nsStyleList();
- void FinishStyle(nsPresContext* aPresContext) {}
+
+ void FinishStyle(nsPresContext* aPresContext);
void* operator new(size_t sz, nsStyleList* aSelf) { return aSelf; }
void* operator new(size_t sz, nsPresContext* aContext) {
return aContext->PresShell()->
AllocateByObjectID(mozilla::eArenaObjectID_nsStyleList, sz);
}
void Destroy(nsPresContext* aContext) {
this->~nsStyleList();
@@ -1541,26 +1542,19 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsSt
nsChangeHint_ClearAncestorIntrinsics;
}
static void Shutdown() {
sInitialQuotes = nullptr;
sNoneQuotes = nullptr;
}
- imgRequestProxy* GetListStyleImage() const { return mListStyleImage; }
- void SetListStyleImage(imgRequestProxy* aReq)
+ imgRequestProxy* GetListStyleImage() const
{
- if (mListStyleImage) {
- mListStyleImage->UnlockImage();
- }
- mListStyleImage = aReq;
- if (mListStyleImage) {
- mListStyleImage->LockImage();
- }
+ return mListStyleImage ? mListStyleImage->get() : nullptr;
}
void GetListStyleType(nsSubstring& aType) const { mCounterStyle->GetStyleName(aType); }
mozilla::CounterStyle* GetCounterStyle() const
{
return mCounterStyle.get();
}
void SetCounterStyle(mozilla::CounterStyle* aStyle)
@@ -1578,20 +1572,20 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsSt
const nsStyleQuoteValues::QuotePairArray& GetQuotePairs() const;
void SetQuotesInherit(const nsStyleList* aOther);
void SetQuotesInitial();
void SetQuotesNone();
void SetQuotes(nsStyleQuoteValues::QuotePairArray&& aValues);
- uint8_t mListStylePosition; // [inherited]
+ uint8_t mListStylePosition; // [inherited]
+ RefPtr<nsStyleImageRequest> mListStyleImage; // [inherited]
private:
RefPtr<mozilla::CounterStyle> mCounterStyle; // [inherited]
- RefPtr<imgRequestProxy> mListStyleImage; // [inherited]
RefPtr<nsStyleQuoteValues> mQuotes; // [inherited]
nsStyleList& operator=(const nsStyleList& aOther) = delete;
public:
nsRect mImageRegion; // [inherited] the rect to use within an image
private:
// nsStyleQuoteValues objects representing two common values, for sharing.
static mozilla::StaticRefPtr<nsStyleQuoteValues> sInitialQuotes;