Bug 1450189 - Don't invalidate display items when we get a new style context. r=miko

This commit is contained in:
Matt Woodrow 2018-04-04 16:17:25 +12:00
parent cc659a75b9
commit 199c2a649c
5 changed files with 35 additions and 36 deletions

View File

@ -172,7 +172,7 @@ public:
uint32_t aLineNumber,
uint32_t aIndex)
: nsDisplayItem(aBuilder, aFrame), mRect(aRect),
mStyle(aStyle), mAscent(aAscent), mIndex((aLineNumber << 1) + aIndex) {
mStyle(*aStyle), mAscent(aAscent), mIndex((aLineNumber << 1) + aIndex) {
MOZ_COUNT_CTOR(nsDisplayTextOverflowMarker);
}
#ifdef NS_BUILD_REFCNT_LOGGING
@ -221,7 +221,7 @@ public:
NS_DISPLAY_DECL_NAME("TextOverflow", TYPE_TEXT_OVERFLOW)
private:
nsRect mRect; // in reference frame coordinates
const nsStyleTextOverflowSide* mStyle;
const nsStyleTextOverflowSide mStyle;
nscoord mAscent; // baseline for the marker text in mRect
uint32_t mIndex;
};
@ -274,7 +274,7 @@ nsDisplayTextOverflowMarker::PaintTextToContext(gfxContext* aCtx,
}
pt += aOffsetFromRect;
if (mStyle->mType == NS_STYLE_TEXT_OVERFLOW_ELLIPSIS) {
if (mStyle.mType == NS_STYLE_TEXT_OVERFLOW_ELLIPSIS) {
gfxTextRun* textRun = GetEllipsisTextRun(mFrame);
if (textRun) {
NS_ASSERTION(!textRun->IsRightToLeft(),
@ -286,8 +286,8 @@ nsDisplayTextOverflowMarker::PaintTextToContext(gfxContext* aCtx,
} else {
RefPtr<nsFontMetrics> fm =
nsLayoutUtils::GetInflatedFontMetricsForFrame(mFrame);
nsLayoutUtils::DrawString(mFrame, *fm, aCtx, mStyle->mString.get(),
mStyle->mString.Length(), pt);
nsLayoutUtils::DrawString(mFrame, *fm, aCtx, mStyle.mString.get(),
mStyle.mString.Length(), pt);
}
}

View File

@ -366,14 +366,14 @@ nsDisplayCanvasBackgroundImage::IsSingleFixedPositionImage(nsDisplayListBuilder*
if (!mBackgroundStyle)
return false;
if (mBackgroundStyle->mImage.mLayers.Length() != 1)
if (mBackgroundStyle->StyleBackground()->mImage.mLayers.Length() != 1)
return false;
nsPresContext* presContext = mFrame->PresContext();
uint32_t flags = aBuilder->GetBackgroundPaintFlags();
nsRect borderArea = nsRect(ToReferenceFrame(), mFrame->GetSize());
const nsStyleImageLayers::Layer &layer = mBackgroundStyle->mImage.mLayers[mLayer];
const nsStyleImageLayers::Layer &layer = mBackgroundStyle->StyleBackground()->mImage.mLayers[mLayer];
if (layer.mAttachment != NS_STYLE_IMAGELAYER_ATTACHMENT_FIXED)
return false;
@ -456,11 +456,11 @@ nsCanvasFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// the overflow area, so just add nsDisplayCanvasBackground instead of
// calling DisplayBorderBackgroundOutline.
if (IsVisibleForPainting(aBuilder)) {
const nsStyleBackground* bg = nullptr;
ComputedStyle* bg = nullptr;
nsIFrame* dependentFrame = nullptr;
bool isThemed = IsThemed();
if (!isThemed && nsCSSRendering::FindBackgroundFrame(this, &dependentFrame)) {
bg = dependentFrame->Style()->StyleBackground();
bg = dependentFrame->Style();
if (dependentFrame == this) {
dependentFrame = nullptr;
}
@ -485,7 +485,7 @@ nsCanvasFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
nsDisplayListBuilder::AutoContainerASRTracker contASRTracker(aBuilder);
// Create separate items for each background layer.
const nsStyleImageLayers& layers = bg->mImage;
const nsStyleImageLayers& layers = bg->StyleBackground()->mImage;
NS_FOR_VISIBLE_IMAGE_LAYERS_BACK_TO_FRONT(i, layers) {
if (layers.mLayers[i].mImage.IsEmpty()) {
continue;

View File

@ -1207,7 +1207,6 @@ nsFrame::DidSetComputedStyle(ComputedStyle* aOldComputedStyle)
RemoveStateBits(NS_FRAME_SIMPLE_EVENT_REGIONS |
NS_FRAME_SIMPLE_DISPLAYLIST);
this->MarkNeedsDisplayItemRebuild();
mMayHaveRoundedCorners = true;
}

View File

@ -3459,11 +3459,11 @@ nsDisplayBackgroundImage::GetInitData(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrame,
uint32_t aLayer,
const nsRect& aBackgroundRect,
const nsStyleBackground* aBackgroundStyle)
ComputedStyle* aBackgroundStyle)
{
nsPresContext* presContext = aFrame->PresContext();
uint32_t flags = aBuilder->GetBackgroundPaintFlags();
const nsStyleImageLayers::Layer &layer = aBackgroundStyle->mImage.mLayers[aLayer];
const nsStyleImageLayers::Layer &layer = aBackgroundStyle->StyleBackground()->mImage.mLayers[aLayer];
bool isTransformedFixed;
nsBackgroundLayerState state =
@ -3708,12 +3708,12 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil
nsDisplayBackgroundColor *bgItem;
if (aSecondaryReferenceFrame) {
bgItem =
MakeDisplayItem<nsDisplayTableBackgroundColor>(aBuilder, aSecondaryReferenceFrame, bgColorRect, bg,
MakeDisplayItem<nsDisplayTableBackgroundColor>(aBuilder, aSecondaryReferenceFrame, bgColorRect, bgSC,
drawBackgroundColor ? color : NS_RGBA(0, 0, 0, 0),
aFrame);
} else {
bgItem =
MakeDisplayItem<nsDisplayBackgroundColor>(aBuilder, aFrame, bgColorRect, bg,
MakeDisplayItem<nsDisplayBackgroundColor>(aBuilder, aFrame, bgColorRect, bgSC,
drawBackgroundColor ? color : NS_RGBA(0, 0, 0, 0));
}
bgItem->SetDependentFrame(aBuilder, dependentFrame);
@ -3775,7 +3775,7 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil
nsDisplayList thisItemList;
nsDisplayBackgroundImage::InitData bgData =
nsDisplayBackgroundImage::GetInitData(aBuilder, aFrame, i, bgOriginRect, bg);
nsDisplayBackgroundImage::GetInitData(aBuilder, aFrame, i, bgOriginRect, bgSC);
if (bgData.shouldFixToViewport) {
@ -3926,7 +3926,7 @@ nsDisplayBackgroundImage::CanOptimizeToImageLayer(LayerManager* aManager,
// For 'contain' and 'cover', we allow any pixel of the image to be sampled
// because there isn't going to be any spriting/atlasing going on.
const nsStyleImageLayers::Layer &layer = mBackgroundStyle->mImage.mLayers[mLayer];
const nsStyleImageLayers::Layer &layer = mBackgroundStyle->StyleBackground()->mImage.mLayers[mLayer];
bool allowPartialImages =
(layer.mSize.mWidthType == nsStyleImageLayers::Size::eContain ||
layer.mSize.mWidthType == nsStyleImageLayers::Size::eCover);
@ -3965,7 +3965,7 @@ nsDisplayBackgroundImage::ShouldCreateOwnLayer(nsDisplayListBuilder* aBuilder,
}
if (nsLayoutUtils::AnimatedImageLayersEnabled() && mBackgroundStyle) {
const nsStyleImageLayers::Layer &layer = mBackgroundStyle->mImage.mLayers[mLayer];
const nsStyleImageLayers::Layer &layer = mBackgroundStyle->StyleBackground()->mImage.mLayers[mLayer];
const nsStyleImage* image = &layer.mImage;
if (image->GetType() == eStyleImageType_Image) {
imgIRequest* imgreq = image->GetImageData();
@ -4077,11 +4077,11 @@ nsDisplayBackgroundImage::CanBuildWebRenderDisplayItems(LayerManager* aManager,
mImageFlags = aDisplayListBuilder->GetBackgroundPaintFlags();
}
return mBackgroundStyle->mImage.mLayers[mLayer].mClip != StyleGeometryBox::Text &&
return mBackgroundStyle->StyleBackground()->mImage.mLayers[mLayer].mClip != StyleGeometryBox::Text &&
nsCSSRendering::CanBuildWebRenderDisplayItemsForStyleImageLayer(aManager,
*StyleFrame()->PresContext(),
StyleFrame(),
mBackgroundStyle,
mBackgroundStyle->StyleBackground(),
mLayer,
mImageFlags);
}
@ -4186,7 +4186,7 @@ nsDisplayBackgroundImage::GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
if (mFrame->StyleBorder()->mBoxDecorationBreak ==
StyleBoxDecorationBreak::Clone ||
(!mFrame->GetPrevContinuation() && !mFrame->GetNextContinuation())) {
const nsStyleImageLayers::Layer& layer = mBackgroundStyle->mImage.mLayers[mLayer];
const nsStyleImageLayers::Layer& layer = mBackgroundStyle->StyleBackground()->mImage.mLayers[mLayer];
if (layer.mImage.IsOpaque() && layer.mBlendMode == NS_STYLE_BLEND_NORMAL &&
layer.mRepeat.mXRepeat != StyleImageLayerRepeat::Space &&
layer.mRepeat.mYRepeat != StyleImageLayerRepeat::Space &&
@ -4218,7 +4218,7 @@ nsDisplayBackgroundImage::GetPositioningArea() const
return nsCSSRendering::ComputeImageLayerPositioningArea(
mFrame->PresContext(), mFrame,
mBackgroundRect,
mBackgroundStyle->mImage.mLayers[mLayer],
mBackgroundStyle->StyleBackground()->mImage.mLayers[mLayer],
&attachedToFrame,
&transformedFixed) + ToReferenceFrame();
}
@ -4236,7 +4236,7 @@ nsDisplayBackgroundImage::RenderingMightDependOnPositioningAreaSizeChange() cons
return true;
}
const nsStyleImageLayers::Layer &layer = mBackgroundStyle->mImage.mLayers[mLayer];
const nsStyleImageLayers::Layer &layer = mBackgroundStyle->StyleBackground()->mImage.mLayers[mLayer];
if (layer.RenderingMightDependOnPositioningAreaSizeChange()) {
return true;
}
@ -4254,7 +4254,7 @@ nsDisplayBackgroundImage::PaintInternal(nsDisplayListBuilder* aBuilder,
gfxContext* aCtx, const nsRect& aBounds,
nsRect* aClipRect) {
gfxContext* ctx = aCtx;
StyleGeometryBox clip = mBackgroundStyle->mImage.mLayers[mLayer].mClip;
StyleGeometryBox clip = mBackgroundStyle->StyleBackground()->mImage.mLayers[mLayer].mClip;
if (clip == StyleGeometryBox::Text) {
if (!GenerateAndPushTextMask(StyleFrame(), aCtx, mBackgroundRect, aBuilder)) {
@ -4306,7 +4306,7 @@ nsDisplayBackgroundImage::ComputeInvalidationRegion(nsDisplayListBuilder* aBuild
return;
}
if (aBuilder->ShouldSyncDecodeImages()) {
const nsStyleImage& image = mBackgroundStyle->mImage.mLayers[mLayer].mImage;
const nsStyleImage& image = mBackgroundStyle->StyleBackground()->mImage.mLayers[mLayer].mImage;
if (image.GetType() == eStyleImageType_Image &&
geometry->ShouldInvalidateToSyncDecodeImages()) {
aInvalidRegion->Or(*aInvalidRegion, bounds);
@ -4346,7 +4346,7 @@ nsDisplayBackgroundImage::GetBoundsInternal(nsDisplayListBuilder* aBuilder,
nsCanvasFrame* canvasFrame = static_cast<nsCanvasFrame*>(frame);
clipRect = canvasFrame->CanvasArea() + ToReferenceFrame();
}
const nsStyleImageLayers::Layer& layer = mBackgroundStyle->mImage.mLayers[mLayer];
const nsStyleImageLayers::Layer& layer = mBackgroundStyle->StyleBackground()->mImage.mLayers[mLayer];
return nsCSSRendering::GetBackgroundLayerRect(presContext, frame,
mBackgroundRect, clipRect, layer,
aBuilder->GetBackgroundPaintFlags());
@ -4690,7 +4690,7 @@ nsDisplayBackgroundColor::GetLayerState(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
const ContainerLayerParameters& aParameters)
{
StyleGeometryBox clip = mBackgroundStyle->mImage.mLayers[0].mClip;
StyleGeometryBox clip = mBackgroundStyle->StyleBackground()->mImage.mLayers[0].mClip;
if (ForceActiveLayers() && clip != StyleGeometryBox::Text) {
return LAYER_ACTIVE;
}
@ -4734,7 +4734,7 @@ nsDisplayBackgroundColor::CreateWebRenderCommands(mozilla::wr::DisplayListBuilde
return true;
}
StyleGeometryBox clip = mBackgroundStyle->mImage.mLayers[0].mClip;
StyleGeometryBox clip = mBackgroundStyle->StyleBackground()->mImage.mLayers[0].mClip;
if (clip == StyleGeometryBox::Text) {
return false;
}
@ -4783,7 +4783,7 @@ nsDisplayBackgroundColor::Paint(nsDisplayListBuilder* aBuilder,
nsLayoutUtils::RectToGfxRect(mBackgroundRect,
mFrame->PresContext()->AppUnitsPerDevPixel());
StyleGeometryBox clip = mBackgroundStyle->mImage.mLayers[0].mClip;
StyleGeometryBox clip = mBackgroundStyle->StyleBackground()->mImage.mLayers[0].mClip;
if (clip == StyleGeometryBox::Text) {
if (!GenerateAndPushTextMask(mFrame, aCtx, mBackgroundRect, aBuilder)) {
return;
@ -4817,7 +4817,7 @@ nsDisplayBackgroundColor::GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
return nsRegion();
const nsStyleImageLayers::Layer& bottomLayer = mBackgroundStyle->BottomLayer();
const nsStyleImageLayers::Layer& bottomLayer = mBackgroundStyle->StyleBackground()->BottomLayer();
if (bottomLayer.mClip == StyleGeometryBox::Text) {
return nsRegion();
}

View File

@ -3840,7 +3840,7 @@ public:
struct InitData {
nsDisplayListBuilder* builder;
nsIFrame* frame;
const nsStyleBackground* backgroundStyle;
mozilla::ComputedStyle* backgroundStyle;
nsCOMPtr<imgIContainer> image;
nsRect backgroundRect;
nsRect fillArea;
@ -3861,7 +3861,7 @@ public:
nsIFrame* aFrame,
uint32_t aLayer,
const nsRect& aBackgroundRect,
const nsStyleBackground* aBackgroundStyle);
mozilla::ComputedStyle* aBackgroundStyle);
explicit nsDisplayBackgroundImage(nsDisplayListBuilder* aBuilder,
const InitData& aInitData,
@ -4007,7 +4007,7 @@ protected:
// Cache the result of nsCSSRendering::FindBackground. Always null if
// mIsThemed is true or if FindBackground returned false.
const nsStyleBackground* mBackgroundStyle;
RefPtr<mozilla::ComputedStyle> mBackgroundStyle;
nsCOMPtr<imgIContainer> mImage;
nsIFrame* mDependentFrame;
nsRect mBackgroundRect; // relative to the reference frame
@ -4179,7 +4179,7 @@ class nsDisplayBackgroundColor : public nsDisplayItem
public:
nsDisplayBackgroundColor(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
const nsRect& aBackgroundRect,
const nsStyleBackground* aBackgroundStyle,
mozilla::ComputedStyle* aBackgroundStyle,
nscolor aColor)
: nsDisplayItem(aBuilder, aFrame)
, mBackgroundRect(aBackgroundRect)
@ -4279,7 +4279,7 @@ public:
protected:
const nsRect mBackgroundRect;
const nsStyleBackground* mBackgroundStyle;
RefPtr<mozilla::ComputedStyle> mBackgroundStyle;
nsIFrame* mDependentFrame;
mozilla::gfx::Color mColor;
@ -4293,7 +4293,7 @@ class nsDisplayTableBackgroundColor : public nsDisplayBackgroundColor
public:
nsDisplayTableBackgroundColor(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
const nsRect& aBackgroundRect,
const nsStyleBackground* aBackgroundStyle,
mozilla::ComputedStyle* aBackgroundStyle,
nscolor aColor,
nsIFrame* aAncestorFrame)
: nsDisplayBackgroundColor(aBuilder, aFrame, aBackgroundRect, aBackgroundStyle, aColor)