зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1657087 - Fix fallible behaviour of nsStyleAutoArray and nsStyleImageLayers. r=emilio
Differential Revision: https://phabricator.services.mozilla.com/D85850
This commit is contained in:
Родитель
bf58055b03
Коммит
98908aba1e
|
@ -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[];
|
||||
|
|
Загрузка…
Ссылка в новой задаче