Modified: trunk/Source/WebCore/ChangeLog (292595 => 292596)
--- trunk/Source/WebCore/ChangeLog 2022-04-08 08:30:55 UTC (rev 292595)
+++ trunk/Source/WebCore/ChangeLog 2022-04-08 09:59:15 UTC (rev 292596)
@@ -1,3 +1,22 @@
+2022-04-08 Rob Buis <[email protected]>
+
+ Take top layers into account in addLayers/removeLayers
+ https://bugs.webkit.org/show_bug.cgi?id=238946
+
+ Reviewed by Simon Fraser.
+
+ Take top layers into account in addLayers/removeLayers, they
+ should use the RenderView layer as parent (emulating layerParent).
+
+ * rendering/RenderElement.cpp:
+ (WebCore::addLayers):
+ (WebCore::RenderElement::addLayers):
+ (WebCore::RenderElement::removeLayers):
+ (WebCore::RenderElement::willBeRemovedFromTree):
+ * rendering/RenderElement.h:
+ * rendering/RenderLayer.cpp:
+ (WebCore::RenderLayer::calculateClipRects const):
+
2022-04-07 Antti Koivisto <[email protected]>
[CSS Container Queries] Evaluate against shadow-including ancestors
Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (292595 => 292596)
--- trunk/Source/WebCore/rendering/RenderElement.cpp 2022-04-08 08:30:55 UTC (rev 292595)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp 2022-04-08 09:59:15 UTC (rev 292596)
@@ -639,18 +639,18 @@
return findNextLayer(*renderer.parent(), parentLayer, &renderer);
}
-static void addLayers(const RenderElement& addedRenderer, RenderElement& currentRenderer, RenderLayer& parentLayer, std::optional<RenderLayer*>& beforeChild)
+static void addLayers(const RenderElement& addedRenderer, RenderElement& currentRenderer, RenderLayer* parentLayer)
{
if (currentRenderer.hasLayer()) {
- if (!beforeChild.has_value())
- beforeChild = layerNextSiblingRespectingTopLayer(addedRenderer, parentLayer);
-
- parentLayer.addChild(*downcast<RenderLayerModelObject>(currentRenderer).layer(), beforeChild.value());
+ if (isInTopLayerOrBackdrop(currentRenderer.style(), currentRenderer.element()))
+ parentLayer = addedRenderer.view().layer();
+ RenderLayer* beforeChild = layerNextSiblingRespectingTopLayer(addedRenderer, *parentLayer);
+ parentLayer->addChild(*downcast<RenderLayerModelObject>(currentRenderer).layer(), beforeChild);
return;
}
for (auto& child : childrenOfType<RenderElement>(currentRenderer))
- addLayers(addedRenderer, child, parentLayer, beforeChild);
+ addLayers(addedRenderer, child, parentLayer);
}
void RenderElement::addLayers(RenderLayer* parentLayer)
@@ -658,12 +658,12 @@
if (!parentLayer)
return;
- std::optional<RenderLayer*> beforeChild;
- WebCore::addLayers(*this, *this, *parentLayer, beforeChild);
+ WebCore::addLayers(*this, *this, parentLayer);
}
-void RenderElement::removeLayers(RenderLayer* parentLayer)
+void RenderElement::removeLayers()
{
+ RenderLayer* parentLayer = layerParent();
if (!parentLayer)
return;
@@ -673,7 +673,7 @@
}
for (auto& child : childrenOfType<RenderElement>(*this))
- child.removeLayers(parentLayer);
+ child.removeLayers();
}
void RenderElement::moveLayers(RenderLayer* oldParent, RenderLayer& newParent)
@@ -965,10 +965,8 @@
enclosingLayer->dirtyVisibleContentStatus();
}
// Keep our layer hierarchy updated.
- if (firstChild() || hasLayer()) {
- auto* parentLayer = layerParent();
- removeLayers(parentLayer);
- }
+ if (firstChild() || hasLayer())
+ removeLayers();
if (isOutOfFlowPositioned() && parent()->childrenInline())
parent()->dirtyLinesFromChangedChild(*this);
Modified: trunk/Source/WebCore/rendering/RenderElement.h (292595 => 292596)
--- trunk/Source/WebCore/rendering/RenderElement.h 2022-04-08 08:30:55 UTC (rev 292595)
+++ trunk/Source/WebCore/rendering/RenderElement.h 2022-04-08 09:59:15 UTC (rev 292596)
@@ -111,7 +111,7 @@
RenderLayer* layerParent() const;
RenderLayer* layerNextSibling(RenderLayer& parentLayer) const;
void addLayers(RenderLayer* parentLayer);
- void removeLayers(RenderLayer* parentLayer);
+ void removeLayers();
void moveLayers(RenderLayer* oldParent, RenderLayer& newParent);
virtual void dirtyLinesFromChangedChild(RenderObject&) { }
Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (292595 => 292596)
--- trunk/Source/WebCore/rendering/RenderLayer.cpp 2022-04-08 08:30:55 UTC (rev 292595)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp 2022-04-08 09:59:15 UTC (rev 292596)
@@ -5572,8 +5572,10 @@
void RenderLayer::removeReflection()
{
- if (!m_reflection->renderTreeBeingDestroyed())
- m_reflection->removeLayers(this);
+ if (!m_reflection->renderTreeBeingDestroyed()) {
+ if (auto* layer = m_reflection->layer())
+ removeChild(*layer);
+ }
m_reflection->setParent(nullptr);
m_reflection = nullptr;