From fe4c928a464b5a53c3f8d8335663c4276648e30f Mon Sep 17 00:00:00 2001 From: Simon Giesecke Date: Tue, 5 May 2020 10:05:59 +0000 Subject: [PATCH] Bug 1626570 - Improve handling of copying arrays in layout/painting/. r=emilio Differential Revision: https://phabricator.services.mozilla.com/D72352 --- layout/painting/DisplayItemClip.h | 2 +- layout/painting/FrameLayerBuilder.cpp | 4 ++-- layout/painting/MaskLayerImageCache.cpp | 3 ++- layout/painting/nsDisplayList.h | 7 ++++--- layout/painting/nsDisplayListInvalidation.cpp | 2 +- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/layout/painting/DisplayItemClip.h b/layout/painting/DisplayItemClip.h index bd658eb61586..ff9df266035d 100644 --- a/layout/painting/DisplayItemClip.h +++ b/layout/painting/DisplayItemClip.h @@ -182,7 +182,7 @@ class DisplayItemClip { private: nsRect mClipRect; - nsTArray mRoundedClipRects; + CopyableTArray mRoundedClipRects; // If mHaveClipRect is false then this object represents no clipping at all // and mRoundedClipRects must be empty. bool mHaveClipRect; diff --git a/layout/painting/FrameLayerBuilder.cpp b/layout/painting/FrameLayerBuilder.cpp index faf1fd6c0fef..4d6cb1936214 100644 --- a/layout/painting/FrameLayerBuilder.cpp +++ b/layout/painting/FrameLayerBuilder.cpp @@ -333,7 +333,7 @@ void DisplayItemData::BeginUpdate(Layer* aLayer, LayerState aState, // We avoid adding or removing element unnecessarily // since we have to modify userdata each time - AutoTArray copy(mFrameList); + CopyableAutoTArray copy(mFrameList); if (!copy.RemoveElement(aItem->Frame())) { AddFrame(aItem->Frame()); mChangedFrameInvalidations.Or(mChangedFrameInvalidations, @@ -5740,7 +5740,7 @@ void ContainerState::SetupScrollingMetadata(NewLayerEntry* aEntry) { // so add to it rather than overwriting it (we clear the list when recycling // a layer). nsTArray> maskLayers( - aEntry->mLayer->GetAllAncestorMaskLayers()); + aEntry->mLayer->GetAllAncestorMaskLayers().Clone()); // Iterate over the ASR chain and create the corresponding scroll metadatas. // This loop is slightly tricky because the scrollframe-to-clip relationship diff --git a/layout/painting/MaskLayerImageCache.cpp b/layout/painting/MaskLayerImageCache.cpp index e93d87d107c0..2b3b63dc5750 100644 --- a/layout/painting/MaskLayerImageCache.cpp +++ b/layout/painting/MaskLayerImageCache.cpp @@ -52,7 +52,8 @@ MaskLayerImageCache::MaskLayerImageKey::MaskLayerImageKey() MaskLayerImageCache::MaskLayerImageKey::MaskLayerImageKey( const MaskLayerImageKey& aKey) - : mRoundedClipRects(aKey.mRoundedClipRects), mLayerCount(aKey.mLayerCount) { + : mRoundedClipRects(aKey.mRoundedClipRects.Clone()), + mLayerCount(aKey.mLayerCount) { MOZ_COUNT_CTOR(MaskLayerImageKey); } diff --git a/layout/painting/nsDisplayList.h b/layout/painting/nsDisplayList.h index 2579b6967451..b15224dd0473 100644 --- a/layout/painting/nsDisplayList.h +++ b/layout/painting/nsDisplayList.h @@ -5383,7 +5383,7 @@ class nsDisplayWrapList : public nsDisplayHitTestInfoBase { : nsDisplayHitTestInfoBase(aBuilder, aOther), mListPtr(&mList), mFrameActiveScrolledRoot(aOther.mFrameActiveScrolledRoot), - mMergedFrames(aOther.mMergedFrames), + mMergedFrames(aOther.mMergedFrames.Clone()), mBounds(aOther.mBounds), mBaseBuildingRect(aOther.mBaseBuildingRect), mOverrideZIndex(aOther.mOverrideZIndex), @@ -5567,7 +5567,7 @@ class nsDisplayWrapList : public nsDisplayHitTestInfoBase { buildingRect.UnionRect(GetBuildingRect(), aOther->GetBuildingRect()); SetBuildingRect(buildingRect); mMergedFrames.AppendElement(aOther->mFrame); - mMergedFrames.AppendElements(aOther->mMergedFrames); + mMergedFrames.AppendElements(aOther->mMergedFrames.Clone()); } RetainedDisplayList mList; @@ -6598,7 +6598,8 @@ class nsDisplayMasksAndClipPaths : public nsDisplayEffectsBase { const ActiveScrolledRoot* aActiveScrolledRoot); nsDisplayMasksAndClipPaths(nsDisplayListBuilder* aBuilder, const nsDisplayMasksAndClipPaths& aOther) - : nsDisplayEffectsBase(aBuilder, aOther), mDestRects(aOther.mDestRects) { + : nsDisplayEffectsBase(aBuilder, aOther), + mDestRects(aOther.mDestRects.Clone()) { MOZ_COUNT_CTOR(nsDisplayMasksAndClipPaths); } diff --git a/layout/painting/nsDisplayListInvalidation.cpp b/layout/painting/nsDisplayListInvalidation.cpp index 02c16e32182c..a7a80519969f 100644 --- a/layout/painting/nsDisplayListInvalidation.cpp +++ b/layout/painting/nsDisplayListInvalidation.cpp @@ -107,7 +107,7 @@ nsDisplayMasksAndClipPathsGeometry::nsDisplayMasksAndClipPathsGeometry( nsDisplayMasksAndClipPaths* aItem, nsDisplayListBuilder* aBuilder) : nsDisplaySVGEffectGeometry(aItem, aBuilder), nsImageGeometryMixin(aItem, aBuilder), - mDestRects(aItem->GetDestRects()) {} + mDestRects(aItem->GetDestRects().Clone()) {} nsDisplayFiltersGeometry::nsDisplayFiltersGeometry( nsDisplayFilters* aItem, nsDisplayListBuilder* aBuilder)