Bug 1657087 - Fix fallible behaviour of nsStyleAutoArray and nsStyleImageLayers. r=emilio

Differential Revision: https://phabricator.services.mozilla.com/D85850
This commit is contained in:
Simon Giesecke 2020-08-04 12:39:39 +00:00
Родитель bf58055b03
Коммит 98908aba1e
3 изменённых файлов: 21 добавлений и 87 удалений

Просмотреть файл

@ -20,11 +20,23 @@ class nsStyleAutoArray {
// This constructor places a single element in mFirstElement.
enum WithSingleInitialElement { WITH_SINGLE_INITIAL_ELEMENT };
explicit nsStyleAutoArray(WithSingleInitialElement) {}
nsStyleAutoArray(const nsStyleAutoArray& aOther) { *this = aOther; }
nsStyleAutoArray& operator=(const nsStyleAutoArray& aOther) {
nsStyleAutoArray(const nsStyleAutoArray&) = delete;
nsStyleAutoArray& operator=(const nsStyleAutoArray&) = delete;
nsStyleAutoArray(nsStyleAutoArray&&) = default;
nsStyleAutoArray& operator=(nsStyleAutoArray&&) = default;
bool Assign(const nsStyleAutoArray& aOther, mozilla::fallible_t) {
mFirstElement = aOther.mFirstElement;
mOtherElements = aOther.mOtherElements.Clone();
return *this;
return mOtherElements.Assign(aOther.mOtherElements, mozilla::fallible);
}
nsStyleAutoArray Clone() const {
nsStyleAutoArray res(WITH_SINGLE_INITIAL_ELEMENT);
res.mFirstElement = mFirstElement;
res.mOtherElements = mOtherElements.Clone();
return res;
}
bool operator==(const nsStyleAutoArray& aOther) const {
@ -36,13 +48,6 @@ class nsStyleAutoArray {
return !(*this == aOther);
}
nsStyleAutoArray& operator=(nsStyleAutoArray&& aOther) {
mFirstElement = aOther.mFirstElement;
mOtherElements.SwapElements(aOther.mOtherElements);
return *this;
}
size_t Length() const { return mOtherElements.Length() + 1; }
const T& operator[](size_t aIndex) const {
return aIndex == 0 ? mFirstElement : mOtherElements[aIndex - 1];

Просмотреть файл

@ -1704,25 +1704,8 @@ nsStyleImageLayers::nsStyleImageLayers(const nsStyleImageLayers& aSource)
mMaskModeCount(aSource.mMaskModeCount),
mBlendModeCount(aSource.mBlendModeCount),
mCompositeCount(aSource.mCompositeCount),
mLayers(aSource.mLayers) // deep copy
{
mLayers(aSource.mLayers.Clone()) {
MOZ_COUNT_CTOR(nsStyleImageLayers);
// If the deep copy of mLayers failed, truncate the counts.
uint32_t count = mLayers.Length();
if (count != aSource.mLayers.Length()) {
NS_WARNING("truncating counts due to out-of-memory");
mAttachmentCount = std::max(mAttachmentCount, count);
mClipCount = std::max(mClipCount, count);
mOriginCount = std::max(mOriginCount, count);
mRepeatCount = std::max(mRepeatCount, count);
mPositionXCount = std::max(mPositionXCount, count);
mPositionYCount = std::max(mPositionYCount, count);
mImageCount = std::max(mImageCount, count);
mSizeCount = std::max(mSizeCount, count);
mMaskModeCount = std::max(mMaskModeCount, count);
mBlendModeCount = std::max(mBlendModeCount, count);
mCompositeCount = std::max(mCompositeCount, count);
}
}
static bool AnyLayerIsElementImage(const nsStyleImageLayers& aLayers) {
@ -1823,61 +1806,7 @@ nsStyleImageLayers& nsStyleImageLayers::operator=(
mMaskModeCount = aOther.mMaskModeCount;
mBlendModeCount = aOther.mBlendModeCount;
mCompositeCount = aOther.mCompositeCount;
mLayers = aOther.mLayers;
uint32_t count = mLayers.Length();
if (count != aOther.mLayers.Length()) {
NS_WARNING("truncating counts due to out-of-memory");
mAttachmentCount = std::max(mAttachmentCount, count);
mClipCount = std::max(mClipCount, count);
mOriginCount = std::max(mOriginCount, count);
mRepeatCount = std::max(mRepeatCount, count);
mPositionXCount = std::max(mPositionXCount, count);
mPositionYCount = std::max(mPositionYCount, count);
mImageCount = std::max(mImageCount, count);
mSizeCount = std::max(mSizeCount, count);
mMaskModeCount = std::max(mMaskModeCount, count);
mBlendModeCount = std::max(mBlendModeCount, count);
mCompositeCount = std::max(mCompositeCount, count);
}
return *this;
}
nsStyleImageLayers& nsStyleImageLayers::operator=(nsStyleImageLayers&& aOther) {
mAttachmentCount = aOther.mAttachmentCount;
mClipCount = aOther.mClipCount;
mOriginCount = aOther.mOriginCount;
mRepeatCount = aOther.mRepeatCount;
mPositionXCount = aOther.mPositionXCount;
mPositionYCount = aOther.mPositionYCount;
mImageCount = aOther.mImageCount;
mSizeCount = aOther.mSizeCount;
mMaskModeCount = aOther.mMaskModeCount;
mBlendModeCount = aOther.mBlendModeCount;
mCompositeCount = aOther.mCompositeCount;
mLayers = std::move(aOther.mLayers);
// XXX(Bug 1657087) The OOM check doesn't make sense, probably it was just
// copied over from the copy constructor. First, moving cannot fail due to
// OOM, second the condition is incorrect. Just because the implementation of
// nsStyleAutoArray's move constructor uses swapping, we do not seem to happen
// to run into the branch erroneously.
uint32_t count = mLayers.Length();
if (count != aOther.mLayers.Length()) {
NS_WARNING("truncating counts due to out-of-memory");
mAttachmentCount = std::max(mAttachmentCount, count);
mClipCount = std::max(mClipCount, count);
mOriginCount = std::max(mOriginCount, count);
mRepeatCount = std::max(mRepeatCount, count);
mPositionXCount = std::max(mPositionXCount, count);
mPositionYCount = std::max(mPositionYCount, count);
mImageCount = std::max(mImageCount, count);
mSizeCount = std::max(mSizeCount, count);
mMaskModeCount = std::max(mMaskModeCount, count);
mBlendModeCount = std::max(mBlendModeCount, count);
mCompositeCount = std::max(mCompositeCount, count);
}
mLayers = aOther.mLayers.Clone();
return *this;
}
@ -2287,12 +2216,12 @@ nsStyleDisplay::nsStyleDisplay(const Document& aDocument)
}
nsStyleDisplay::nsStyleDisplay(const nsStyleDisplay& aSource)
: mTransitions(aSource.mTransitions),
: mTransitions(aSource.mTransitions.Clone()),
mTransitionTimingFunctionCount(aSource.mTransitionTimingFunctionCount),
mTransitionDurationCount(aSource.mTransitionDurationCount),
mTransitionDelayCount(aSource.mTransitionDelayCount),
mTransitionPropertyCount(aSource.mTransitionPropertyCount),
mAnimations(aSource.mAnimations),
mAnimations(aSource.mAnimations.Clone()),
mAnimationTimingFunctionCount(aSource.mAnimationTimingFunctionCount),
mAnimationDurationCount(aSource.mAnimationDurationCount),
mAnimationDelayCount(aSource.mAnimationDelayCount),

Просмотреть файл

@ -316,7 +316,7 @@ struct nsStyleImageLayers {
nsStyleImageLayers::LayerType aType) const;
nsStyleImageLayers& operator=(const nsStyleImageLayers& aOther);
nsStyleImageLayers& operator=(nsStyleImageLayers&& aOther);
nsStyleImageLayers& operator=(nsStyleImageLayers&& aOther) = default;
bool operator==(const nsStyleImageLayers& aOther) const;
static const nsCSSPropertyID kBackgroundLayerTable[];