⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 292596 in webkit


Ignore:
Timestamp:
Apr 8, 2022, 2:59:15 AM (5 years ago)
Author:
commit-queue@webkit.org
Message:

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

Patch by Rob Buis <​rbuis@igalia.com> 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):

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r292592 r292596  
     12022-04-08  Rob Buis  <rbuis@igalia.com>
     2
     3        Take top layers into account in addLayers/removeLayers
     4        https://bugs.webkit.org/show_bug.cgi?id=238946
     5
     6        Reviewed by Simon Fraser.
     7
     8        Take top layers into account in addLayers/removeLayers, they
     9        should use the RenderView layer as parent (emulating layerParent).
     10
     11        * rendering/RenderElement.cpp:
     12        (WebCore::addLayers):
     13        (WebCore::RenderElement::addLayers):
     14        (WebCore::RenderElement::removeLayers):
     15        (WebCore::RenderElement::willBeRemovedFromTree):
     16        * rendering/RenderElement.h:
     17        * rendering/RenderLayer.cpp:
     18        (WebCore::RenderLayer::calculateClipRects const):
     19
    1202022-04-07  Antti Koivisto  <antti@apple.com>
    221
  • trunk/Source/WebCore/rendering/RenderElement.cpp

    r292525 r292596  
    640640}
    641641
    642 static void addLayers(const RenderElement& addedRenderer, RenderElement& currentRenderer, RenderLayer& parentLayer, std::optional<RenderLayer*>& beforeChild)
     642static void addLayers(const RenderElement& addedRenderer, RenderElement& currentRenderer, RenderLayer* parentLayer)
    643643{
    644644    if (currentRenderer.hasLayer()) {
    645         if (!beforeChild.has_value())
    646             beforeChild = layerNextSiblingRespectingTopLayer(addedRenderer, parentLayer);
    647 
    648         parentLayer.addChild(*downcast<RenderLayerModelObject>(currentRenderer).layer(), beforeChild.value());
     645        if (isInTopLayerOrBackdrop(currentRenderer.style(), currentRenderer.element()))
     646            parentLayer = addedRenderer.view().layer();
     647        RenderLayer* beforeChild = layerNextSiblingRespectingTopLayer(addedRenderer, *parentLayer);
     648        parentLayer->addChild(*downcast<RenderLayerModelObject>(currentRenderer).layer(), beforeChild);
    649649        return;
    650650    }
    651651
    652652    for (auto& child : childrenOfType<RenderElement>(currentRenderer))
    653         addLayers(addedRenderer, child, parentLayer, beforeChild);
     653        addLayers(addedRenderer, child, parentLayer);
    654654}
    655655
    … …  
    659659        return;
    660660
    661     std::optional<RenderLayer*> beforeChild;
    662     WebCore::addLayers(*this, *this, *parentLayer, beforeChild);
    663 }
    664 
    665 void RenderElement::removeLayers(RenderLayer* parentLayer)
    666 {
     661    WebCore::addLayers(*this, *this, parentLayer);
     662}
     663
     664void RenderElement::removeLayers()
     665{
     666    RenderLayer* parentLayer = layerParent();
    667667    if (!parentLayer)
    668668        return;
    … …  
    674674
    675675    for (auto& child : childrenOfType<RenderElement>(*this))
    676         child.removeLayers(parentLayer);
     676        child.removeLayers();
    677677}
    678678
    … …  
    966966    }
    967967    // Keep our layer hierarchy updated.
    968     if (firstChild() || hasLayer()) {
    969         auto* parentLayer = layerParent();
    970         removeLayers(parentLayer);
    971     }
     968    if (firstChild() || hasLayer())
     969        removeLayers();
    972970
    973971    if (isOutOfFlowPositioned() && parent()->childrenInline())
  • trunk/Source/WebCore/rendering/RenderElement.h

    r292525 r292596  
    112112    RenderLayer* layerNextSibling(RenderLayer& parentLayer) const;
    113113    void addLayers(RenderLayer* parentLayer);
    114     void removeLayers(RenderLayer* parentLayer);
     114    void removeLayers();
    115115    void moveLayers(RenderLayer* oldParent, RenderLayer& newParent);
    116116
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r292575 r292596  
    55735573void RenderLayer::removeReflection()
    55745574{
    5575     if (!m_reflection->renderTreeBeingDestroyed())
    5576         m_reflection->removeLayers(this);
     5575    if (!m_reflection->renderTreeBeingDestroyed()) {
     5576        if (auto* layer = m_reflection->layer())
     5577            removeChild(*layer);
     5578    }
    55775579
    55785580    m_reflection->setParent(nullptr);
Note: See TracChangeset for help on using the changeset viewer.