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,