Bug 1292618: Tidy up nsStyleContent's API now allocations are infallible. r?heycam
MozReview-Commit-ID: BrHn4RiEWeg
--- a/layout/base/nsCounterManager.cpp
+++ b/layout/base/nsCounterManager.cpp
@@ -221,42 +221,41 @@ nsCounterManager::AddCounterResetsAndInc
!styleContent->CounterResetCount())
return false;
// Add in order, resets first, so all the comparisons will be optimized
// for addition at the end of the list.
int32_t i, i_end;
bool dirty = false;
for (i = 0, i_end = styleContent->CounterResetCount(); i != i_end; ++i)
- dirty |= AddResetOrIncrement(aFrame, i,
- styleContent->GetCounterResetAt(i),
- nsCounterChangeNode::RESET);
+ dirty |= AddResetOrIncrement(aFrame, i, styleContent->CounterResetAt(i),
+ nsCounterChangeNode::RESET);
for (i = 0, i_end = styleContent->CounterIncrementCount(); i != i_end; ++i)
- dirty |= AddResetOrIncrement(aFrame, i,
- styleContent->GetCounterIncrementAt(i),
- nsCounterChangeNode::INCREMENT);
+ dirty |=
+ AddResetOrIncrement(aFrame, i, styleContent->CounterIncrementAt(i),
+ nsCounterChangeNode::INCREMENT);
return dirty;
}
bool
-nsCounterManager::AddResetOrIncrement(nsIFrame *aFrame, int32_t aIndex,
- const nsStyleCounterData *aCounterData,
+nsCounterManager::AddResetOrIncrement(nsIFrame* aFrame, int32_t aIndex,
+ const nsStyleCounterData& aCounterData,
nsCounterNode::Type aType)
{
- nsCounterChangeNode *node =
- new nsCounterChangeNode(aFrame, aType, aCounterData->mValue, aIndex);
+ nsCounterChangeNode* node =
+ new nsCounterChangeNode(aFrame, aType, aCounterData.mValue, aIndex);
- nsCounterList *counterList = CounterListFor(aCounterData->mCounter);
+ nsCounterList* counterList = CounterListFor(aCounterData.mCounter);
- counterList->Insert(node);
- if (!counterList->IsLast(node)) {
- // Tell the caller it's responsible for recalculating the entire
- // list.
- counterList->SetDirty();
- return true;
+ counterList->Insert(node);
+ if (!counterList->IsLast(node)) {
+ // Tell the caller it's responsible for recalculating the entire
+ // list.
+ counterList->SetDirty();
+ return true;
}
// Don't call Calc() if the list is already dirty -- it'll be recalculated
// anyway, and trying to calculate with a dirty list doesn't work.
if (MOZ_LIKELY(!counterList->IsDirty())) {
node->Calc(counterList);
}
return false;
--- a/layout/base/nsCounterManager.h
+++ b/layout/base/nsCounterManager.h
@@ -266,16 +266,16 @@ public:
if ((aIncrement > 0) != (newValue > aOldValue)) {
newValue = aOldValue;
}
return newValue;
}
private:
// for |AddCounterResetsAndIncrements| only
- bool AddResetOrIncrement(nsIFrame *aFrame, int32_t aIndex,
- const nsStyleCounterData *aCounterData,
- nsCounterNode::Type aType);
+ bool AddResetOrIncrement(nsIFrame* aFrame, int32_t aIndex,
+ const nsStyleCounterData& aCounterData,
+ nsCounterNode::Type aType);
- nsClassHashtable<nsStringHashKey, nsCounterList> mNames;
+ nsClassHashtable<nsStringHashKey, nsCounterList> mNames;
};
#endif /* nsCounterManager_h_ */
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -1192,21 +1192,21 @@ nsComputedDOMStyle::DoGetCounterIncremen
}
RefPtr<nsDOMCSSValueList> valueList = GetROCSSValueList(false);
for (uint32_t i = 0, i_end = content->CounterIncrementCount(); i < i_end; ++i) {
RefPtr<nsROCSSPrimitiveValue> name = new nsROCSSPrimitiveValue;
RefPtr<nsROCSSPrimitiveValue> value = new nsROCSSPrimitiveValue;
- const nsStyleCounterData *data = content->GetCounterIncrementAt(i);
+ const nsStyleCounterData& data = content->CounterIncrementAt(i);
nsAutoString escaped;
- nsStyleUtil::AppendEscapedCSSIdent(data->mCounter, escaped);
+ nsStyleUtil::AppendEscapedCSSIdent(data.mCounter, escaped);
name->SetString(escaped);
- value->SetNumber(data->mValue); // XXX This should really be integer
+ value->SetNumber(data.mValue); // XXX This should really be integer
valueList->AppendCSSValue(name.forget());
valueList->AppendCSSValue(value.forget());
}
return valueList.forget();
}
@@ -1436,21 +1436,21 @@ nsComputedDOMStyle::DoGetCounterReset()
}
RefPtr<nsDOMCSSValueList> valueList = GetROCSSValueList(false);
for (uint32_t i = 0, i_end = content->CounterResetCount(); i < i_end; ++i) {
RefPtr<nsROCSSPrimitiveValue> name = new nsROCSSPrimitiveValue;
RefPtr<nsROCSSPrimitiveValue> value = new nsROCSSPrimitiveValue;
- const nsStyleCounterData *data = content->GetCounterResetAt(i);
+ const nsStyleCounterData& data = content->CounterResetAt(i);
nsAutoString escaped;
- nsStyleUtil::AppendEscapedCSSIdent(data->mCounter, escaped);
+ nsStyleUtil::AppendEscapedCSSIdent(data.mCounter, escaped);
name->SetString(escaped);
- value->SetNumber(data->mValue); // XXX This should really be integer
+ value->SetNumber(data.mValue); // XXX This should really be integer
valueList->AppendCSSValue(name.forget());
valueList->AppendCSSValue(value.forget());
}
return valueList.forget();
}
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -8854,96 +8854,91 @@ nsRuleNode::ComputeContentData(void* aSt
case eCSSUnit_Unset:
// "normal", "none", "initial" and "unset" all mean no content
content->AllocateContents(0);
break;
case eCSSUnit_Inherit:
conditions.SetUncacheable();
count = parentContent->ContentCount();
- if (NS_SUCCEEDED(content->AllocateContents(count))) {
- while (0 < count--) {
- content->ContentAt(count) = parentContent->ContentAt(count);
- }
+ content->AllocateContents(count);
+ while (0 < count--) {
+ content->ContentAt(count) = parentContent->ContentAt(count);
}
break;
case eCSSUnit_Enumerated: {
MOZ_ASSERT(contentValue->GetIntValue() == NS_STYLE_CONTENT_ALT_CONTENT,
"unrecognized solitary content keyword");
content->AllocateContents(1);
nsStyleContentData& data = content->ContentAt(0);
data.mType = eStyleContentType_AltContent;
data.mContent.mString = nullptr;
break;
}
case eCSSUnit_List:
case eCSSUnit_ListDep: {
const nsCSSValueList* contentValueList = contentValue->GetListValue();
- count = 0;
- while (contentValueList) {
- count++;
- contentValueList = contentValueList->mNext;
- }
- if (NS_SUCCEEDED(content->AllocateContents(count))) {
- const nsAutoString nullStr;
- count = 0;
- contentValueList = contentValue->GetListValue();
- while (contentValueList) {
- const nsCSSValue& value = contentValueList->mValue;
- nsCSSUnit unit = value.GetUnit();
- nsStyleContentType type;
- nsStyleContentData &data = content->ContentAt(count++);
- switch (unit) {
- case eCSSUnit_String: type = eStyleContentType_String; break;
- case eCSSUnit_Image: type = eStyleContentType_Image; break;
- case eCSSUnit_Attr: type = eStyleContentType_Attr; break;
- case eCSSUnit_Counter: type = eStyleContentType_Counter; break;
- case eCSSUnit_Counters: type = eStyleContentType_Counters; break;
- case eCSSUnit_Enumerated:
- switch (value.GetIntValue()) {
- case NS_STYLE_CONTENT_OPEN_QUOTE:
- type = eStyleContentType_OpenQuote; break;
- case NS_STYLE_CONTENT_CLOSE_QUOTE:
- type = eStyleContentType_CloseQuote; break;
- case NS_STYLE_CONTENT_NO_OPEN_QUOTE:
- type = eStyleContentType_NoOpenQuote; break;
- case NS_STYLE_CONTENT_NO_CLOSE_QUOTE:
- type = eStyleContentType_NoCloseQuote; break;
- default:
- NS_ERROR("bad content value");
- type = eStyleContentType_Uninitialized;
- }
- break;
- default:
- NS_ERROR("bad content type");
- type = eStyleContentType_Uninitialized;
- }
- data.mType = type;
- if (type == eStyleContentType_Image) {
- SetImageRequest([&](imgRequestProxy* req) {
- data.SetImage(req);
- }, mPresContext, value);
- }
- else if (type <= eStyleContentType_Attr) {
- value.GetStringValue(buffer);
- data.mContent.mString = NS_strdup(buffer.get());
- }
- else if (type <= eStyleContentType_Counters) {
- data.mContent.mCounters = value.GetArrayValue();
- data.mContent.mCounters->AddRef();
- }
- else {
- data.mContent.mString = nullptr;
- }
- contentValueList = contentValueList->mNext;
+ count = 0;
+ while (contentValueList) {
+ count++;
+ contentValueList = contentValueList->mNext;
+ }
+ content->AllocateContents(count);
+ const nsAutoString nullStr;
+ count = 0;
+ contentValueList = contentValue->GetListValue();
+ while (contentValueList) {
+ const nsCSSValue& value = contentValueList->mValue;
+ nsCSSUnit unit = value.GetUnit();
+ nsStyleContentType type;
+ nsStyleContentData &data = content->ContentAt(count++);
+ switch (unit) {
+ case eCSSUnit_String: type = eStyleContentType_String; break;
+ case eCSSUnit_Image: type = eStyleContentType_Image; break;
+ case eCSSUnit_Attr: type = eStyleContentType_Attr; break;
+ case eCSSUnit_Counter: type = eStyleContentType_Counter; break;
+ case eCSSUnit_Counters: type = eStyleContentType_Counters; break;
+ case eCSSUnit_Enumerated:
+ switch (value.GetIntValue()) {
+ case NS_STYLE_CONTENT_OPEN_QUOTE:
+ type = eStyleContentType_OpenQuote; break;
+ case NS_STYLE_CONTENT_CLOSE_QUOTE:
+ type = eStyleContentType_CloseQuote; break;
+ case NS_STYLE_CONTENT_NO_OPEN_QUOTE:
+ type = eStyleContentType_NoOpenQuote; break;
+ case NS_STYLE_CONTENT_NO_CLOSE_QUOTE:
+ type = eStyleContentType_NoCloseQuote; break;
+ default:
+ NS_ERROR("bad content value");
+ type = eStyleContentType_Uninitialized;
}
- }
- break;
+ break;
+ default:
+ NS_ERROR("bad content type");
+ type = eStyleContentType_Uninitialized;
+ }
+ data.mType = type;
+ if (type == eStyleContentType_Image) {
+ SetImageRequest([&](imgRequestProxy* req) {
+ data.SetImage(req);
+ }, mPresContext, value);
+ } else if (type <= eStyleContentType_Attr) {
+ value.GetStringValue(buffer);
+ data.mContent.mString = NS_strdup(buffer.get());
+ } else if (type <= eStyleContentType_Counters) {
+ data.mContent.mCounters = value.GetArrayValue();
+ data.mContent.mCounters->AddRef();
+ } else {
+ data.mContent.mString = nullptr;
+ }
+ contentValueList = contentValueList->mNext;
+ }
+ break;
}
default:
MOZ_ASSERT(false, "unrecognized content unit");
}
// counter-increment: [string [int]]+, none, inherit
const nsCSSValue* counterIncrementValue =
@@ -8956,35 +8951,31 @@ nsRuleNode::ComputeContentData(void* aSt
case eCSSUnit_Initial:
case eCSSUnit_Unset:
content->AllocateCounterIncrements(0);
break;
case eCSSUnit_Inherit:
conditions.SetUncacheable();
count = parentContent->CounterIncrementCount();
- if (NS_SUCCEEDED(content->AllocateCounterIncrements(count))) {
- while (0 < count--) {
- const nsStyleCounterData *data =
- parentContent->GetCounterIncrementAt(count);
- content->SetCounterIncrementAt(count, data->mCounter, data->mValue);
- }
+ content->AllocateCounterIncrements(count);
+ while (count--) {
+ const nsStyleCounterData& data = parentContent->CounterIncrementAt(count);
+ content->SetCounterIncrementAt(count, data.mCounter, data.mValue);
}
break;
case eCSSUnit_PairList:
case eCSSUnit_PairListDep: {
const nsCSSValuePairList* ourIncrement =
counterIncrementValue->GetPairListValue();
MOZ_ASSERT(ourIncrement->mXValue.GetUnit() == eCSSUnit_Ident,
"unexpected value unit");
count = ListLength(ourIncrement);
- if (NS_FAILED(content->AllocateCounterIncrements(count))) {
- break;
- }
+ content->AllocateCounterIncrements(count);
count = 0;
for (const nsCSSValuePairList* p = ourIncrement; p; p = p->mNext, count++) {
int32_t increment;
if (p->mYValue.GetUnit() == eCSSUnit_Integer) {
increment = p->mYValue.GetIntValue();
} else {
increment = 1;
@@ -9009,36 +9000,31 @@ nsRuleNode::ComputeContentData(void* aSt
case eCSSUnit_Initial:
case eCSSUnit_Unset:
content->AllocateCounterResets(0);
break;
case eCSSUnit_Inherit:
conditions.SetUncacheable();
count = parentContent->CounterResetCount();
- if (NS_SUCCEEDED(content->AllocateCounterResets(count))) {
- while (0 < count--) {
- const nsStyleCounterData *data =
- parentContent->GetCounterResetAt(count);
- content->SetCounterResetAt(count, data->mCounter, data->mValue);
- }
+ content->AllocateCounterResets(count);
+ while (0 < count--) {
+ const nsStyleCounterData& data = parentContent->CounterResetAt(count);
+ content->SetCounterResetAt(count, data.mCounter, data.mValue);
}
break;
case eCSSUnit_PairList:
case eCSSUnit_PairListDep: {
const nsCSSValuePairList* ourReset =
counterResetValue->GetPairListValue();
MOZ_ASSERT(ourReset->mXValue.GetUnit() == eCSSUnit_Ident,
"unexpected value unit");
count = ListLength(ourReset);
- if (NS_FAILED(content->AllocateCounterResets(count))) {
- break;
- }
-
+ content->AllocateCounterResets(count);
count = 0;
for (const nsCSSValuePairList* p = ourReset; p; p = p->mNext, count++) {
int32_t reset;
if (p->mYValue.GetUnit() == eCSSUnit_Integer) {
reset = p->mYValue.GetIntValue();
} else {
reset = 0;
}
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -3402,38 +3402,42 @@ nsStyleContentData::~nsStyleContentData(
} else if (mType == eStyleContentType_Counter ||
mType == eStyleContentType_Counters) {
mContent.mCounters->Release();
} else if (mContent.mString) {
free(mContent.mString);
}
}
-nsStyleContentData&
-nsStyleContentData::operator=(const nsStyleContentData& aOther)
+nsStyleContentData::nsStyleContentData(const nsStyleContentData& aOther)
{
- if (this == &aOther) {
- return *this;
- }
- this->~nsStyleContentData();
- new (this) nsStyleContentData();
-
mType = aOther.mType;
if (mType == eStyleContentType_Image) {
mContent.mImage = aOther.mContent.mImage;
NS_IF_ADDREF(mContent.mImage);
} 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;
}
+}
+
+nsStyleContentData&
+nsStyleContentData::operator=(const nsStyleContentData& aOther)
+{
+ if (this == &aOther) {
+ return *this;
+ }
+ this->~nsStyleContentData();
+ new (this) nsStyleContentData(aOther);
+
return *this;
}
bool
nsStyleContentData::operator==(const nsStyleContentData& aOther) const
{
if (mType != aOther.mType) {
return false;
@@ -3504,84 +3508,46 @@ nsStyleContentData::UntrackImage(nsPresC
//-----------------------
// nsStyleContent
//
nsStyleContent::nsStyleContent(StyleStructContext aContext)
: mMarkerOffset(eStyleUnit_Auto)
- , mContents(nullptr)
- , mIncrements(nullptr)
- , mResets(nullptr)
- , mContentCount(0)
- , mIncrementCount(0)
- , mResetCount(0)
{
MOZ_COUNT_CTOR(nsStyleContent);
}
nsStyleContent::~nsStyleContent()
{
MOZ_COUNT_DTOR(nsStyleContent);
- DELETE_ARRAY_IF(mContents);
- DELETE_ARRAY_IF(mIncrements);
- DELETE_ARRAY_IF(mResets);
}
void
nsStyleContent::Destroy(nsPresContext* aContext)
{
// Unregister any images we might have with the document.
- for (uint32_t i = 0; i < mContentCount; ++i) {
- if ((mContents[i].mType == eStyleContentType_Image) &&
- mContents[i].mContent.mImage) {
- mContents[i].UntrackImage(aContext);
+ for (auto& content : mContents) {
+ if (content.mType == eStyleContentType_Image && content.mContent.mImage) {
+ content.UntrackImage(aContext);
}
}
this->~nsStyleContent();
- aContext->PresShell()->
- FreeByObjectID(eArenaObjectID_nsStyleContent, this);
+ aContext->PresShell()->FreeByObjectID(eArenaObjectID_nsStyleContent, this);
}
nsStyleContent::nsStyleContent(const nsStyleContent& aSource)
: mMarkerOffset(aSource.mMarkerOffset)
- , mContents(nullptr)
- , mIncrements(nullptr)
- , mResets(nullptr)
- , mContentCount(0)
- , mIncrementCount(0)
- , mResetCount(0)
-
+ , mContents(aSource.mContents)
+ , mIncrements(aSource.mIncrements)
+ , mResets(aSource.mResets)
{
MOZ_COUNT_CTOR(nsStyleContent);
-
- uint32_t index;
- if (NS_SUCCEEDED(AllocateContents(aSource.ContentCount()))) {
- for (index = 0; index < mContentCount; index++) {
- ContentAt(index) = aSource.ContentAt(index);
- }
- }
-
- if (NS_SUCCEEDED(AllocateCounterIncrements(aSource.CounterIncrementCount()))) {
- for (index = 0; index < mIncrementCount; index++) {
- const nsStyleCounterData *data = aSource.GetCounterIncrementAt(index);
- mIncrements[index].mCounter = data->mCounter;
- mIncrements[index].mValue = data->mValue;
- }
- }
-
- if (NS_SUCCEEDED(AllocateCounterResets(aSource.CounterResetCount()))) {
- for (index = 0; index < mResetCount; index++) {
- const nsStyleCounterData *data = aSource.GetCounterResetAt(index);
- mResets[index].mCounter = data->mCounter;
- mResets[index].mValue = data->mValue;
- }
- }
}
nsChangeHint
nsStyleContent::CalcDifference(const nsStyleContent& aNewData) const
{
// In ReResolveStyleContext we assume that if there's no existing
// ::before or ::after and we don't have to restyle children of the
// node then we can't end up with a ::before or ::after due to the
@@ -3589,72 +3555,32 @@ nsStyleContent::CalcDifference(const nsS
// exception to the above is when the 'content' property of the node
// changes and the pseudo-element inherits the changed value. Since
// the code here triggers a frame change on the node in that case,
// the optimization in ReResolveStyleContext is ok. But if we ever
// change this code to not reconstruct frames on changes to the
// 'content' property, then we will need to revisit the optimization
// in ReResolveStyleContext.
- if (mContentCount != aNewData.mContentCount ||
- mIncrementCount != aNewData.mIncrementCount ||
- mResetCount != aNewData.mResetCount) {
+ // Unfortunately we need to reframe even if the content lengths are the same;
+ // a simple reflow will not pick up different text or different image URLs,
+ // since we set all that up in the CSSFrameConstructor
+ if (mContents != aNewData.mContents ||
+ mIncrements != aNewData.mIncrements ||
+ mResets != aNewData.mResets) {
return nsChangeHint_ReconstructFrame;
}
- uint32_t ix = mContentCount;
- while (0 < ix--) {
- if (mContents[ix] != aNewData.mContents[ix]) {
- // Unfortunately we need to reframe here; a simple reflow
- // will not pick up different text or different image URLs,
- // since we set all that up in the CSSFrameConstructor
- return nsChangeHint_ReconstructFrame;
- }
- }
- ix = mIncrementCount;
- while (0 < ix--) {
- if ((mIncrements[ix].mValue != aNewData.mIncrements[ix].mValue) ||
- (mIncrements[ix].mCounter != aNewData.mIncrements[ix].mCounter)) {
- return nsChangeHint_ReconstructFrame;
- }
- }
- ix = mResetCount;
- while (0 < ix--) {
- if ((mResets[ix].mValue != aNewData.mResets[ix].mValue) ||
- (mResets[ix].mCounter != aNewData.mResets[ix].mCounter)) {
- return nsChangeHint_ReconstructFrame;
- }
- }
if (mMarkerOffset != aNewData.mMarkerOffset) {
return NS_STYLE_HINT_REFLOW;
}
+
return nsChangeHint(0);
}
-nsresult
-nsStyleContent::AllocateContents(uint32_t aCount)
-{
- // We need to run the destructors of the elements of mContents, so we
- // delete and reallocate even if aCount == mContentCount. (If
- // nsStyleContentData had its members private and managed their
- // ownership on setting, we wouldn't need this, but that seems
- // unnecessary at this point.)
- DELETE_ARRAY_IF(mContents);
- if (aCount) {
- mContents = new nsStyleContentData[aCount];
- if (! mContents) {
- mContentCount = 0;
- return NS_ERROR_OUT_OF_MEMORY;
- }
- }
- mContentCount = aCount;
- return NS_OK;
-}
-
-
// --------------------
// nsStyleTextReset
//
nsStyleTextReset::nsStyleTextReset(StyleStructContext aContext)
: mTextDecorationLine(NS_STYLE_TEXT_DECORATION_LINE_NONE)
, mUnicodeBidi(NS_STYLE_UNICODE_BIDI_NORMAL)
, mInitialLetterSink(0)
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -3153,16 +3153,17 @@ struct nsStyleContentData
#endif
nsStyleContentData()
: mType(eStyleContentType_Uninitialized)
#ifdef DEBUG
, mImageTracked(false)
#endif
{ 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);
}
@@ -3172,29 +3173,32 @@ struct nsStyleContentData
void SetImage(imgRequestProxy* aRequest)
{
MOZ_ASSERT(!mImageTracked,
"Setting a new image without untracking the old one!");
MOZ_ASSERT(mType == eStyleContentType_Image, "Wrong type!");
NS_IF_ADDREF(mContent.mImage = aRequest);
}
-private:
- nsStyleContentData(const nsStyleContentData&); // not to be implemented
};
struct nsStyleCounterData
{
nsString mCounter;
int32_t mValue;
+
+ bool operator==(const nsStyleCounterData& aOther) const {
+ return mValue == aOther.mValue && mCounter == aOther.mCounter;
+ }
+
+ bool operator!=(const nsStyleCounterData& aOther) const {
+ return !(*this == aOther);
+ }
};
-
-#define DELETE_ARRAY_IF(array) if (array) { delete[] array; array = nullptr; }
-
struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleContent
{
explicit nsStyleContent(StyleStructContext aContext);
nsStyleContent(const nsStyleContent& aContent);
~nsStyleContent();
void* operator new(size_t sz, nsStyleContent* aSelf) CPP_THROW_NEW { return aSelf; }
void* operator new(size_t sz, nsPresContext* aContext) CPP_THROW_NEW {
@@ -3211,100 +3215,70 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsSt
static nsChangeHint DifferenceAlwaysHandledForDescendants() {
// CalcDifference never returns the reflow hints that are sometimes
// handled for descendants as hints not handled for descendants.
return nsChangeHint_NeedReflow |
nsChangeHint_ReflowChangesSizeOrPosition |
nsChangeHint_ClearAncestorIntrinsics;
}
- uint32_t ContentCount() const { return mContentCount; } // [reset]
+ uint32_t ContentCount() const { return mContents.Length(); } // [reset]
const nsStyleContentData& ContentAt(uint32_t aIndex) const {
- NS_ASSERTION(aIndex < mContentCount, "out of range");
return mContents[aIndex];
}
- nsStyleContentData& ContentAt(uint32_t aIndex) {
- NS_ASSERTION(aIndex < mContentCount, "out of range");
- return mContents[aIndex];
- }
-
- nsresult AllocateContents(uint32_t aCount);
-
- uint32_t CounterIncrementCount() const { return mIncrementCount; } // [reset]
- const nsStyleCounterData* GetCounterIncrementAt(uint32_t aIndex) const {
- NS_ASSERTION(aIndex < mIncrementCount, "out of range");
- return &mIncrements[aIndex];
- }
-
- nsresult AllocateCounterIncrements(uint32_t aCount) {
- if (aCount != mIncrementCount) {
- DELETE_ARRAY_IF(mIncrements);
- if (aCount) {
- mIncrements = new nsStyleCounterData[aCount];
- if (! mIncrements) {
- mIncrementCount = 0;
- return NS_ERROR_OUT_OF_MEMORY;
- }
- }
- mIncrementCount = aCount;
- }
- return NS_OK;
- }
-
- nsresult SetCounterIncrementAt(uint32_t aIndex, const nsString& aCounter, int32_t aIncrement) {
- if (aIndex < mIncrementCount) {
- mIncrements[aIndex].mCounter = aCounter;
- mIncrements[aIndex].mValue = aIncrement;
- return NS_OK;
- }
- return NS_ERROR_ILLEGAL_VALUE;
- }
-
- uint32_t CounterResetCount() const { return mResetCount; } // [reset]
- const nsStyleCounterData* GetCounterResetAt(uint32_t aIndex) const {
- NS_ASSERTION(aIndex < mResetCount, "out of range");
- return &mResets[aIndex];
- }
-
- nsresult AllocateCounterResets(uint32_t aCount) {
- if (aCount != mResetCount) {
- DELETE_ARRAY_IF(mResets);
- if (aCount) {
- mResets = new nsStyleCounterData[aCount];
- if (! mResets) {
- mResetCount = 0;
- return NS_ERROR_OUT_OF_MEMORY;
- }
- }
- mResetCount = aCount;
- }
- return NS_OK;
- }
-
- nsresult SetCounterResetAt(uint32_t aIndex, const nsString& aCounter, int32_t aValue) {
- if (aIndex < mResetCount) {
- mResets[aIndex].mCounter = aCounter;
- mResets[aIndex].mValue = aValue;
- return NS_OK;
- }
- return NS_ERROR_ILLEGAL_VALUE;
+ nsStyleContentData& ContentAt(uint32_t aIndex) { return mContents[aIndex]; }
+
+ void AllocateContents(uint32_t aCount) {
+ // We need to run the destructors of the elements of mContents, so we
+ // delete and reallocate even if aCount == mContentCount. (If
+ // nsStyleContentData had its members private and managed their
+ // ownership on setting, we wouldn't need this, but that seems
+ // unnecessary at this point.)
+ mContents.Clear();
+ mContents.SetLength(aCount);
+ }
+
+ uint32_t CounterIncrementCount() const { return mIncrements.Length(); } // [reset]
+ const nsStyleCounterData& CounterIncrementAt(uint32_t aIndex) const {
+ return mIncrements[aIndex];
+ }
+
+ void AllocateCounterIncrements(uint32_t aCount) {
+ mIncrements.Clear();
+ mIncrements.SetLength(aCount);
+ }
+
+ void SetCounterIncrementAt(uint32_t aIndex, const nsString& aCounter, int32_t aIncrement) {
+ mIncrements[aIndex].mCounter = aCounter;
+ mIncrements[aIndex].mValue = aIncrement;
+ }
+
+ uint32_t CounterResetCount() const { return mResets.Length(); } // [reset]
+ const nsStyleCounterData& CounterResetAt(uint32_t aIndex) const {
+ return mResets[aIndex];
+ }
+
+ void AllocateCounterResets(uint32_t aCount) {
+ mResets.Clear();
+ mResets.SetLength(aCount);
+ }
+
+ void SetCounterResetAt(uint32_t aIndex, const nsString& aCounter, int32_t aValue) {
+ mResets[aIndex].mCounter = aCounter;
+ mResets[aIndex].mValue = aValue;
}
nsStyleCoord mMarkerOffset; // [reset] coord, auto
protected:
- nsStyleContentData* mContents;
- nsStyleCounterData* mIncrements;
- nsStyleCounterData* mResets;
-
- uint32_t mContentCount;
- uint32_t mIncrementCount;
- uint32_t mResetCount;
+ nsTArray<nsStyleContentData> mContents;
+ nsTArray<nsStyleCounterData> mIncrements;
+ nsTArray<nsStyleCounterData> mResets;
};
struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleUIReset
{
explicit nsStyleUIReset(StyleStructContext aContext);
nsStyleUIReset(const nsStyleUIReset& aOther);
~nsStyleUIReset();