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

View File

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

View File

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

View File

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

View File

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