From e62cf6dd69c85daa9ba044b87290b738e626b22a Mon Sep 17 00:00:00 2001 From: Matt Woodrow Date: Mon, 7 Aug 2017 14:23:35 +1200 Subject: [PATCH] Bug 1388161 - Store the dirty rect on the display list builder rather than passing it as a parameter to BuildDisplayList. r=mstange --- layout/base/PresShell.cpp | 4 +- layout/base/nsLayoutUtils.cpp | 6 +- layout/forms/nsComboboxControlFrame.cpp | 12 +--- layout/forms/nsComboboxControlFrame.h | 1 - layout/forms/nsFieldSetFrame.cpp | 7 +- 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 | 3 +- 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 | 8 +-- layout/forms/nsSelectsAreaFrame.h | 2 - layout/forms/nsTextControlFrame.cpp | 3 +- layout/forms/nsTextControlFrame.h | 1 - layout/generic/ViewportFrame.cpp | 9 ++- layout/generic/ViewportFrame.h | 1 - layout/generic/nsBackdropFrame.cpp | 1 - layout/generic/nsBackdropFrame.h | 1 - layout/generic/nsBlockFrame.cpp | 27 ++++---- layout/generic/nsBlockFrame.h | 1 - layout/generic/nsBulletFrame.cpp | 1 - layout/generic/nsBulletFrame.h | 1 - layout/generic/nsCanvasFrame.cpp | 13 ++-- layout/generic/nsCanvasFrame.h | 1 - layout/generic/nsColumnSetFrame.cpp | 5 +- layout/generic/nsColumnSetFrame.h | 1 - layout/generic/nsContainerFrame.cpp | 10 +-- 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 | 69 ++++++++++---------- layout/generic/nsFrameSetFrame.cpp | 7 +- layout/generic/nsFrameSetFrame.h | 1 - layout/generic/nsGfxScrollFrame.cpp | 68 +++++++++++-------- layout/generic/nsGfxScrollFrame.h | 10 +-- layout/generic/nsGridContainerFrame.cpp | 6 +- layout/generic/nsGridContainerFrame.h | 1 - layout/generic/nsHTMLCanvasFrame.cpp | 1 - layout/generic/nsHTMLCanvasFrame.h | 1 - layout/generic/nsIFrame.h | 13 +--- 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 | 19 ++++-- 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 | 10 +-- layout/generic/nsSimplePageSequenceFrame.h | 1 - layout/generic/nsSubDocumentFrame.cpp | 34 +++++----- layout/generic/nsSubDocumentFrame.h | 1 - layout/generic/nsTextFrame.cpp | 1 - layout/generic/nsTextFrame.h | 1 - layout/generic/nsVideoFrame.cpp | 18 ++--- layout/generic/nsVideoFrame.h | 1 - layout/ipc/RenderFrameParent.cpp | 1 - layout/ipc/RenderFrameParent.h | 1 - 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 - layout/painting/nsDisplayList.cpp | 21 +++--- layout/painting/nsDisplayList.h | 21 +++--- layout/svg/SVGFEUnstyledLeafFrame.cpp | 1 - layout/svg/SVGGeometryFrame.cpp | 1 - layout/svg/SVGGeometryFrame.h | 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/nsSVGStopFrame.cpp | 1 - layout/svg/nsSVGSwitchFrame.cpp | 4 +- layout/tables/nsTableCellFrame.cpp | 3 +- layout/tables/nsTableCellFrame.h | 1 - layout/tables/nsTableColFrame.cpp | 3 +- layout/tables/nsTableColFrame.h | 1 - layout/tables/nsTableColGroupFrame.cpp | 3 +- layout/tables/nsTableColGroupFrame.h | 1 - layout/tables/nsTableFrame.cpp | 40 +++++------- layout/tables/nsTableFrame.h | 6 +- layout/tables/nsTableRowFrame.cpp | 3 +- layout/tables/nsTableRowFrame.h | 1 - layout/tables/nsTableRowGroupFrame.cpp | 16 ++--- layout/tables/nsTableRowGroupFrame.h | 1 - layout/tables/nsTableWrapperFrame.cpp | 11 ++-- layout/tables/nsTableWrapperFrame.h | 2 - layout/xul/nsBoxFrame.cpp | 6 +- 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 | 4 +- 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 | 5 +- layout/xul/nsMenuFrame.h | 1 - layout/xul/nsRootBoxFrame.cpp | 7 +- layout/xul/nsSliderFrame.cpp | 18 +++-- 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 | 5 +- layout/xul/tree/nsTreeColFrame.h | 1 - 154 files changed, 281 insertions(+), 450 deletions(-) diff --git a/layout/base/PresShell.cpp b/layout/base/PresShell.cpp index e92f4beaa2da..69b7f1394575 100644 --- a/layout/base/PresShell.cpp +++ b/layout/base/PresShell.cpp @@ -4942,8 +4942,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)) { - frame->BuildDisplayListForStackingContext(&info->mBuilder, - frame->GetVisualOverflowRect(), &info->mList); + info->mBuilder.SetDirtyRect(frame->GetVisualOverflowRect()); + frame->BuildDisplayListForStackingContext(&info->mBuilder, &info->mList); } }; if (startContainer->NodeType() == nsIDOMNode::TEXT_NODE) { diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index 4793608bb721..5be88489aa84 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -3257,7 +3257,8 @@ nsLayoutUtils::GetFramesForArea(nsIFrame* aFrame, const nsRect& aRect, } builder.EnterPresShell(aFrame); - aFrame->BuildDisplayListForStackingContext(&builder, aRect, &list); + builder.SetDirtyRect(aRect); + aFrame->BuildDisplayListForStackingContext(&builder, &list); builder.LeavePresShell(aFrame, nullptr); #ifdef MOZ_DUMP_PAINTING @@ -3612,7 +3613,8 @@ nsLayoutUtils::PaintFrame(gfxContext* aRenderingContext, nsIFrame* aFrame, nsDisplayListBuilder::AutoCurrentScrollParentIdSetter idSetter(&builder, id); - aFrame->BuildDisplayListForStackingContext(&builder, dirtyRect, &list); + builder.SetDirtyRect(dirtyRect); + aFrame->BuildDisplayListForStackingContext(&builder, &list); } LayoutFrameType frameType = aFrame->Type(); diff --git a/layout/forms/nsComboboxControlFrame.cpp b/layout/forms/nsComboboxControlFrame.cpp index 6c61a4ecf1ac..a21d6be4e05f 100644 --- a/layout/forms/nsComboboxControlFrame.cpp +++ b/layout/forms/nsComboboxControlFrame.cpp @@ -1312,7 +1312,6 @@ public: nsReflowStatus& aStatus) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; protected: @@ -1347,11 +1346,10 @@ nsComboboxDisplayFrame::Reflow(nsPresContext* aPresContext, void nsComboboxDisplayFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { nsDisplayListCollection set; - nsBlockFrame::BuildDisplayList(aBuilder, aDirtyRect, set); + nsBlockFrame::BuildDisplayList(aBuilder, set); // remove background items if parent frame is themed if (mComboBox->IsThemed()) { @@ -1555,14 +1553,8 @@ 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. // REVIEW: following old GetFrameForPoint @@ -1570,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, aDirtyRect, aLists); + nsBlockFrame::BuildDisplayList(aBuilder, 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 6eb48c1a03e7..38e057b10c2e 100644 --- a/layout/forms/nsComboboxControlFrame.h +++ b/layout/forms/nsComboboxControlFrame.h @@ -91,7 +91,6 @@ 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 5e0c8eb159cd..66261b25bf3e 100644 --- a/layout/forms/nsFieldSetFrame.cpp +++ b/layout/forms/nsFieldSetFrame.cpp @@ -148,7 +148,6 @@ nsDisplayFieldSetBorder::GetBounds(nsDisplayListBuilder* aBuilder, 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, @@ -175,7 +174,7 @@ nsFieldSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, } if (GetPrevInFlow()) { - DisplayOverflowContainers(aBuilder, aDirtyRect, aLists); + DisplayOverflowContainers(aBuilder, aLists); } nsDisplayListCollection contentDisplayItems; @@ -186,13 +185,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, aDirtyRect, contentDisplayItems); + BuildDisplayListForChild(aBuilder, inner, 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, aDirtyRect, set); + BuildDisplayListForChild(aBuilder, legend, 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 451855bebf39..5c36a0dce574 100644 --- a/layout/forms/nsFieldSetFrame.h +++ b/layout/forms/nsFieldSetFrame.h @@ -44,7 +44,6 @@ 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 323698e85dc5..3d84dfc4b328 100644 --- a/layout/forms/nsFileControlFrame.cpp +++ b/layout/forms/nsFileControlFrame.cpp @@ -496,10 +496,9 @@ nsFileControlFrame::SetFormProperty(nsIAtom* aName, void nsFileControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - BuildDisplayListForInline(aBuilder, aDirtyRect, aLists); + BuildDisplayListForInline(aBuilder, aLists); } #ifdef ACCESSIBILITY diff --git a/layout/forms/nsFileControlFrame.h b/layout/forms/nsFileControlFrame.h index efc778c375f3..9269cca959f0 100644 --- a/layout/forms/nsFileControlFrame.h +++ b/layout/forms/nsFileControlFrame.h @@ -33,7 +33,6 @@ 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 f7e8de260493..631313edc5e5 100644 --- a/layout/forms/nsFormControlFrame.h +++ b/layout/forms/nsFormControlFrame.h @@ -38,7 +38,6 @@ 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 0bb10a8a8eb7..d9666841ec40 100644 --- a/layout/forms/nsGfxCheckboxControlFrame.cpp +++ b/layout/forms/nsGfxCheckboxControlFrame.cpp @@ -113,10 +113,9 @@ nsGfxCheckboxControlFrame::AccessibleType() void nsGfxCheckboxControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - nsFormControlFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsFormControlFrame::BuildDisplayList(aBuilder, 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 2517259b7e91..26c0a3d4178d 100644 --- a/layout/forms/nsGfxCheckboxControlFrame.h +++ b/layout/forms/nsGfxCheckboxControlFrame.h @@ -24,7 +24,6 @@ public: #ifdef MOZ_WIDGET_ANDROID virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; #endif diff --git a/layout/forms/nsGfxRadioControlFrame.cpp b/layout/forms/nsGfxRadioControlFrame.cpp index 0ef1eac13299..04c4551b7da9 100644 --- a/layout/forms/nsGfxRadioControlFrame.cpp +++ b/layout/forms/nsGfxRadioControlFrame.cpp @@ -72,10 +72,9 @@ PaintCheckedRadioButton(nsIFrame* aFrame, void nsGfxRadioControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - nsFormControlFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsFormControlFrame::BuildDisplayList(aBuilder, aLists); if (!IsVisibleForPainting(aBuilder)) return; diff --git a/layout/forms/nsGfxRadioControlFrame.h b/layout/forms/nsGfxRadioControlFrame.h index 05ecf7675b87..daf97e685028 100644 --- a/layout/forms/nsGfxRadioControlFrame.h +++ b/layout/forms/nsGfxRadioControlFrame.h @@ -26,7 +26,6 @@ public: #ifdef MOZ_WIDGET_ANDROID virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; #endif }; diff --git a/layout/forms/nsHTMLButtonControlFrame.cpp b/layout/forms/nsHTMLButtonControlFrame.cpp index 9f6003b3530c..317e807042f9 100644 --- a/layout/forms/nsHTMLButtonControlFrame.cpp +++ b/layout/forms/nsHTMLButtonControlFrame.cpp @@ -92,7 +92,6 @@ nsHTMLButtonControlFrame::ShouldClipPaintingToBorderBox() void nsHTMLButtonControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // Clip to our border area for event hit testing. @@ -126,7 +125,7 @@ nsHTMLButtonControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, clipState.ClipContainingBlockDescendants(rect, hasRadii ? radii : nullptr); } - BuildDisplayListForChild(aBuilder, mFrames.FirstChild(), aDirtyRect, set, + BuildDisplayListForChild(aBuilder, mFrames.FirstChild(), 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 f59cc7e666b0..5ce156965ef0 100644 --- a/layout/forms/nsHTMLButtonControlFrame.h +++ b/layout/forms/nsHTMLButtonControlFrame.h @@ -30,7 +30,6 @@ public: NS_DECL_FRAMEARENA_HELPERS(nsHTMLButtonControlFrame) virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nscoord GetMinISize(gfxContext *aRenderingContext) override; diff --git a/layout/forms/nsListControlFrame.cpp b/layout/forms/nsListControlFrame.cpp index 060710dc3cf6..9ec702deb339 100644 --- a/layout/forms/nsListControlFrame.cpp +++ b/layout/forms/nsListControlFrame.cpp @@ -161,7 +161,6 @@ nsListControlFrame::DestroyFrom(nsIFrame* aDestructRoot) void nsListControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // We allow visibility:hidden