Title: [292596] trunk/Source/WebCore
Revision
292596
Author
[email protected]
Date
2022-04-08 02:59:15 -0700 (Fri, 08 Apr 2022)

Log Message

Take top layers into account in addLayers/removeLayers
https://bugs.webkit.org/show_bug.cgi?id=238946

Patch by Rob Buis <[email protected]> on 2022-04-08
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):

Modified Paths

Diff

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;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to