Bug 1539673 - Make sure we build layers for empty items, since they might contain hit test information. r=miko

Depends on D25169

Differential Revision: https://phabricator.services.mozilla.com/D25331

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Matt Woodrow 2019-04-01 16:54:51 +00:00
parent fed842fadd
commit b7d051a4cb
4 changed files with 5 additions and 67 deletions

View File

@ -33,7 +33,11 @@ waitUntilApzStable()
<div id="spacer" style="height: 2000px">
Inside the black border is a zero-opacity touch-action none.
<div id="border" style="border: solid 1px black">
<div id="target" style="opacity: 0; height: 300px; touch-action: none">this text shouldn't be visible</div>
<div style="opacity: 0; height: 300px;">
<div style="transform:translate(0px)">
<div id="target" style="height: 300px; touch-action: none">this text shouldn't be visible</div>
</div>
</div>
</div>
</div>
</body>

View File

@ -4618,15 +4618,6 @@ void ContainerState::ProcessDisplayItems(nsDisplayList* aList) {
item->Frame(), item->GetPerFrameKey());
InvalidateForLayerChange(item, nullptr, oldData);
// If the item would have its own layer but is invisible, just hide it.
// Note that items without their own layers can't be skipped this
// way, since their PaintedLayer may decide it wants to draw them
// into its buffer even if they're currently covered.
if (itemVisibleRect.IsEmpty() &&
!item->ShouldBuildLayerEvenIfInvisible(mBuilder)) {
continue;
}
// 3D-transformed layers don't necessarily draw in the order in which
// they're added to their parent container layer.
bool mayDrawOutOfOrder = itemType == DisplayItemType::TYPE_TRANSFORM &&

View File

@ -6473,13 +6473,6 @@ bool nsDisplayOwnLayer::IsZoomingLayer() const {
return GetType() == DisplayItemType::TYPE_ASYNC_ZOOM;
}
bool nsDisplayOwnLayer::ShouldBuildLayerEvenIfInvisible(
nsDisplayListBuilder* aBuilder) const {
// Render scroll thumb layers even if they are invisible, because async
// scrolling might bring them into view.
return IsScrollThumbLayer();
}
// nsDisplayOpacity uses layers for rendering
already_AddRefed<Layer> nsDisplayOwnLayer::BuildLayer(
nsDisplayListBuilder* aBuilder, LayerManager* aManager,
@ -6834,18 +6827,6 @@ bool nsDisplaySubDocument::ComputeVisibility(nsDisplayListBuilder* aBuilder,
return visible;
}
bool nsDisplaySubDocument::ShouldBuildLayerEvenIfInvisible(
nsDisplayListBuilder* aBuilder) const {
bool usingDisplayPort = UseDisplayPortForViewport(aBuilder, mFrame);
if ((mFlags & nsDisplayOwnLayerFlags::eGenerateScrollableLayer) &&
usingDisplayPort) {
return true;
}
return nsDisplayOwnLayer::ShouldBuildLayerEvenIfInvisible(aBuilder);
}
nsRegion nsDisplaySubDocument::GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
bool* aSnap) const {
bool usingDisplayPort = UseDisplayPortForViewport(aBuilder, mFrame);
@ -8150,14 +8131,6 @@ const Matrix4x4& nsDisplayTransform::GetAccumulatedPreserved3DTransform(
return *mTransformPreserves3D;
}
bool nsDisplayTransform::ShouldBuildLayerEvenIfInvisible(
nsDisplayListBuilder* aBuilder) const {
// The visible rect of a Preserves-3D frame is just an intermediate
// result. It should always build a layer to make sure it is
// rendering correctly.
return MayBeAnimated(aBuilder) || Combines3DTransformWithAncestors();
}
bool nsDisplayTransform::CreateWebRenderCommands(
mozilla::wr::DisplayListBuilder& aBuilder,
mozilla::wr::IpcResourceUpdateQueue& aResources,

View File

@ -2546,15 +2546,6 @@ class nsDisplayItem : public nsDisplayItemLink {
return mozilla::LAYER_NONE;
}
/**
* Return true to indicate the layer should be constructed even if it's
* completely invisible.
*/
virtual bool ShouldBuildLayerEvenIfInvisible(
nsDisplayListBuilder* aBuilder) const {
return false;
}
/**
* Returns true if this item supports PaintWithClip, where the clipping
* is used directly as the primitive geometry instead of needing an explicit
@ -5876,8 +5867,6 @@ class nsDisplayOwnLayer : public nsDisplayWrapList {
NS_DISPLAY_DECL_NAME("OwnLayer", TYPE_OWN_LAYER)
bool ShouldBuildLayerEvenIfInvisible(
nsDisplayListBuilder* aBuilder) const override;
already_AddRefed<Layer> BuildLayer(
nsDisplayListBuilder* aBuilder, LayerManager* aManager,
const ContainerLayerParameters& aContainerParameters) override;
@ -5981,9 +5970,6 @@ class nsDisplaySubDocument : public nsDisplayOwnLayer {
bool ComputeVisibility(nsDisplayListBuilder* aBuilder,
nsRegion* aVisibleRegion) override;
bool ShouldBuildLayerEvenIfInvisible(
nsDisplayListBuilder* aBuilder) const override;
bool ShouldFlattenAway(nsDisplayListBuilder* aBuilder) override {
return mShouldFlatten;
}
@ -6256,11 +6242,6 @@ class nsDisplayScrollInfoLayer : public nsDisplayWrapList {
nsDisplayListBuilder* aBuilder, LayerManager* aManager,
const ContainerLayerParameters& aContainerParameters) override;
bool ShouldBuildLayerEvenIfInvisible(
nsDisplayListBuilder* aBuilder) const override {
return true;
}
nsRegion GetOpaqueRegion(nsDisplayListBuilder* aBuilder,
bool* aSnap) const override {
*aSnap = false;
@ -6726,8 +6707,6 @@ class nsDisplayTransform : public nsDisplayHitTestInfoItem {
bool UpdateScrollData(
mozilla::layers::WebRenderScrollData* aData,
mozilla::layers::WebRenderLayerScrollData* aLayerData) override;
bool ShouldBuildLayerEvenIfInvisible(
nsDisplayListBuilder* aBuilder) const override;
bool ComputeVisibility(nsDisplayListBuilder* aBuilder,
nsRegion* aVisibleRegion) override;
@ -7053,15 +7032,6 @@ class nsDisplayPerspective : public nsDisplayHitTestInfoItem {
mozilla::layers::RenderRootStateManager* aManager,
nsDisplayListBuilder* aDisplayListBuilder) override;
bool ShouldBuildLayerEvenIfInvisible(
nsDisplayListBuilder* aBuilder) const override {
if (!mList.GetChildren()->GetTop()) {
return false;
}
return mList.GetChildren()->GetTop()->ShouldBuildLayerEvenIfInvisible(
aBuilder);
}
already_AddRefed<Layer> BuildLayer(
nsDisplayListBuilder* aBuilder, LayerManager* aManager,
const ContainerLayerParameters& aContainerParameters) override;