Bug 1415225 - Stop setting the EventRegionsOverride flag on in-process subdocument layers. r?botond
The mechanics of this change is fairly straightforward - instead of setting the
override on the layer corresponding to the in-process subdocument, we just set
the flag on the display list builder; that flag is already checked when building
the layer event regions for descendant nsIFrames.
As a side-effect, we also don't need to force a layer for in-process subdocuments
just because they have document-level APZ-aware listeners. One of reasons we were
doing so before was so that we would have a layer to stash the override flags on
but now we don't need that any more.
Note that out-of-process subdocuments are not affected; for those cases
the nsSubDocumentFrame delegates BuildDisplayList to
RenderFrameParent/nsDisplayRemote, which will still set the overrides on
the RefLayer that is created.
MozReview-Commit-ID: DZWglE4e62p
--- a/layout/generic/nsSubDocumentFrame.cpp
+++ b/layout/generic/nsSubDocumentFrame.cpp
@@ -442,22 +442,16 @@ nsSubDocumentFrame::BuildDisplayList(nsD
constructZoomItem ||
haveDisplayPort ||
presContext->IsRootContentDocument() ||
(sf && sf->IsScrollingActive(aBuilder)))
{
needsOwnLayer = true;
}
- if (!needsOwnLayer && aBuilder->IsBuildingLayerEventRegions() &&
- nsLayoutUtils::HasDocumentLevelListenersForApzAwareEvents(presShell))
- {
- needsOwnLayer = true;
- }
-
if (aBuilder->IsRetainingDisplayList()) {
// The value of needsOwnLayer can change between builds without
// an invalidation recorded for this frame (like if the root
// scrollframe becomes active). If this happens,
// then we need to notify the builder so that merging can
// happen correctly.
if (!mPreviouslyNeededLayer ||
mPreviouslyNeededLayer.value() != needsOwnLayer) {
@@ -500,17 +494,21 @@ nsSubDocumentFrame::BuildDisplayList(nsD
if (subdocRootFrame) {
nsIFrame* rootScrollFrame = presShell->GetRootScrollFrame();
nsDisplayListBuilder::AutoCurrentScrollParentIdSetter idSetter(
aBuilder,
ignoreViewportScrolling && rootScrollFrame && rootScrollFrame->GetContent()
? nsLayoutUtils::FindOrCreateIDFor(rootScrollFrame->GetContent())
: aBuilder->GetCurrentScrollParentId());
- aBuilder->SetAncestorHasApzAwareEventHandler(false);
+ bool hasDocumentLevelListenersForApzAwareEvents =
+ aBuilder->IsBuildingLayerEventRegions() &&
+ nsLayoutUtils::HasDocumentLevelListenersForApzAwareEvents(presShell);
+
+ aBuilder->SetAncestorHasApzAwareEventHandler(hasDocumentLevelListenersForApzAwareEvents);
subdocRootFrame->
BuildDisplayListForStackingContext(aBuilder, &childItems);
}
if (!aBuilder->IsForEventDelivery()) {
// If we are going to use a displayzoom below then any items we put under
// it need to have underlying frames from the subdocument. So we need to
// calculate the bounds based on which frame will be the underlying frame
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -6856,45 +6856,31 @@ nsDisplaySubDocument::nsDisplaySubDocume
nsSubDocumentFrame* aSubDocFrame,
nsDisplayList* aList, uint32_t aFlags)
: nsDisplayOwnLayer(aBuilder, aFrame, aList, aBuilder->CurrentActiveScrolledRoot(), aFlags)
, mScrollParentId(aBuilder->GetCurrentScrollParentId())
, mShouldFlatten(false)
, mSubDocFrame(aSubDocFrame)
{
MOZ_COUNT_CTOR(nsDisplaySubDocument);
- mForceDispatchToContentRegion =
- aBuilder->IsBuildingLayerEventRegions() &&
- nsLayoutUtils::HasDocumentLevelListenersForApzAwareEvents(aFrame->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
// should be not the viewport frame itself, but its parent AGR.
if (*mAnimatedGeometryRoot == mFrame && mAnimatedGeometryRoot->mParentAGR) {
mAnimatedGeometryRoot = mAnimatedGeometryRoot->mParentAGR;
}
}
#ifdef NS_BUILD_REFCNT_LOGGING
nsDisplaySubDocument::~nsDisplaySubDocument() {
MOZ_COUNT_DTOR(nsDisplaySubDocument);
}
#endif
-already_AddRefed<Layer>
-nsDisplaySubDocument::BuildLayer(nsDisplayListBuilder* aBuilder,
- LayerManager* aManager,
- const ContainerLayerParameters& aContainerParameters) {
- RefPtr<Layer> layer = nsDisplayOwnLayer::BuildLayer(aBuilder, aManager, aContainerParameters);
- layer->AsContainerLayer()->SetEventRegionsOverride(mForceDispatchToContentRegion
- ? EventRegionsOverride::ForceDispatchToContent
- : EventRegionsOverride::NoOverride);
- return layer.forget();
-}
-
UniquePtr<ScrollMetadata>
nsDisplaySubDocument::ComputeScrollMetadata(LayerManager* aLayerManager,
const ContainerLayerParameters& aContainerParameters)
{
if (!(mFlags & GENERATE_SCROLLABLE_LAYER)) {
return UniquePtr<ScrollMetadata>(nullptr);
}
--- a/layout/painting/nsDisplayList.h
+++ b/layout/painting/nsDisplayList.h
@@ -5106,20 +5106,16 @@ class nsDisplaySubDocument : public nsDi
public:
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;