Bug 1404181 - Part 19: Some items don't use style data from mFrame, so add overrides that let us check the right frame when determining if an item is invalid. r?mstange
MozReview-Commit-ID: Cvsf4xRFucp
--- a/layout/generic/nsSubDocumentFrame.cpp
+++ b/layout/generic/nsSubDocumentFrame.cpp
@@ -549,17 +549,17 @@ nsSubDocumentFrame::BuildDisplayList(nsD
new (aBuilder) nsDisplayResolution(aBuilder, subdocRootFrame, &childItems,
flags);
childItems.AppendToTop(resolutionItem);
needsOwnLayer = false;
}
if (needsOwnLayer) {
// We always want top level content documents to be in their own layer.
nsDisplaySubDocument* layerItem = new (aBuilder) nsDisplaySubDocument(
- aBuilder, subdocRootFrame ? subdocRootFrame : this,
+ aBuilder, subdocRootFrame ? subdocRootFrame : this, this,
&childItems, flags);
childItems.AppendToTop(layerItem);
}
// If we're using containers for root frames, then the earlier call
// to AddCanvasBackgroundColorItem won't have been able to add an
// unscrolled color item for overscroll. Try again now that we're
// outside the scrolled ContainerLayer.
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -6798,20 +6798,22 @@ nsDisplayOwnLayer::UpdateScrollData(mozi
aLayerData->SetIsScrollbarContainer();
aLayerData->SetScrollbarTargetContainerId(mScrollTarget);
}
}
return ret;
}
nsDisplaySubDocument::nsDisplaySubDocument(nsDisplayListBuilder* aBuilder,
- nsIFrame* aFrame, nsDisplayList* aList,
- uint32_t aFlags)
+ nsIFrame* aFrame,
+ nsSubDocumentFrame* aSubDocFrame,
+ nsDisplayList* aList, uint32_t aFlags)
: nsDisplayOwnLayer(aBuilder, aFrame, aList, aBuilder->CurrentActiveScrolledRoot(), aFlags)
, mScrollParentId(aBuilder->GetCurrentScrollParentId())
+ , mSubDocFrame(aSubDocFrame)
{
MOZ_COUNT_CTOR(nsDisplaySubDocument);
mForceDispatchToContentRegion =
aBuilder->IsBuildingLayerEventRegions() &&
nsLayoutUtils::HasDocumentLevelListenersForApzAwareEvents(aFrame->PresContext()->PresShell());
// The SubDocument display item is conceptually outside the viewport frame,
// so in cases where the viewport frame is an AGR, the SubDocument's AGR
@@ -6954,17 +6956,17 @@ nsDisplaySubDocument::GetOpaqueRegion(ns
}
return nsDisplayOwnLayer::GetOpaqueRegion(aBuilder, aSnap);
}
nsDisplayResolution::nsDisplayResolution(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrame, nsDisplayList* aList,
uint32_t aFlags)
- : nsDisplaySubDocument(aBuilder, aFrame, aList, aFlags) {
+ : nsDisplaySubDocument(aBuilder, aFrame, nullptr, aList, aFlags) {
MOZ_COUNT_CTOR(nsDisplayResolution);
}
#ifdef NS_BUILD_REFCNT_LOGGING
nsDisplayResolution::~nsDisplayResolution() {
MOZ_COUNT_DTOR(nsDisplayResolution);
}
#endif
@@ -7133,16 +7135,17 @@ GetTableTypeFromFrame(nsIFrame* aFrame)
}
nsDisplayTableFixedPosition::nsDisplayTableFixedPosition(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrame,
nsDisplayList* aList,
uint32_t aIndex,
nsIFrame* aAncestorFrame)
: nsDisplayFixedPosition(aBuilder, aFrame, aList, aIndex)
+ , mAncestorFrame(aAncestorFrame)
, mTableType(GetTableTypeFromFrame(aAncestorFrame))
{
}
/* static */ nsDisplayTableFixedPosition*
nsDisplayTableFixedPosition::CreateForFixedBackground(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrame,
nsDisplayBackgroundImage* aImage,
@@ -7429,17 +7432,17 @@ nsDisplayScrollInfoLayer::WriteDebugInfo
aStream << " (scrollframe " << mScrollFrame
<< " scrolledFrame " << mScrolledFrame << ")";
}
nsDisplayZoom::nsDisplayZoom(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrame, nsDisplayList* aList,
int32_t aAPD, int32_t aParentAPD,
uint32_t aFlags)
- : nsDisplaySubDocument(aBuilder, aFrame, aList, aFlags)
+ : nsDisplaySubDocument(aBuilder, aFrame, nullptr, aList, aFlags)
, mAPD(aAPD), mParentAPD(aParentAPD) {
MOZ_COUNT_CTOR(nsDisplayZoom);
}
#ifdef NS_BUILD_REFCNT_LOGGING
nsDisplayZoom::~nsDisplayZoom() {
MOZ_COUNT_DTOR(nsDisplayZoom);
}
--- a/layout/painting/nsDisplayList.h
+++ b/layout/painting/nsDisplayList.h
@@ -1996,18 +1996,29 @@ public:
* returns null.
*/
inline nsIFrame* Frame() const
{
MOZ_ASSERT(mFrame, "Trying to use display item after deletion!");
return mFrame;
}
+ /**
+ * @return the nsIFrame that provides the style data, and should
+ * be checked when deciding if this display item can be reused.
+ */
+ virtual nsIFrame* FrameForInvalidation() const
+ {
+ return mFrame;
+ }
+
bool HasDeletedFrame() const { return !mFrame; }
+ virtual nsIFrame* StyleFrame() const { return mFrame; }
+
/**
* Compute the used z-index of our frame; returns zero for elements to which
* z-index does not apply, and for z-index:auto.
* @note This can be overridden, @see nsDisplayWrapList::SetOverrideZIndex.
*/
virtual int32_t ZIndex() const;
/**
* The default bounds is the frame border rect.
@@ -3722,18 +3733,16 @@ protected:
bool CanBuildWebRenderDisplayItems(LayerManager* aManager);
bool TryOptimizeToImageLayer(LayerManager* aManager, nsDisplayListBuilder* aBuilder);
nsRect GetBoundsInternal(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrameForBounds = nullptr);
void PaintInternal(nsDisplayListBuilder* aBuilder, gfxContext* aCtx,
const nsRect& aBounds, nsRect* aClipRect);
- virtual nsIFrame* StyleFrame() { return mFrame; }
-
// Determine whether we want to be separated into our own layer, independent
// of whether this item can actually be layerized.
enum ImageLayerization {
WHENEVER_POSSIBLE,
ONLY_FOR_SCALING,
NO_LAYER_NEEDED
};
ImageLayerization ShouldCreateOwnLayer(nsDisplayListBuilder* aBuilder,
@@ -3794,18 +3803,22 @@ public:
nsDisplayTableBackgroundImage(const InitData& aInitData, nsIFrame* aCellFrame);
virtual uint32_t GetPerFrameKey() const override {
return (static_cast<uint8_t>(mTableType) << TYPE_BITS) |
nsDisplayItem::GetPerFrameKey();
}
virtual bool IsInvalid(nsRect& aRect) const override;
+
+ virtual nsIFrame* FrameForInvalidation() const override { return mStyleFrame; }
+
+ NS_DISPLAY_DECL_NAME("TableBackgroundImage", TYPE_TABLE_BACKGROUND_IMAGE)
protected:
- virtual nsIFrame* StyleFrame() override { return mStyleFrame; }
+ virtual nsIFrame* StyleFrame() const override { return mStyleFrame; }
nsIFrame* mStyleFrame;
TableType mTableType;
};
/**
* A display item to paint the native theme background for a frame.
*/
@@ -3991,24 +4004,30 @@ class nsDisplayTableBackgroundColor : pu
{
public:
nsDisplayTableBackgroundColor(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
const nsRect& aBackgroundRect,
const nsStyleBackground* aBackgroundStyle,
nscolor aColor,
nsIFrame* aAncestorFrame)
: nsDisplayBackgroundColor(aBuilder, aFrame, aBackgroundRect, aBackgroundStyle, aColor)
+ , mAncestorFrame(aAncestorFrame)
, mTableType(GetTableTypeFromFrame(aAncestorFrame))
{ }
+ virtual nsIFrame* FrameForInvalidation() const override { return mAncestorFrame; }
+
virtual uint32_t GetPerFrameKey() const override {
return (static_cast<uint8_t>(mTableType) << TYPE_BITS) |
nsDisplayItem::GetPerFrameKey();
}
+
+ NS_DISPLAY_DECL_NAME("TableBackgroundColor", TYPE_TABLE_BACKGROUND_COLOR)
protected:
+ nsIFrame* mAncestorFrame;
TableType mTableType;
};
class nsDisplayClearBackground : public nsDisplayItem
{
public:
nsDisplayClearBackground(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame)
: nsDisplayItem(aBuilder, aFrame)
@@ -5017,45 +5036,49 @@ protected:
/**
* A display item for subdocuments. This is more or less the same as nsDisplayOwnLayer,
* except that it always populates the FrameMetrics instance on the ContainerLayer it
* builds.
*/
class nsDisplaySubDocument : public nsDisplayOwnLayer {
public:
- nsDisplaySubDocument(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
+ nsDisplaySubDocument(nsDisplayListBuilder* aBuilder,
+ nsIFrame* aFrame, nsSubDocumentFrame* aSubDocFrame,
nsDisplayList* aList, uint32_t aFlags);
#ifdef NS_BUILD_REFCNT_LOGGING
virtual ~nsDisplaySubDocument();
#endif
virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
const ContainerLayerParameters& aContainerParameters) override;
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder,
bool* aSnap) const override;
+ virtual nsSubDocumentFrame* SubDocumentFrame() { return mSubDocFrame; }
+
virtual bool ComputeVisibility(nsDisplayListBuilder* aBuilder,
nsRegion* aVisibleRegion) override;
virtual bool ShouldBuildLayerEvenIfInvisible(nsDisplayListBuilder* aBuilder) const override;
virtual nsRegion GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
bool* aSnap) const override;
NS_DISPLAY_DECL_NAME("SubDocument", TYPE_SUBDOCUMENT)
mozilla::UniquePtr<ScrollMetadata> ComputeScrollMetadata(Layer* aLayer,
const ContainerLayerParameters& aContainerParameters);
protected:
ViewID mScrollParentId;
bool mForceDispatchToContentRegion;
+ nsSubDocumentFrame* mSubDocFrame;
};
/**
* A display item for subdocuments to capture the resolution from the presShell
* and ensure that it gets applied to all the right elements. This item creates
* a container layer.
*/
class nsDisplayResolution : public nsDisplaySubDocument {
@@ -5202,25 +5225,30 @@ class nsDisplayTableFixedPosition : publ
{
public:
static nsDisplayTableFixedPosition* CreateForFixedBackground(nsDisplayListBuilder* aBuilder,
nsIFrame* aFrame,
nsDisplayBackgroundImage* aImage,
uint32_t aIndex,
nsIFrame* aAncestorFrame);
+ virtual nsIFrame* FrameForInvalidation() const override { return mAncestorFrame; }
+
virtual uint32_t GetPerFrameKey() const override {
return (mIndex << (TYPE_BITS + static_cast<uint8_t>(TableTypeBits::COUNT))) |
(static_cast<uint8_t>(mTableType) << TYPE_BITS) |
nsDisplayItem::GetPerFrameKey();
}
+
+ NS_DISPLAY_DECL_NAME("TableFixedPosition", TYPE_TABLE_FIXED_POSITION)
protected:
nsDisplayTableFixedPosition(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
nsDisplayList* aList, uint32_t aIndex, nsIFrame* aAncestorFrame);
+ nsIFrame* mAncestorFrame;
TableType mTableType;
};
/**
* This creates an empty scrollable layer. It has no child layers.
* It is used to record the existence of a scrollable frame in the layer
* tree.
*/