From 793da7dd6238ce156e29c71304e24b2c05edc11d Mon Sep 17 00:00:00 2001 From: wolfbeast Date: Wed, 26 Feb 2020 20:51:22 +0100 Subject: Revert "Issue #1355 - Better way to create display items for column backgrounds" This reverts commit 44c47c50388f526c2d134e16d5debebe94a0faf8. --- layout/base/nsDisplayList.cpp | 120 +++------ layout/base/nsDisplayList.h | 95 ++----- layout/base/nsLayoutUtils.cpp | 15 +- layout/base/nsPresShell.cpp | 5 +- layout/forms/nsButtonFrameRenderer.cpp | 4 +- layout/forms/nsComboboxControlFrame.cpp | 13 +- layout/forms/nsComboboxControlFrame.h | 1 + layout/forms/nsFieldSetFrame.cpp | 15 +- layout/forms/nsFieldSetFrame.h | 1 + layout/forms/nsFileControlFrame.cpp | 3 +- layout/forms/nsFileControlFrame.h | 1 + layout/forms/nsFormControlFrame.h | 1 + layout/forms/nsGfxCheckboxControlFrame.cpp | 3 +- layout/forms/nsGfxCheckboxControlFrame.h | 1 + layout/forms/nsGfxRadioControlFrame.cpp | 3 +- layout/forms/nsGfxRadioControlFrame.h | 1 + layout/forms/nsHTMLButtonControlFrame.cpp | 5 +- layout/forms/nsHTMLButtonControlFrame.h | 1 + layout/forms/nsListControlFrame.cpp | 3 +- layout/forms/nsListControlFrame.h | 1 + layout/forms/nsProgressFrame.cpp | 3 +- layout/forms/nsProgressFrame.h | 1 + layout/forms/nsRangeFrame.cpp | 5 +- layout/forms/nsRangeFrame.h | 1 + layout/forms/nsSelectsAreaFrame.cpp | 10 +- layout/forms/nsSelectsAreaFrame.h | 2 + layout/forms/nsTextControlFrame.cpp | 3 +- layout/forms/nsTextControlFrame.h | 1 + layout/generic/nsBackdropFrame.cpp | 1 + layout/generic/nsBackdropFrame.h | 1 + layout/generic/nsBlockFrame.cpp | 36 +-- layout/generic/nsBlockFrame.h | 1 + layout/generic/nsBulletFrame.cpp | 1 + layout/generic/nsBulletFrame.h | 1 + layout/generic/nsCanvasFrame.cpp | 7 +- layout/generic/nsCanvasFrame.h | 1 + layout/generic/nsColumnSetFrame.cpp | 3 +- layout/generic/nsColumnSetFrame.h | 1 + layout/generic/nsContainerFrame.cpp | 9 +- layout/generic/nsContainerFrame.h | 7 +- layout/generic/nsFirstLetterFrame.cpp | 3 +- layout/generic/nsFirstLetterFrame.h | 1 + layout/generic/nsFlexContainerFrame.cpp | 3 +- layout/generic/nsFlexContainerFrame.h | 1 + layout/generic/nsFrame.cpp | 220 ++++++---------- layout/generic/nsFrameSetFrame.cpp | 7 +- layout/generic/nsFrameSetFrame.h | 1 + layout/generic/nsGfxScrollFrame.cpp | 87 +++--- layout/generic/nsGfxScrollFrame.h | 15 +- layout/generic/nsGridContainerFrame.cpp | 6 +- layout/generic/nsGridContainerFrame.h | 1 + layout/generic/nsHTMLCanvasFrame.cpp | 1 + layout/generic/nsHTMLCanvasFrame.h | 1 + layout/generic/nsIFrame.h | 25 +- layout/generic/nsIScrollableFrame.h | 5 +- layout/generic/nsImageFrame.cpp | 1 + layout/generic/nsImageFrame.h | 1 + layout/generic/nsInlineFrame.cpp | 3 +- layout/generic/nsInlineFrame.h | 1 + layout/generic/nsLeafFrame.h | 1 + layout/generic/nsPageFrame.cpp | 26 +- layout/generic/nsPageFrame.h | 1 + layout/generic/nsPlaceholderFrame.cpp | 1 + layout/generic/nsPlaceholderFrame.h | 1 + layout/generic/nsPluginFrame.cpp | 1 + layout/generic/nsPluginFrame.h | 1 + layout/generic/nsRubyTextFrame.cpp | 3 +- layout/generic/nsRubyTextFrame.h | 1 + layout/generic/nsSimplePageSequenceFrame.cpp | 15 +- layout/generic/nsSimplePageSequenceFrame.h | 1 + layout/generic/nsSubDocumentFrame.cpp | 39 ++- layout/generic/nsSubDocumentFrame.h | 1 + layout/generic/nsTextFrame.cpp | 1 + layout/generic/nsTextFrame.h | 1 + layout/generic/nsVideoFrame.cpp | 19 +- layout/generic/nsVideoFrame.h | 1 + layout/generic/nsViewportFrame.cpp | 11 +- layout/generic/nsViewportFrame.h | 1 + layout/ipc/RenderFrameParent.cpp | 1 + layout/ipc/RenderFrameParent.h | 1 + layout/mathml/nsMathMLChar.cpp | 3 +- layout/mathml/nsMathMLContainerFrame.cpp | 4 +- layout/mathml/nsMathMLContainerFrame.h | 1 + layout/mathml/nsMathMLSelectedFrame.cpp | 5 +- layout/mathml/nsMathMLSelectedFrame.h | 1 + layout/mathml/nsMathMLmencloseFrame.cpp | 3 +- layout/mathml/nsMathMLmencloseFrame.h | 1 + layout/mathml/nsMathMLmfencedFrame.cpp | 3 +- layout/mathml/nsMathMLmfencedFrame.h | 1 + layout/mathml/nsMathMLmfracFrame.cpp | 3 +- layout/mathml/nsMathMLmfracFrame.h | 1 + layout/mathml/nsMathMLmoFrame.cpp | 3 +- layout/mathml/nsMathMLmoFrame.h | 1 + layout/mathml/nsMathMLmrootFrame.cpp | 3 +- layout/mathml/nsMathMLmrootFrame.h | 1 + .../reftests/position-relative/1409114-1-ref.html | 12 - layout/reftests/position-relative/1409114-1.html | 11 - layout/reftests/position-relative/1409114-2.html | 13 - layout/reftests/position-relative/1409114-3.html | 13 - layout/reftests/position-relative/reftest.list | 3 - ...er-collapse-opacity-table-column-group-ref.html | 6 +- .../border-collapse-opacity-table-column-ref.html | 6 +- ...er-separate-opacity-table-column-group-ref.html | 6 +- .../border-separate-opacity-table-column-ref.html | 6 +- layout/reftests/table-background/reftest.list | 37 ++- .../table-col-overlapping-ref.html | 28 -- .../table-background/table-col-overlapping.html | 28 -- .../table-background/table-col-span-1-ref.html | 15 -- .../table-background/table-col-span-1.html | 15 -- layout/svg/SVGFEUnstyledLeafFrame.cpp | 1 + layout/svg/SVGTextFrame.cpp | 1 + layout/svg/SVGTextFrame.h | 1 + layout/svg/nsSVGClipPathFrame.h | 1 + layout/svg/nsSVGContainerFrame.cpp | 3 +- layout/svg/nsSVGContainerFrame.h | 2 + layout/svg/nsSVGFilterFrame.h | 1 + layout/svg/nsSVGForeignObjectFrame.cpp | 3 +- layout/svg/nsSVGForeignObjectFrame.h | 1 + layout/svg/nsSVGMarkerFrame.h | 1 + layout/svg/nsSVGMaskFrame.h | 1 + layout/svg/nsSVGOuterSVGFrame.cpp | 3 +- layout/svg/nsSVGOuterSVGFrame.h | 1 + layout/svg/nsSVGPaintServerFrame.h | 1 + layout/svg/nsSVGPathGeometryFrame.cpp | 1 + layout/svg/nsSVGPathGeometryFrame.h | 1 + layout/svg/nsSVGStopFrame.cpp | 1 + layout/svg/nsSVGSwitchFrame.cpp | 4 +- layout/tables/nsTableCellFrame.cpp | 54 +--- layout/tables/nsTableCellFrame.h | 1 + layout/tables/nsTableColFrame.cpp | 9 +- layout/tables/nsTableColFrame.h | 1 + layout/tables/nsTableColGroupFrame.cpp | 9 +- layout/tables/nsTableColGroupFrame.h | 1 + layout/tables/nsTableFrame.cpp | 293 ++++++++++++++------- layout/tables/nsTableFrame.h | 130 ++++----- layout/tables/nsTableRowFrame.cpp | 58 +--- layout/tables/nsTableRowFrame.h | 6 +- layout/tables/nsTableRowGroupFrame.cpp | 52 +--- layout/tables/nsTableRowGroupFrame.h | 1 + layout/tables/nsTableWrapperFrame.cpp | 13 +- layout/tables/nsTableWrapperFrame.h | 2 + layout/xul/nsBoxFrame.cpp | 8 +- layout/xul/nsBoxFrame.h | 2 + layout/xul/nsButtonBoxFrame.cpp | 3 +- layout/xul/nsButtonBoxFrame.h | 1 + layout/xul/nsDeckFrame.cpp | 6 +- layout/xul/nsDeckFrame.h | 2 + layout/xul/nsGroupBoxFrame.cpp | 7 +- layout/xul/nsImageBoxFrame.cpp | 3 +- layout/xul/nsImageBoxFrame.h | 1 + layout/xul/nsLeafBoxFrame.cpp | 1 + layout/xul/nsLeafBoxFrame.h | 1 + layout/xul/nsListItemFrame.cpp | 3 +- layout/xul/nsListItemFrame.h | 1 + layout/xul/nsMenuFrame.cpp | 7 +- layout/xul/nsMenuFrame.h | 1 + layout/xul/nsRootBoxFrame.cpp | 7 +- layout/xul/nsSliderFrame.cpp | 10 +- layout/xul/nsSliderFrame.h | 2 + layout/xul/nsSplitterFrame.cpp | 3 +- layout/xul/nsSplitterFrame.h | 1 + layout/xul/nsStackFrame.cpp | 4 +- layout/xul/nsStackFrame.h | 1 + layout/xul/nsTextBoxFrame.cpp | 3 +- layout/xul/nsTextBoxFrame.h | 1 + layout/xul/nsTitleBarFrame.cpp | 3 +- layout/xul/nsTitleBarFrame.h | 1 + layout/xul/tree/nsTreeBodyFrame.cpp | 3 +- layout/xul/tree/nsTreeBodyFrame.h | 1 + layout/xul/tree/nsTreeColFrame.cpp | 7 +- layout/xul/tree/nsTreeColFrame.h | 1 + 171 files changed, 830 insertions(+), 1054 deletions(-) delete mode 100644 layout/reftests/position-relative/1409114-1-ref.html delete mode 100644 layout/reftests/position-relative/1409114-1.html delete mode 100644 layout/reftests/position-relative/1409114-2.html delete mode 100644 layout/reftests/position-relative/1409114-3.html delete mode 100644 layout/reftests/table-background/table-col-overlapping-ref.html delete mode 100644 layout/reftests/table-background/table-col-overlapping.html delete mode 100644 layout/reftests/table-background/table-col-span-1-ref.html delete mode 100644 layout/reftests/table-background/table-col-span-1.html (limited to 'layout') diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp index f870c6d97..8a34d108f 100644 --- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -721,6 +721,7 @@ nsDisplayListBuilder::nsDisplayListBuilder(nsIFrame* aReferenceFrame, : mReferenceFrame(aReferenceFrame), mIgnoreScrollFrame(nullptr), mLayerEventRegions(nullptr), + mCurrentTableItem(nullptr), mCurrentFrame(aReferenceFrame), mCurrentReferenceFrame(aReferenceFrame), mCurrentAGR(&mRootAGR), @@ -730,7 +731,6 @@ nsDisplayListBuilder::nsDisplayListBuilder(nsIFrame* aReferenceFrame, mGlassDisplayItem(nullptr), mScrollInfoItemsForHoisting(nullptr), mMode(aMode), - mTableBackgroundSet(nullptr), mCurrentScrollParentId(FrameMetrics::NULL_SCROLL_ID), mCurrentScrollbarTarget(FrameMetrics::NULL_SCROLL_ID), mCurrentScrollbarFlags(0), @@ -783,10 +783,7 @@ nsDisplayListBuilder::nsDisplayListBuilder(nsIFrame* aReferenceFrame, "Check nsDisplayItem::TYPE_MAX should not overflow"); } -void -nsDisplayListBuilder::MarkFrameForDisplay(nsIFrame* aFrame, nsIFrame* aStopAtFrame) -{ - mFramesMarkedForDisplay.AppendElement(aFrame); +static void MarkFrameForDisplay(nsIFrame* aFrame, nsIFrame* aStopAtFrame) { for (nsIFrame* f = aFrame; f; f = nsLayoutUtils::GetParentOrPlaceholderFor(f)) { if (f->GetStateBits() & NS_FRAME_FORCE_DISPLAY_LIST_DESCEND_INTO) @@ -799,22 +796,6 @@ nsDisplayListBuilder::MarkFrameForDisplay(nsIFrame* aFrame, nsIFrame* aStopAtFra } } -void -nsDisplayListBuilder::MarkFrameForDisplayIfVisible(nsIFrame* aFrame, nsIFrame* aStopAtFrame) -{ - mFramesMarkedForDisplay.AppendElement(aFrame); - for (nsIFrame* f = aFrame; f; - f = nsLayoutUtils::GetParentOrPlaceholderFor(f)) { - if (f->ForceDescendIntoIfVisible()) - return; - f->SetForceDescendIntoIfVisible(true); - if (f == aStopAtFrame) { - // we've reached a frame that we know will be painted, so we can stop. - break; - } - } -} - bool nsDisplayListBuilder::NeedToForceTransparentSurfaceForItem(nsDisplayItem* aItem) { return aItem == mGlassDisplayItem || aItem->ClearsBackground(); @@ -883,10 +864,10 @@ nsDisplayListBuilder::FindAnimatedGeometryRootFor(nsDisplayItem* aItem) void nsDisplayListBuilder::MarkOutOfFlowFrameForDisplay(nsIFrame* aDirtyFrame, - nsIFrame* aFrame) + nsIFrame* aFrame, + const nsRect& aDirtyRect) { - nsRect visible = GetVisibleRect(); - nsRect dirtyRectRelativeToDirtyFrame = GetDirtyRect(); + nsRect dirtyRectRelativeToDirtyFrame = aDirtyRect; if (nsLayoutUtils::IsFixedPosFrameInDisplayPort(aFrame) && IsPaintingToWindow()) { NS_ASSERTION(aDirtyFrame == aFrame->GetParent(), "Dirty frame should be viewport frame"); @@ -900,14 +881,8 @@ void nsDisplayListBuilder::MarkOutOfFlowFrameForDisplay(nsIFrame* aDirtyFrame, } else { dirtyRectRelativeToDirtyFrame.SizeTo(aDirtyFrame->GetSize()); } - // TODO: We probably don't want visible and dirty to be the same here, figure - // out what to do. - visible = dirtyRectRelativeToDirtyFrame; } - - nsPoint offset = aFrame->GetOffsetTo(aDirtyFrame); - visible -= offset; - nsRect dirty = dirtyRectRelativeToDirtyFrame - offset; + nsRect dirty = dirtyRectRelativeToDirtyFrame - aFrame->GetOffsetTo(aDirtyFrame); nsRect overflowRect = aFrame->GetVisualOverflowRect(); if (aFrame->IsTransformed() && @@ -920,18 +895,15 @@ void nsDisplayListBuilder::MarkOutOfFlowFrameForDisplay(nsIFrame* aDirtyFrame, */ overflowRect.Inflate(nsPresContext::CSSPixelsToAppUnits(32)); } - visible.IntersectRect(visible, overflowRect); - dirty.IntersectRect(dirty, overflowRect); - if (!(aFrame->GetStateBits() & NS_FRAME_FORCE_DISPLAY_LIST_DESCEND_INTO) && - dirty.IsEmpty() && - (!aFrame->ForceDescendIntoIfVisible() || - visible.IsEmpty())) { + + if (!dirty.IntersectRect(dirty, overflowRect) && + !(aFrame->GetStateBits() & NS_FRAME_FORCE_DISPLAY_LIST_DESCEND_INTO)) { return; } const DisplayItemClip* oldClip = mClipState.GetClipForContainingBlockDescendants(); const DisplayItemScrollClip* sc = mClipState.GetCurrentInnermostScrollClip(); - OutOfFlowDisplayData* data = new OutOfFlowDisplayData(oldClip, sc, visible, dirty); + OutOfFlowDisplayData* data = new OutOfFlowDisplayData(oldClip, sc, dirty); aFrame->SetProperty(nsDisplayListBuilder::OutOfFlowDisplayDataProperty(), data); MarkFrameForDisplay(aFrame, aDirtyFrame); @@ -942,11 +914,9 @@ static void UnmarkFrameForDisplay(nsIFrame* aFrame) { for (nsIFrame* f = aFrame; f; f = nsLayoutUtils::GetParentOrPlaceholderFor(f)) { - if (!(f->GetStateBits() & NS_FRAME_FORCE_DISPLAY_LIST_DESCEND_INTO) && - !f->ForceDescendIntoIfVisible()) + if (!(f->GetStateBits() & NS_FRAME_FORCE_DISPLAY_LIST_DESCEND_INTO)) return; f->RemoveStateBits(NS_FRAME_FORCE_DISPLAY_LIST_DESCEND_INTO); - f->SetForceDescendIntoIfVisible(false); } } @@ -955,6 +925,7 @@ nsDisplayListBuilder::~nsDisplayListBuilder() { "All frames should have been unmarked"); NS_ASSERTION(mPresShellStates.Length() == 0, "All presshells should have been exited"); + NS_ASSERTION(!mCurrentTableItem, "No table item should be active"); nsCSSRendering::EndFrameTreesLocked(); @@ -1037,27 +1008,22 @@ nsDisplayListBuilder::EnterPresShell(nsIFrame* aReferenceFrame, } state->mInsidePointerEventsNoneDoc = pointerEventsNone; - state->mPresShellIgnoreScrollFrame = - state->mPresShell->IgnoringViewportScrolling() - ? state->mPresShell->GetRootScrollFrame() - : nullptr; - - nsPresContext* pc = aReferenceFrame->PresContext(); - nsCOMPtr docShell = pc->GetDocShell(); - if (docShell) { - docShell->GetWindowDraggingAllowed(&mWindowDraggingAllowed); - } - - mIsInChromePresContext = pc->IsChrome(); - if (!buildCaret) return; RefPtr caret = state->mPresShell->GetCaret(); state->mCaretFrame = caret->GetPaintGeometry(&state->mCaretRect); if (state->mCaretFrame) { + mFramesMarkedForDisplay.AppendElement(state->mCaretFrame); MarkFrameForDisplay(state->mCaretFrame, nullptr); } + + nsPresContext* pc = aReferenceFrame->PresContext(); + nsCOMPtr docShell = pc->GetDocShell(); + if (docShell) { + docShell->GetWindowDraggingAllowed(&mWindowDraggingAllowed); + } + mIsInChromePresContext = pc->IsChrome(); } // A non-blank paint is a paint that does not just contain the canvas background. @@ -1128,7 +1094,8 @@ nsDisplayListBuilder::ResetMarkedFramesForDisplayList() void nsDisplayListBuilder::MarkFramesForDisplayList(nsIFrame* aDirtyFrame, - const nsFrameList& aFrames) { + const nsFrameList& aFrames, + const nsRect& aDirtyRect) { for (nsIFrame* e : aFrames) { // Skip the AccessibleCaret frame when building no caret. if (!IsBuildingCaret()) { @@ -1141,7 +1108,8 @@ nsDisplayListBuilder::MarkFramesForDisplayList(nsIFrame* aDirtyFrame, } } - MarkOutOfFlowFrameForDisplay(aDirtyFrame, e); + mFramesMarkedForDisplay.AppendElement(e); + MarkOutOfFlowFrameForDisplay(aDirtyFrame, e, aDirtyRect); } } @@ -1164,6 +1132,7 @@ nsDisplayListBuilder::MarkPreserve3DFramesForDisplayList(nsIFrame* aDirtyFrame) for (; !childFrames.AtEnd(); childFrames.Next()) { nsIFrame *child = childFrames.get(); if (child->Combines3DTransformWithAncestors()) { + mFramesMarkedForDisplay.AppendElement(child); MarkFrameForDisplay(child, aDirtyFrame); } } @@ -2349,11 +2318,11 @@ nsDisplayItem::nsDisplayItem(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, mAnimatedGeometryRoot = aBuilder->FindAnimatedGeometryRootFor(aFrame); MOZ_ASSERT(nsLayoutUtils::IsAncestorFrameCrossDoc(aBuilder->RootReferenceFrame(), *mAnimatedGeometryRoot), "Bad"); - NS_ASSERTION(aBuilder->GetVisibleRect().width >= 0 || - !aBuilder->IsForPainting(), "visible rect not set"); - // The visible rect is for mCurrentFrame, so we have to use + NS_ASSERTION(aBuilder->GetDirtyRect().width >= 0 || + !aBuilder->IsForPainting(), "dirty rect not set"); + // The dirty rect is for mCurrentFrame, so we have to use // mCurrentOffsetToReferenceFrame - mVisibleRect = aBuilder->GetVisibleRect() + + mVisibleRect = aBuilder->GetDirtyRect() + aBuilder->GetCurrentFrameOffsetToReferenceFrame(); } @@ -2604,7 +2573,8 @@ static nsStyleContext* GetBackgroundStyleContext(nsIFrame* aFrame) /* static */ void SetBackgroundClipRegion(DisplayListClipState::AutoSaveRestore& aClipState, - nsIFrame* aFrame, const nsStyleImageLayers::Layer& aLayer, + nsIFrame* aFrame, const nsPoint& aToReferenceFrame, + const nsStyleImageLayers::Layer& aLayer, const nsRect& aBackgroundRect, bool aWillPaintBorder) { @@ -2656,6 +2626,7 @@ SpecialCutoutRegionCase(nsDisplayListBuilder* aBuilder, return true; } + /*static*/ bool nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, @@ -2664,16 +2635,14 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil bool aAllowWillPaintBorderOptimization, nsStyleContext* aStyleContext, const nsRect& aBackgroundOriginRect, - nsIFrame* aSecondaryReferenceFrame, - Maybe* - aAutoBuildingDisplayList) + nsIFrame* aSecondaryReferenceFrame) { nsStyleContext* bgSC = aStyleContext; const nsStyleBackground* bg = nullptr; - nsRect bgRect = aBackgroundRect; + nsRect bgRect = aBackgroundRect + aBuilder->ToReferenceFrame(aFrame); nsRect bgOriginRect = bgRect; if (!aBackgroundOriginRect.IsEmpty()) { - bgOriginRect = aBackgroundOriginRect; + bgOriginRect = aBackgroundOriginRect + aBuilder->ToReferenceFrame(aFrame); } nsPresContext* presContext = aFrame->PresContext(); bool isThemed = aFrame->IsThemed(); @@ -2709,6 +2678,8 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil !isThemed && !hasInsetShadow && borderStyle->HasBorder(); + nsPoint toRef = aBuilder->ToReferenceFrame(aFrame); + // An auxiliary list is necessary in case we have background blending; if that // is the case, background items need to be wrapped by a blend container to // isolate blending to the background @@ -2717,9 +2688,6 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil // to create an item for hit testing. if ((drawBackgroundColor && color != NS_RGBA(0,0,0,0)) || aBuilder->IsForEventDelivery()) { - if (aAutoBuildingDisplayList && !*aAutoBuildingDisplayList) { - aAutoBuildingDisplayList->emplace(aBuilder, aFrame); - } DisplayListClipState::AutoSaveRestore clipState(aBuilder); if (bg && !aBuilder->IsForEventDelivery()) { // Disable the will-paint-border optimization for background @@ -2731,7 +2699,7 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil // artifacts along the rounded corners. bool useWillPaintBorderOptimization = willPaintBorder && nsLayoutUtils::HasNonZeroCorner(borderStyle->mBorderRadius); - SetBackgroundClipRegion(clipState, aFrame, + SetBackgroundClipRegion(clipState, aFrame, toRef, bg->BottomLayer(), bgRect, useWillPaintBorderOptimization); } @@ -2784,10 +2752,6 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil continue; } - if (aAutoBuildingDisplayList && !*aAutoBuildingDisplayList) { - aAutoBuildingDisplayList->emplace(aBuilder, aFrame); - } - if (bg->mImage.mLayers[i].mBlendMode != NS_STYLE_BLEND_NORMAL) { needBlendContainer = true; } @@ -2795,8 +2759,8 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil DisplayListClipState::AutoSaveRestore clipState(aBuilder); if (!aBuilder->IsForEventDelivery()) { const nsStyleImageLayers::Layer& layer = bg->mImage.mLayers[i]; - SetBackgroundClipRegion(clipState, aFrame, layer, bgRect, - willPaintBorder); + SetBackgroundClipRegion(clipState, aFrame, toRef, + layer, bgRect, willPaintBorder); } nsDisplayList thisItemList; @@ -4378,7 +4342,7 @@ nsDisplayWrapList::nsDisplayWrapList(nsDisplayListBuilder* aBuilder, mReferenceFrame = i->ReferenceFrame(); mToReferenceFrame = i->ToReferenceFrame(); } - mVisibleRect = aBuilder->GetVisibleRect() + + mVisibleRect = aBuilder->GetDirtyRect() + aBuilder->GetCurrentFrameOffsetToReferenceFrame(); } @@ -4404,7 +4368,7 @@ nsDisplayWrapList::nsDisplayWrapList(nsDisplayListBuilder* aBuilder, mReferenceFrame = aItem->ReferenceFrame(); mToReferenceFrame = aItem->ToReferenceFrame(); } - mVisibleRect = aBuilder->GetVisibleRect() + + mVisibleRect = aBuilder->GetDirtyRect() + aBuilder->GetCurrentFrameOffsetToReferenceFrame(); } diff --git a/layout/base/nsDisplayList.h b/layout/base/nsDisplayList.h index 9ae76e2ac..9cee7b517 100644 --- a/layout/base/nsDisplayList.h +++ b/layout/base/nsDisplayList.h @@ -48,7 +48,6 @@ class nsISelection; class nsIScrollableFrame; class nsDisplayLayerEventRegions; class nsDisplayScrollInfoLayer; -class nsDisplayTableBackgroundSet; class nsCaret; namespace mozilla { @@ -203,7 +202,6 @@ class nsDisplayListBuilder { : mAccumulatedTransform() , mAccumulatedRect() , mAccumulatedRectLevels(0) - , mVisibleRect(aOther.mVisibleRect) , mDirtyRect(aOther.mDirtyRect) {} // Accmulate transforms of ancestors on the preserves-3d chain. @@ -212,7 +210,6 @@ class nsDisplayListBuilder { nsRect mAccumulatedRect; // How far this frame is from the root of the current 3d context. int mAccumulatedRectLevels; - nsRect mVisibleRect; nsRect mDirtyRect; }; @@ -446,14 +443,7 @@ public: * Get dirty rect relative to current frame (the frame that we're calling * BuildDisplayList on right now). */ - const nsRect& GetVisibleRect() { return mVisibleRect; } const nsRect& GetDirtyRect() { return mDirtyRect; } - - void SetVisibleRect(const nsRect& aVisibleRect) { mVisibleRect = aVisibleRect; } - void IntersectVisibleRect(const nsRect& aVisibleRect) { mVisibleRect.IntersectRect(mVisibleRect, aVisibleRect); } - void SetDirtyRect(const nsRect& aDirtyRect) { mDirtyRect = aDirtyRect; } - void IntersectDirtyRect(const nsRect& aDirtyRect) { mDirtyRect.IntersectRect(mDirtyRect, aDirtyRect); } - const nsIFrame* GetCurrentFrame() { return mCurrentFrame; } const nsIFrame* GetCurrentReferenceFrame() { return mCurrentReferenceFrame; } const nsPoint& GetCurrentFrameOffsetToReferenceFrame() { return mCurrentOffsetToReferenceFrame; } @@ -503,10 +493,11 @@ public: /** * Display the caret if needed. */ - void DisplayCaret(nsIFrame* aFrame, nsDisplayList* aList) { + void DisplayCaret(nsIFrame* aFrame, const nsRect& aDirtyRect, + nsDisplayList* aList) { nsIFrame* frame = GetCaretFrame(); if (aFrame == frame) { - frame->DisplayCaret(this, aList); + frame->DisplayCaret(this, aDirtyRect, aList); } } /** @@ -526,15 +517,6 @@ public: * Get the caret associated with the current presshell. */ nsCaret* GetCaret(); - - /** - * Returns the root scroll frame for the current PresShell, if the PresShell - * is ignoring viewport scrolling. - */ - nsIFrame* GetPresShellIgnoreScrollFrame() { - return CurrentPresShellState()->mPresShellIgnoreScrollFrame; - } - /** * Notify the display list builder that we're entering a presshell. * aReferenceFrame should be a frame in the new presshell. @@ -595,16 +577,6 @@ public: mSyncDecodeImages = aSyncDecodeImages; } - nsDisplayTableBackgroundSet* SetTableBackgroundSet( - nsDisplayTableBackgroundSet* aTableSet) { - nsDisplayTableBackgroundSet* old = mTableBackgroundSet; - mTableBackgroundSet = aTableSet; - return old; - } - nsDisplayTableBackgroundSet* GetTableBackgroundSet() const { - return mTableBackgroundSet; - } - /** * Helper method to generate background painting flags based on the * information available in the display list builder. Currently only @@ -630,9 +602,8 @@ public: * destroyed. */ void MarkFramesForDisplayList(nsIFrame* aDirtyFrame, - const nsFrameList& aFrames); - void MarkFrameForDisplay(nsIFrame* aFrame, nsIFrame* aStopAtFrame = nullptr); - void MarkFrameForDisplayIfVisible(nsIFrame* aFrame, nsIFrame* aStopAtFrame = nullptr); + const nsFrameList& aFrames, + const nsRect& aDirtyRect); /** * Mark all child frames that Preserve3D() as needing display. * Because these frames include transforms set on their parent, dirty rects @@ -647,10 +618,9 @@ public: * the display list, even though it doesn't intersect the dirty * rect, because it may have out-of-flows that do so. */ - bool ShouldDescendIntoFrame(nsIFrame* aFrame, bool aVisible) const { + bool ShouldDescendIntoFrame(nsIFrame* aFrame) const { return (aFrame->GetStateBits() & NS_FRAME_FORCE_DISPLAY_LIST_DESCEND_INTO) || - (aVisible && aFrame->ForceDescendIntoIfVisible()) || GetIncludeAllOutOfFlows(); } @@ -730,20 +700,14 @@ public: friend class AutoBuildingDisplayList; class AutoBuildingDisplayList { public: - AutoBuildingDisplayList(nsDisplayListBuilder* aBuilder, nsIFrame* aForChild) - : AutoBuildingDisplayList( - aBuilder, aForChild, aBuilder->GetVisibleRect(), - aBuilder->GetDirtyRect(), aForChild->IsTransformed()){} - - AutoBuildingDisplayList(nsDisplayListBuilder* aBuilder, nsIFrame* aForChild, - const nsRect& aVisibleRect, + AutoBuildingDisplayList(nsDisplayListBuilder* aBuilder, + nsIFrame* aForChild, const nsRect& aDirtyRect, bool aIsRoot) : mBuilder(aBuilder), mPrevFrame(aBuilder->mCurrentFrame), mPrevReferenceFrame(aBuilder->mCurrentReferenceFrame), mPrevLayerEventRegions(aBuilder->mLayerEventRegions), mPrevOffset(aBuilder->mCurrentOffsetToReferenceFrame), - mPrevVisibleRect(aBuilder->mVisibleRect), mPrevDirtyRect(aBuilder->mDirtyRect), mPrevAGR(aBuilder->mCurrentAGR), mPrevIsAtRootOfPseudoStackingContext(aBuilder->mIsAtRootOfPseudoStackingContext), @@ -769,10 +733,12 @@ public: } MOZ_ASSERT(nsLayoutUtils::IsAncestorFrameCrossDoc(aBuilder->RootReferenceFrame(), *aBuilder->mCurrentAGR)); aBuilder->mCurrentFrame = aForChild; - aBuilder->mVisibleRect = aVisibleRect; aBuilder->mDirtyRect = aDirtyRect; aBuilder->mIsAtRootOfPseudoStackingContext = aIsRoot; } + void SetDirtyRect(const nsRect& aRect) { + mBuilder->mDirtyRect = aRect; + } void SetReferenceFrameAndCurrentOffset(const nsIFrame* aFrame, const nsPoint& aOffset) { mBuilder->mCurrentReferenceFrame = aFrame; mBuilder->mCurrentOffsetToReferenceFrame = aOffset; @@ -794,7 +760,6 @@ public: mBuilder->mCurrentReferenceFrame = mPrevReferenceFrame; mBuilder->mLayerEventRegions = mPrevLayerEventRegions; mBuilder->mCurrentOffsetToReferenceFrame = mPrevOffset; - mBuilder->mVisibleRect = mPrevVisibleRect; mBuilder->mDirtyRect = mPrevDirtyRect; mBuilder->mCurrentAGR = mPrevAGR; mBuilder->mIsAtRootOfPseudoStackingContext = mPrevIsAtRootOfPseudoStackingContext; @@ -808,7 +773,6 @@ public: nsIFrame* mPrevAnimatedGeometryRoot; nsDisplayLayerEventRegions* mPrevLayerEventRegions; nsPoint mPrevOffset; - nsRect mPrevVisibleRect; nsRect mPrevDirtyRect; AnimatedGeometryRoot* mPrevAGR; bool mPrevIsAtRootOfPseudoStackingContext; @@ -1017,19 +981,20 @@ public: return mPreserves3DCtx.mAccumulatedRectLevels; } + // Helpers for tables + nsDisplayTableItem* GetCurrentTableItem() { return mCurrentTableItem; } + void SetCurrentTableItem(nsDisplayTableItem* aTableItem) { mCurrentTableItem = aTableItem; } + struct OutOfFlowDisplayData { OutOfFlowDisplayData(const DisplayItemClip* aContainingBlockClip, const DisplayItemScrollClip* aContainingBlockScrollClip, - const nsRect &aVisibleRect, const nsRect &aDirtyRect) : mContainingBlockClip(aContainingBlockClip ? *aContainingBlockClip : DisplayItemClip()) , mContainingBlockScrollClip(aContainingBlockScrollClip) - , mVisibleRect(aVisibleRect) , mDirtyRect(aDirtyRect) {} DisplayItemClip mContainingBlockClip; const DisplayItemScrollClip* mContainingBlockScrollClip; - nsRect mVisibleRect; nsRect mDirtyRect; }; @@ -1155,13 +1120,11 @@ public: Preserves3DContext mSavedCtx; }; - const nsRect GetPreserves3DRects(nsRect* aOutVisibleRect) const { - *aOutVisibleRect = mPreserves3DCtx.mVisibleRect; + const nsRect GetPreserves3DDirtyRect(const nsIFrame *aFrame) const { return mPreserves3DCtx.mDirtyRect; } - void SavePreserves3DRects() { - mPreserves3DCtx.mVisibleRect = mVisibleRect; - mPreserves3DCtx.mDirtyRect = mDirtyRect; + void SetPreserves3DDirtyRect(const nsRect &aDirtyRect) { + mPreserves3DCtx.mDirtyRect = aDirtyRect; } bool IsBuildingInvisibleItems() const { return mBuildingInvisibleItems; } @@ -1170,7 +1133,8 @@ public: } private: - void MarkOutOfFlowFrameForDisplay(nsIFrame* aDirtyFrame, nsIFrame* aFrame); + void MarkOutOfFlowFrameForDisplay(nsIFrame* aDirtyFrame, nsIFrame* aFrame, + const nsRect& aDirtyRect); /** * Returns whether a frame acts as an animated geometry root, optionally @@ -1210,7 +1174,6 @@ private: nsRect mCaretRect; uint32_t mFirstFrameMarkedForDisplay; bool mIsBackgroundOnly; - nsIFrame* mPresShellIgnoreScrollFrame; // This is a per-document flag turning off event handling for all content // in the document, and is set when we enter a subdocument for a pointer- // events:none frame. @@ -1239,6 +1202,7 @@ private: AutoTArray mPresShellStates; AutoTArray mFramesMarkedForDisplay; AutoTArray mThemeGeometries; + nsDisplayTableItem* mCurrentTableItem; DisplayListClipState mClipState; // mCurrentFrame is the frame that we're currently calling (or about to call) // BuildDisplayList on. @@ -1265,7 +1229,6 @@ private: nsTHashtable > mAGRBudgetSet; // Relative to mCurrentFrame. - nsRect mVisibleRect; nsRect mDirtyRect; nsRegion mWindowExcludeGlassRegion; nsRegion mWindowOpaqueRegion; @@ -1282,7 +1245,6 @@ private: nsTArray mScrollClipsToDestroy; nsTArray mDisplayItemClipsToDestroy; nsDisplayListBuilderMode mMode; - nsDisplayTableBackgroundSet* mTableBackgroundSet; ViewID mCurrentScrollParentId; ViewID mCurrentScrollbarTarget; uint32_t mCurrentScrollbarFlags; @@ -2325,13 +2287,12 @@ protected: * to the object, and all distinct. */ struct nsDisplayListCollection : public nsDisplayListSet { - explicit nsDisplayListCollection(nsDisplayListBuilder* aBuilder) - : nsDisplayListSet(&mLists[0], &mLists[1], &mLists[2], &mLists[3], &mLists[4], + nsDisplayListCollection() : + nsDisplayListSet(&mLists[0], &mLists[1], &mLists[2], &mLists[3], &mLists[4], + &mLists[5]) {} + explicit nsDisplayListCollection(nsDisplayList* aBorderBackground) : + nsDisplayListSet(aBorderBackground, &mLists[1], &mLists[2], &mLists[3], &mLists[4], &mLists[5]) {} - explicit nsDisplayListCollection(nsDisplayListBuilder* aBuilder, - nsDisplayList* aBorderBackground) - : nsDisplayListSet(aBorderBackground, &mLists[1], &mLists[2], &mLists[3], &mLists[4], - &mLists[5]) {} /** * Sort all lists by content order. @@ -2778,9 +2739,7 @@ public: bool aAllowWillPaintBorderOptimization = true, nsStyleContext* aStyleContext = nullptr, const nsRect& aBackgroundOriginRect = nsRect(), - nsIFrame* aSecondaryReferenceFrame = nullptr, - mozilla::Maybe* - aAutoBuildingDisplayList = nullptr); + nsIFrame* aSecondaryReferenceFrame = nullptr); virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder, LayerManager* aManager, diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index 39bef4d56..21d20c69f 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -3189,9 +3189,7 @@ nsLayoutUtils::GetFramesForArea(nsIFrame* aFrame, const nsRect& aRect, } builder.EnterPresShell(aFrame); - builder.SetVisibleRect(aRect); - builder.SetDirtyRect(aRect); - aFrame->BuildDisplayListForStackingContext(&builder, &list); + aFrame->BuildDisplayListForStackingContext(&builder, aRect, &list); builder.LeavePresShell(aFrame, nullptr); #ifdef MOZ_DUMP_PAINTING @@ -3450,8 +3448,7 @@ nsLayoutUtils::PaintFrame(nsRenderingContext* aRenderingContext, nsIFrame* aFram nsIScrollableFrame* rootScrollableFrame = presShell->GetRootScrollFrameAsScrollable(); MOZ_ASSERT(rootScrollableFrame); nsRect displayPortBase = aFrame->GetVisualOverflowRectRelativeToSelf(); - nsRect temp = displayPortBase; - Unused << rootScrollableFrame->DecideScrollableLayer(&builder, &displayPortBase, &temp, + Unused << rootScrollableFrame->DecideScrollableLayer(&builder, &displayPortBase, /* aAllowCreateDisplayPort = */ true); } @@ -3541,9 +3538,7 @@ nsLayoutUtils::PaintFrame(nsRenderingContext* aRenderingContext, nsIFrame* aFram PROFILER_LABEL("nsLayoutUtils", "PaintFrame::BuildDisplayList", js::ProfileEntry::Category::GRAPHICS); - builder.SetDirtyRect(dirtyRect); - builder.SetVisibleRect(dirtyRect); - aFrame->BuildDisplayListForStackingContext(&builder, &list); + aFrame->BuildDisplayListForStackingContext(&builder, dirtyRect, &list); } nsIAtom* frameType = aFrame->GetType(); @@ -3555,7 +3550,7 @@ nsLayoutUtils::PaintFrame(nsRenderingContext* aRenderingContext, nsIFrame* aFram nsRect bounds = nsRect(builder.ToReferenceFrame(aFrame), aFrame->GetSize()); nsDisplayListBuilder::AutoBuildingDisplayList - buildingDisplayList(&builder, aFrame, bounds, bounds, false); + buildingDisplayList(&builder, aFrame, bounds, false); presShell->AddPrintPreviewBackgroundItem(builder, list, aFrame, bounds); } else if (frameType != nsGkAtoms::pageFrame) { // For printing, this function is first called on an nsPageFrame, which @@ -3569,7 +3564,7 @@ nsLayoutUtils::PaintFrame(nsRenderingContext* aRenderingContext, nsIFrame* aFram // can monkey with the contents if necessary. canvasArea.IntersectRect(canvasArea, visibleRegion.GetBounds()); nsDisplayListBuilder::AutoBuildingDisplayList - buildingDisplayList(&builder, aFrame, canvasArea, canvasArea, false); + buildingDisplayList(&builder, aFrame, canvasArea, false); presShell->AddCanvasBackgroundColorItem( builder, list, aFrame, canvasArea, aBackstop); } diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp index 222428a89..264b52b18 100644 --- a/layout/base/nsPresShell.cpp +++ b/layout/base/nsPresShell.cpp @@ -4894,9 +4894,8 @@ PresShell::CreateRangePaintInfo(nsIDOMRange* aRange, nsIFrame* frame = aNode->AsContent()->GetPrimaryFrame(); // XXX deal with frame being null due to display:contents for (; frame; frame = nsLayoutUtils::GetNextContinuationOrIBSplitSibling(frame)) { - info->mBuilder.SetVisibleRect(frame->GetVisualOverflowRect()); - info->mBuilder.SetDirtyRect(frame->GetVisualOverflowRect()); - frame->BuildDisplayListForStackingContext(&info->mBuilder, &info->mList); + frame->BuildDisplayListForStackingContext(&info->mBuilder, + frame->GetVisualOverflowRect(), &info->mList); } }; if (startParent->NodeType() == nsIDOMNode::TEXT_NODE) { diff --git a/layout/forms/nsButtonFrameRenderer.cpp b/layout/forms/nsButtonFrameRenderer.cpp index 5372acb7f..096031385 100644 --- a/layout/forms/nsButtonFrameRenderer.cpp +++ b/layout/forms/nsButtonFrameRenderer.cpp @@ -263,8 +263,8 @@ nsButtonFrameRenderer::DisplayButton(nsDisplayListBuilder* aBuilder, nsDisplayButtonBoxShadowOuter(aBuilder, this)); } - nsRect buttonRect = - mFrame->GetRectRelativeToSelf() + aBuilder->ToReferenceFrame(mFrame); + nsRect buttonRect; + GetButtonRect(mFrame->GetRectRelativeToSelf(), buttonRect); nsDisplayBackgroundImage::AppendBackgroundItemsToTop( aBuilder, mFrame, buttonRect, aBackground); diff --git a/layout/forms/nsComboboxControlFrame.cpp b/layout/forms/nsComboboxControlFrame.cpp index eb8de8e94..78185616f 100644 --- a/layout/forms/nsComboboxControlFrame.cpp +++ b/layout/forms/nsComboboxControlFrame.cpp @@ -1294,6 +1294,7 @@ public: nsReflowStatus& aStatus) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; protected: @@ -1334,10 +1335,11 @@ nsComboboxDisplayFrame::Reflow(nsPresContext* aPresContext, void nsComboboxDisplayFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - nsDisplayListCollection set (aBuilder); - nsBlockFrame::BuildDisplayList(aBuilder, set); + nsDisplayListCollection set; + nsBlockFrame::BuildDisplayList(aBuilder, aDirtyRect, set); // remove background items if parent frame is themed if (mComboBox->IsThemed()) { @@ -1545,8 +1547,13 @@ void nsDisplayComboboxFocus::Paint(nsDisplayListBuilder* aBuilder, void nsComboboxControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { +#ifdef NOISY + printf("%p paint at (%d, %d, %d, %d)\n", this, + aDirtyRect.x, aDirtyRect.y, aDirtyRect.width, aDirtyRect.height); +#endif if (aBuilder->IsForEventDelivery()) { // Don't allow children to receive events. @@ -1555,7 +1562,7 @@ nsComboboxControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, } else { // REVIEW: Our in-flow child frames are inline-level so they will paint in our // content list, so we don't need to mess with layers. - nsBlockFrame::BuildDisplayList(aBuilder, aLists); + nsBlockFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); } // draw a focus indicator only when focus rings should be drawn diff --git a/layout/forms/nsComboboxControlFrame.h b/layout/forms/nsComboboxControlFrame.h index d83726d81..22849e8d1 100644 --- a/layout/forms/nsComboboxControlFrame.h +++ b/layout/forms/nsComboboxControlFrame.h @@ -89,6 +89,7 @@ public: nsEventStatus* aEventStatus) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; void PaintFocus(DrawTarget& aDrawTarget, nsPoint aPt); diff --git a/layout/forms/nsFieldSetFrame.cpp b/layout/forms/nsFieldSetFrame.cpp index a5177560d..fc9f0571b 100644 --- a/layout/forms/nsFieldSetFrame.cpp +++ b/layout/forms/nsFieldSetFrame.cpp @@ -153,6 +153,7 @@ nsDisplayFieldSetBorderBackground::ComputeInvalidationRegion(nsDisplayListBuilde void nsFieldSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // Paint our background and border in a special way. // REVIEW: We don't really need to check frame emptiness here; if it's empty, @@ -165,11 +166,9 @@ nsFieldSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, nsDisplayBoxShadowOuter(aBuilder, this)); } - const nsRect rect = - VisualBorderRectRelativeToSelf() + aBuilder->ToReferenceFrame(this); - nsDisplayBackgroundImage::AppendBackgroundItemsToTop( - aBuilder, this, rect, aLists.BorderBackground(), + aBuilder, this, VisualBorderRectRelativeToSelf(), + aLists.BorderBackground(), /* aAllowWillPaintBorderOptimization = */ false); aLists.BorderBackground()->AppendNewToTop(new (aBuilder) @@ -181,10 +180,10 @@ nsFieldSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, } if (GetPrevInFlow()) { - DisplayOverflowContainers(aBuilder, aLists); + DisplayOverflowContainers(aBuilder, aDirtyRect, aLists); } - nsDisplayListCollection contentDisplayItems(aBuilder); + nsDisplayListCollection contentDisplayItems; if (nsIFrame* inner = GetInner()) { // Collect the inner frame's display items into their own collection. // We need to be calling BuildDisplayList on it before the legend in @@ -192,13 +191,13 @@ nsFieldSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, // legend. However, we want the inner frame's display items to be // after the legend's display items in z-order, so we need to save them // and append them later. - BuildDisplayListForChild(aBuilder, inner, contentDisplayItems); + BuildDisplayListForChild(aBuilder, inner, aDirtyRect, contentDisplayItems); } if (nsIFrame* legend = GetLegend()) { // The legend's background goes on our BlockBorderBackgrounds list because // it's a block child. nsDisplayListSet set(aLists, aLists.BlockBorderBackgrounds()); - BuildDisplayListForChild(aBuilder, legend, set); + BuildDisplayListForChild(aBuilder, legend, aDirtyRect, set); } // Put the inner frame's display items on the master list. Note that this // moves its border/background display items to our BorderBackground() list, diff --git a/layout/forms/nsFieldSetFrame.h b/layout/forms/nsFieldSetFrame.h index 7c162515e..5eb67c320 100644 --- a/layout/forms/nsFieldSetFrame.h +++ b/layout/forms/nsFieldSetFrame.h @@ -53,6 +53,7 @@ public: nscoord* aBaseline) const override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; DrawResult PaintBorder(nsDisplayListBuilder* aBuilder, diff --git a/layout/forms/nsFileControlFrame.cpp b/layout/forms/nsFileControlFrame.cpp index d60e4fb46..659371615 100644 --- a/layout/forms/nsFileControlFrame.cpp +++ b/layout/forms/nsFileControlFrame.cpp @@ -485,9 +485,10 @@ nsFileControlFrame::SetFormProperty(nsIAtom* aName, void nsFileControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - BuildDisplayListForInline(aBuilder, aLists); + BuildDisplayListForInline(aBuilder, aDirtyRect, aLists); } #ifdef ACCESSIBILITY diff --git a/layout/forms/nsFileControlFrame.h b/layout/forms/nsFileControlFrame.h index 4f975af29..55c51d426 100644 --- a/layout/forms/nsFileControlFrame.h +++ b/layout/forms/nsFileControlFrame.h @@ -33,6 +33,7 @@ public: nsIFrame* aPrevInFlow) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; NS_DECL_QUERYFRAME diff --git a/layout/forms/nsFormControlFrame.h b/layout/forms/nsFormControlFrame.h index 41bb1d9e8..fd3e95d93 100644 --- a/layout/forms/nsFormControlFrame.h +++ b/layout/forms/nsFormControlFrame.h @@ -40,6 +40,7 @@ public: // nsIFrame replacements virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override { DO_GLOBAL_REFLOW_COUNT_DSP("nsFormControlFrame"); DisplayBorderBackgroundOutline(aBuilder, aLists); diff --git a/layout/forms/nsGfxCheckboxControlFrame.cpp b/layout/forms/nsGfxCheckboxControlFrame.cpp index 80009eff2..061c92349 100644 --- a/layout/forms/nsGfxCheckboxControlFrame.cpp +++ b/layout/forms/nsGfxCheckboxControlFrame.cpp @@ -107,9 +107,10 @@ nsGfxCheckboxControlFrame::AccessibleType() //------------------------------------------------------------ void nsGfxCheckboxControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - nsFormControlFrame::BuildDisplayList(aBuilder, aLists); + nsFormControlFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); // Get current checked state through content model. if ((!IsChecked() && !IsIndeterminate()) || !IsVisibleForPainting(aBuilder)) diff --git a/layout/forms/nsGfxCheckboxControlFrame.h b/layout/forms/nsGfxCheckboxControlFrame.h index 9234b5057..70b8d8d6a 100644 --- a/layout/forms/nsGfxCheckboxControlFrame.h +++ b/layout/forms/nsGfxCheckboxControlFrame.h @@ -23,6 +23,7 @@ public: #endif virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; #ifdef ACCESSIBILITY diff --git a/layout/forms/nsGfxRadioControlFrame.cpp b/layout/forms/nsGfxRadioControlFrame.cpp index 9c1ec070b..e4a35a998 100644 --- a/layout/forms/nsGfxRadioControlFrame.cpp +++ b/layout/forms/nsGfxRadioControlFrame.cpp @@ -70,9 +70,10 @@ PaintCheckedRadioButton(nsIFrame* aFrame, void nsGfxRadioControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - nsFormControlFrame::BuildDisplayList(aBuilder, aLists); + nsFormControlFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); if (!IsVisibleForPainting(aBuilder)) return; diff --git a/layout/forms/nsGfxRadioControlFrame.h b/layout/forms/nsGfxRadioControlFrame.h index dd268dec1..f91e6b94c 100644 --- a/layout/forms/nsGfxRadioControlFrame.h +++ b/layout/forms/nsGfxRadioControlFrame.h @@ -25,6 +25,7 @@ public: #endif virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; }; diff --git a/layout/forms/nsHTMLButtonControlFrame.cpp b/layout/forms/nsHTMLButtonControlFrame.cpp index 3289456f2..2e4fa9f67 100644 --- a/layout/forms/nsHTMLButtonControlFrame.cpp +++ b/layout/forms/nsHTMLButtonControlFrame.cpp @@ -97,6 +97,7 @@ nsHTMLButtonControlFrame::ShouldClipPaintingToBorderBox() void nsHTMLButtonControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // Clip to our border area for event hit testing. @@ -115,7 +116,7 @@ nsHTMLButtonControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, mRenderer.DisplayButton(aBuilder, aLists.BorderBackground(), &onTop); } - nsDisplayListCollection set (aBuilder); + nsDisplayListCollection set; // Do not allow the child subtree to receive events. if (!isForEventDelivery) { @@ -130,7 +131,7 @@ nsHTMLButtonControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, clipState.ClipContainingBlockDescendants(rect, hasRadii ? radii : nullptr); } - BuildDisplayListForChild(aBuilder, mFrames.FirstChild(), set, + BuildDisplayListForChild(aBuilder, mFrames.FirstChild(), aDirtyRect, set, DISPLAY_CHILD_FORCE_PSEUDO_STACKING_CONTEXT); // That should put the display items in set.Content() } diff --git a/layout/forms/nsHTMLButtonControlFrame.h b/layout/forms/nsHTMLButtonControlFrame.h index 8837daf74..432afa12c 100644 --- a/layout/forms/nsHTMLButtonControlFrame.h +++ b/layout/forms/nsHTMLButtonControlFrame.h @@ -27,6 +27,7 @@ public: NS_DECL_FRAMEARENA_HELPERS virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nscoord GetMinISize(nsRenderingContext *aRenderingContext) override; diff --git a/layout/forms/nsListControlFrame.cpp b/layout/forms/nsListControlFrame.cpp index 2233c5996..58e81039f 100644 --- a/layout/forms/nsListControlFrame.cpp +++ b/layout/forms/nsListControlFrame.cpp @@ -155,6 +155,7 @@ nsListControlFrame::DestroyFrom(nsIFrame* aDestructRoot) void nsListControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // We allow visibility:hidden