Title: [281296] trunk
Revision
281296
Author
n...@apple.com
Date
2021-08-19 23:20:46 -0700 (Thu, 19 Aug 2021)

Log Message

Implement top layer rendering bits
https://bugs.webkit.org/show_bug.cgi?id=84796

Reviewed by Simon Fraser.

Enabled relevant WPTs. Some WPTs need extra layout work.

Source/WebCore:

* dom/Document.cpp:
(WebCore::Document::addToTopLayer):
(WebCore::Document::removeFromTopLayer):
* dom/Element.cpp:
(WebCore::Element::isInTopLayerWillChange):
(WebCore::Element::isInTopLayerDidChange):
* dom/Element.h:
* rendering/RenderLayer.cpp:
(WebCore::canCreateStackingContext):
(WebCore::RenderLayer::stackingContext const):
(WebCore::RenderLayer::rebuildZOrderLists):
(WebCore::RenderLayer::collectLayers):
(WebCore::RenderLayer::enclosingAncestorForPosition const):
(WebCore::RenderLayer::establishesTopLayer const):
(WebCore::RenderLayer::establishesTopLayerWillChange):
(WebCore::RenderLayer::establishesTopLayerDidChange):
* rendering/RenderLayer.h:

LayoutTests:

* TestExpectations:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (281295 => 281296)


--- trunk/LayoutTests/ChangeLog	2021-08-20 05:15:47 UTC (rev 281295)
+++ trunk/LayoutTests/ChangeLog	2021-08-20 06:20:46 UTC (rev 281296)
@@ -1,3 +1,14 @@
+2021-08-19  Tim Nguyen  <n...@apple.com>
+
+        Implement top layer rendering bits
+        https://bugs.webkit.org/show_bug.cgi?id=84796
+
+        Reviewed by Simon Fraser.
+
+        Enabled relevant WPTs. Some WPTs need extra layout work.
+
+        * TestExpectations:
+
 2021-08-19  Myles C. Maxfield  <mmaxfi...@apple.com>
 
         [Cocoa] Stop honoring any dot-prefixed font names

Modified: trunk/LayoutTests/TestExpectations (281295 => 281296)


--- trunk/LayoutTests/TestExpectations	2021-08-20 05:15:47 UTC (rev 281295)
+++ trunk/LayoutTests/TestExpectations	2021-08-20 06:20:46 UTC (rev 281296)
@@ -2374,14 +2374,10 @@
 fast/multicol/multicol-with-child-renderLayer-for-input.html [ ImageOnlyFailure ]
 
 # Top layer tests
-webkit.org/b/84796 imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/backdrop-stacking-order.html [ ImageOnlyFailure ]
 webkit.org/b/84796 imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/modal-dialog-in-replaced-renderer.html [ ImageOnlyFailure ]
 webkit.org/b/84796 imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/modal-dialog-in-table-column.html [ ImageOnlyFailure ]
 webkit.org/b/84796 imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/removed-element-is-removed-from-top-layer.html [ ImageOnlyFailure ]
 webkit.org/b/84796 imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/top-layer-containing-block.html [ ImageOnlyFailure ]
-webkit.org/b/84796 imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/top-layer-nesting.html [ ImageOnlyFailure ]
-webkit.org/b/84796 imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking-correct-order-remove-readd.html [ ImageOnlyFailure ]
-webkit.org/b/84796 imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking-dynamic.html [ ImageOnlyFailure ]
 webkit.org/b/84796 imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.html [ ImageOnlyFailure ]
 
 # inert subtrees

Modified: trunk/Source/WebCore/ChangeLog (281295 => 281296)


