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

Changeset 294845 in webkit


Ignore:
Timestamp:
May 25, 2022, 4:49:59 PM (4 years ago)
Author:
Alan Coon
Message:

Cherry-pick r292596. rdar://problem/88862115

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):

Canonical link: ​https://commits.webkit.org/249429@main
git-svn-id: ​https://svn.webkit.org/repository/webkit/trunk@292596 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Location:
branches/safari-613-branch/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/safari-613-branch/Source/WebCore/ChangeLog

    r294844 r294845  
     12022-05-19  Alan Coon  <alancoon@apple.com>
     2
     3        Cherry-pick r292596. rdar://problem/88862115
     4
     5    Take top layers into account in addLayers/removeLayers
     6    https://bugs.webkit.org/show_bug.cgi?id=238946
     7   
     8    Patch by Rob Buis <rbuis@igalia.com> on 2022-04-08
     9    Reviewed by Simon Fraser.
     10   
     11    Take top layers into account in addLayers/removeLayers, they
     12    should use the RenderView layer as parent (emulating layerParent).
     13   
     14    * rendering/RenderElement.cpp:
     15    (WebCore::addLayers):
     16    (WebCore::RenderElement::addLayers):
     17    (WebCore::RenderElement::removeLayers):
     18    (WebCore::RenderElement::willBeRemovedFromTree):
     19    * rendering/RenderElement.h:
     20    * rendering/RenderLayer.cpp:
     21    (WebCore::RenderLayer::calculateClipRects const):
     22   
     23    Canonical link: https://commits.webkit.org/249429@main
     24    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@292596 268f45cc-cd09-0410-ab3c-d52691b4dbfc
     25
     26    2022-04-08  Rob Buis  <rbuis@igalia.com>
     27
     28            Take top layers into account in addLayers/removeLayers
     29            https://bugs.webkit.org/show_bug.cgi?id=238946
     30
     31            Reviewed by Simon Fraser.
     32
     33            Take top layers into account in addLayers/removeLayers, they
     34            should use the RenderView layer as parent (emulating layerParent).
     35
     36            * rendering/RenderElement.cpp:
     37            (WebCore::addLayers):
     38            (WebCore::RenderElement::addLayers):
     39            (WebCore::RenderElement::removeLayers):
     40            (WebCore::RenderElement::willBeRemovedFromTree):
     41            * rendering/RenderElement.h:
     42            * rendering/RenderLayer.cpp:
     43            (WebCore::RenderLayer::calculateClipRects const):
     44
    1452022-05-19  Alan Coon  <alancoon@apple.com>
    246
  • branches/safari-613-branch/Source/WebCore/rendering/RenderElement.cpp

    r293482 r294845  
    684684}
    685685
    686 static void addLayers(const RenderElement& addedRenderer, RenderElement& currentRenderer, RenderLayer& parentLayer, std::optional<RenderLayer*>& beforeChild)
     686static void addLayers(const RenderElement& addedRenderer, RenderElement& currentRenderer, RenderLayer* parentLayer)
    687687{
    688688    if (currentRenderer.hasLayer()) {
    689         if (!beforeChild.has_value())
    690             beforeChild = layerNextSiblingRespectingTopLayer(addedRenderer, parentLayer);
    691 
    692         parentLayer.addChild(*downcast<RenderLayerModelObject>(currentRenderer).layer(), beforeChild.value());
     689        if (isInTopLayerOrBackdrop(currentRenderer.style(), currentRenderer.element()))
     690            parentLayer = addedRenderer.view().layer();
     691        RenderLayer* beforeChild = layerNextSiblingRespectingTopLayer(addedRenderer, *parentLayer);
     692        parentLayer->addChild(*downcast<RenderLayerModelObject>(currentRenderer).layer(), beforeChild);
    693693        return;
    694694    }
    695695
    696696    for (auto& child : childrenOfType<RenderElement>(currentRenderer))
    697         addLayers(addedRenderer, child, parentLayer, beforeChild);
     697        addLayers(addedRenderer, child, parentLayer);
    698698}
    699699
    … …  
    703703        return;
    704704
    705     std::optional<RenderLayer*> beforeChild;
    706     WebCore::addLayers(*this, *this, *parentLayer, beforeChild);
    707 }
    708 
    709 void RenderElement::removeLayers(RenderLayer* parentLayer)
    710 {
     705    WebCore::addLayers(*this, *this, parentLayer);
     706}
     707
     708void RenderElement::removeLayers()
     709{
     710    RenderLayer* parentLayer = layerParent();
    711711    if (!parentLayer)
    712712        return;
    … …  
    718718
    719719    for (auto& child : childrenOfType<RenderElement>(*this))
    720         child.removeLayers(parentLayer);
     720        child.removeLayers();
    721721}
    722722
    … …  
    10231023    }
    10241024    // Keep our layer hierarchy updated.
    1025     if (firstChild() || hasLayer()) {
    1026         auto* parentLayer = layerParent();
    1027         removeLayers(parentLayer);
    1028     }
     1025    if (firstChild() || hasLayer())
     1026        removeLayers();
    10291027
    10301028    if (isOutOfFlowPositioned() && parent()->childrenInline())
  • branches/safari-613-branch/Source/WebCore/rendering/RenderElement.h

    r293482 r294845  
    111111    RenderLayer* layerNextSibling(RenderLayer& parentLayer) const;
    112112    void addLayers(RenderLayer* parentLayer);
    113     void removeLayers(RenderLayer* parentLayer);
    114     void moveLayers(RenderLayer& newParent);
     113    void removeLayers();
    115114
    116115    virtual void dirtyLinesFromChangedChild(RenderObject&) { }
  • branches/safari-613-branch/Source/WebCore/rendering/RenderLayer.cpp

    r293482 r294845  
    54425442void RenderLayer::removeReflection()
    54435443{
    5444     if (!m_reflection->renderTreeBeingDestroyed())
    5445         m_reflection->removeLayers(this);
     5444    if (!m_reflection->renderTreeBeingDestroyed()) {
     5445        if (auto* layer = m_reflection->layer())
     5446            removeChild(*layer);
     5447    }
    54465448
    54475449    m_reflection->setParent(nullptr);
Note: See TracChangeset for help on using the changeset viewer.