summaryrefslogtreecommitdiffstats
path: root/layout/base
diff options
context:
space:
mode:
Diffstat (limited to 'layout/base')
-rw-r--r--layout/base/nsDisplayList.cpp120
-rw-r--r--layout/base/nsDisplayList.h95
-rw-r--r--layout/base/nsLayoutUtils.cpp15
-rw-r--r--layout/base/nsPresShell.cpp5
4 files changed, 76 insertions, 159 deletions
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<nsIDocShell> docShell = pc->GetDocShell();
- if (docShell) {
- docShell->GetWindowDraggingAllowed(&mWindowDraggingAllowed);
- }
-
- mIsInChromePresContext = pc->IsChrome();
-
if (!buildCaret)
return;
RefPtr<nsCaret> 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<nsIDocShell> 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<nsDisplayListBuilder::AutoBuildingDisplayList>*
- 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<PresShellState,8> mPresShellStates;
AutoTArray<nsIFrame*,400> mFramesMarkedForDisplay;
AutoTArray<ThemeGeometry,2> 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<nsPtrHashKey<nsIFrame> > mAGRBudgetSet;
// Relative to mCurrentFrame.
- nsRect mVisibleRect;
nsRect mDirtyRect;
nsRegion mWindowExcludeGlassRegion;
nsRegion mWindowOpaqueRegion;
@@ -1282,7 +1245,6 @@ private:
nsTArray<DisplayItemScrollClip*> mScrollClipsToDestroy;
nsTArray<DisplayItemClip*> 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<nsDisplayListBuilder::AutoBuildingDisplayList>*
- 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) {