--- trunk/Source/WebCore/ChangeLog	2021-08-20 05:15:47 UTC (rev 281295)
+++ trunk/Source/WebCore/ChangeLog	2021-08-20 06:20:46 UTC (rev 281296)
@@ -1,3 +1,30 @@
+2021-08-19  Tim Nguyen  <n...@apple.com>
+
+        Implement top layer rendering bits
+        https://bugs.webkit.org/show_bug.cgi?id=84796
+
+        Reviewed by Simon Fraser.
+
+        Enabled relevant WPTs. Some WPTs need extra layout work.
+
+        * dom/Document.cpp:
+        (WebCore::Document::addToTopLayer):
+        (WebCore::Document::removeFromTopLayer):
+        * dom/Element.cpp:
+        (WebCore::Element::isInTopLayerWillChange):
+        (WebCore::Element::isInTopLayerDidChange):
+        * dom/Element.h:
+        * rendering/RenderLayer.cpp:
+        (WebCore::canCreateStackingContext):
+        (WebCore::RenderLayer::stackingContext const):
+        (WebCore::RenderLayer::rebuildZOrderLists):
+        (WebCore::RenderLayer::collectLayers):
+        (WebCore::RenderLayer::enclosingAncestorForPosition const):
+        (WebCore::RenderLayer::establishesTopLayer const):
+        (WebCore::RenderLayer::establishesTopLayerWillChange):
+        (WebCore::RenderLayer::establishesTopLayerDidChange):
+        * rendering/RenderLayer.h:
+
 2021-08-19  Antti Koivisto  <an...@apple.com>
 
         [:has() pseudo-class] Basic support

Modified: trunk/Source/WebCore/dom/Document.cpp (281295 => 281296)


--- trunk/Source/WebCore/dom/Document.cpp	2021-08-20 05:15:47 UTC (rev 281295)
+++ trunk/Source/WebCore/dom/Document.cpp	2021-08-20 06:20:46 UTC (rev 281296)
@@ -8469,18 +8469,22 @@
 
 void Document::addToTopLayer(Element& element)
 {
+    element.isInTopLayerWillChange();
+
     // To add an element to a top layer, remove it from top layer and then append it to top layer.
     m_topLayerElements.appendOrMoveToLast(element);
 
-    element.invalidateStyle();
+    element.isInTopLayerDidChange();
 }
 
 void Document::removeFromTopLayer(Element& element)
 {
+    element.isInTopLayerWillChange();
+
     if (!m_topLayerElements.remove(element))
         return;
 
-    element.invalidateStyle();
+    element.isInTopLayerDidChange();
 }
 
 HTMLDialogElement* Document::activeModalDialog() const

Modified: trunk/Source/WebCore/dom/Element.cpp (281295 => 281296)


--- trunk/Source/WebCore/dom/Element.cpp	2021-08-20 05:15:47 UTC (rev 281295)
+++ trunk/Source/WebCore/dom/Element.cpp	2021-08-20 06:20:46 UTC (rev 281296)
@@ -3358,6 +3358,24 @@
         child.ancestorWillEnterFullscreen();
 }
 
+void Element::isInTopLayerWillChange()
+{
+    if (renderer()) {
+        if (renderer()->hasLayer())
+            downcast<RenderLayerModelObject>(*renderer()).layer()->establishesTopLayerWillChange();
+    }
+}
+
+void Element::isInTopLayerDidChange()
+{
+    invalidateStyle();
+
+    if (renderer()) {
+        if (renderer()->hasLayer())
+            downcast<RenderLayerModelObject>(*renderer()).layer()->establishesTopLayerDidChange();
+    }
+}
+
 static PseudoElement* beforeOrAfterPseudoElement(const Element& host, PseudoId pseudoElementSpecifier)
 {
     switch (pseudoElementSpecifier) {

Modified: trunk/Source/WebCore/dom/Element.h (281295 => 281296)


--- trunk/Source/WebCore/dom/Element.h	2021-08-20 05:15:47 UTC (rev 281295)
+++ trunk/Source/WebCore/dom/Element.h	2021-08-20 06:20:46 UTC (rev 281296)
@@ -512,6 +512,8 @@
     void setLastStyleChangeEventStyle(PseudoId, std::unique_ptr<const RenderStyle>&&);
 
     bool isInTopLayer() const { return document().topLayerElements().contains(makeRef(*const_cast<Element*>(this))); }
+    void isInTopLayerWillChange();
+    void isInTopLayerDidChange();
 
 #if ENABLE(FULLSCREEN_API)
     bool containsFullScreenElement() const { return hasNodeFlag(NodeFlag::ContainsFullScreenElement); }

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (281295 => 281296)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2021-08-20 05:15:47 UTC (rev 281295)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2021-08-20 06:20:46 UTC (rev 281296)
@@ -555,7 +555,8 @@
         || renderer.hasReflection()
         || renderer.style().hasIsolation()
         || !renderer.style().hasAutoUsedZIndex()
-        || (renderer.style().willChange() && renderer.style().willChange()->canCreateStackingContext());
+        || (renderer.style().willChange() && renderer.style().willChange()->canCreateStackingContext())
+        || layer.establishesTopLayer();
 }
 
 static void expandScrollRectToVisibleTargetRectToIncludeScrollPadding(RenderBox* renderBox, const LayoutRect& viewRect, LayoutRect& targetRect)
@@ -647,6 +648,9 @@
 
 RenderLayer* RenderLayer::stackingContext() const
 {
+    if (establishesTopLayer())
+        return renderer().view().layer();
+
     auto* layer = parent();
     while (layer && !layer->isStackingContext())
         layer = layer->parent();
@@ -763,6 +767,24 @@
         std::stable_sort(negZOrderList->begin(), negZOrderList->end(), compareZIndex);
         negZOrderList->shrinkToFit();
     }
+
+    if (isRenderViewLayer()) {
+        auto topLayerElements = renderer().document().topLayerElements();
+        for (auto& element : topLayerElements) {
+            RenderElement* renderer = element->renderer();
+            if (!renderer)
+                continue;
+            auto backdropRenderer = renderer->backdropRenderer();
+            if (backdropRenderer && backdropRenderer->hasLayer()) {
+                RenderLayer* layer = backdropRenderer->layer();
+                posZOrderList->append(layer);
+            }
+            if (renderer->hasLayer()) {
+                RenderLayer* layer = downcast<RenderLayerModelObject>(*renderer).layer();
+                posZOrderList->append(layer);
+            }
+        }
+    }
 }
 
 void RenderLayer::collectLayers(bool includeHiddenLayers, std::unique_ptr<Vector<RenderLayer*>>& positiveZOrderList, std::unique_ptr<Vector<RenderLayer*>>& negativeZOrderList, OptionSet<Compositing>& accumulatedDirtyFlags)
@@ -769,6 +791,9 @@
 {
     updateDescendantDependentFlags();
 
+    if (establishesTopLayer())
+        return;
+
     bool isStacking = isStackingContext();
     // Overflow layers are just painted by their enclosing layers, so they don't get put in zorder lists.
     bool includeHiddenLayer = includeHiddenLayers || (m_hasVisibleContent || (m_hasVisibleDescendant && isStacking));
@@ -1776,6 +1801,9 @@
 
 RenderLayer* RenderLayer::enclosingAncestorForPosition(PositionType position) const
 {
+    if (establishesTopLayer())
+        return renderer().view().layer();
+
     RenderLayer* curr = parent();
     while (curr && !isContainerForPositioned(*curr, position))
         curr = curr->parent();
@@ -3942,6 +3970,26 @@
     return nullptr;
 }
 
+bool RenderLayer::establishesTopLayer() const
+{
+    if (!renderer().element())
+        return renderer().style().styleType() == PseudoId::Backdrop;
+
+    return renderer().element()->isInTopLayer();
+}
+
+void RenderLayer::establishesTopLayerWillChange()
+{
+    dirtyStackingContextZOrderLists();
+}
+
+void RenderLayer::establishesTopLayerDidChange()
+{
+    dirtyStackingContextZOrderLists();
+    if (isStackingContext())
+        dirtyZOrderLists();
+}
+
 RenderLayer* RenderLayer::enclosingFragmentedFlowAncestor() const
 {
     RenderLayer* curr = parent();

Modified: trunk/Source/WebCore/rendering/RenderLayer.h (281295 => 281296)


--- trunk/Source/WebCore/rendering/RenderLayer.h	2021-08-20 05:15:47 UTC (rev 281295)
+++ trunk/Source/WebCore/rendering/RenderLayer.h	2021-08-20 06:20:46 UTC (rev 281296)
@@ -816,6 +816,10 @@
 
     Element* enclosingElement() const;
 
+    bool establishesTopLayer() const;
+    void establishesTopLayerWillChange();
+    void establishesTopLayerDidChange();
+
     enum ViewportConstrainedNotCompositedReason {
         NoNotCompositedReason,
         NotCompositedForBoundsOutOfView,
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to