Title: [218925] trunk
Revision
218925
Author
[email protected]
Date
2017-06-29 09:10:10 -0700 (Thu, 29 Jun 2017)

Log Message

Source/WebCore:
REGRESSION(r215347): NAS4Free Pop-down menus fail to appear
https://bugs.webkit.org/show_bug.cgi?id=173967
<rdar://problem/32690114>

Reviewed by Andreas Kling.

Menus on this configuration page operate by mutating visibility. We fail to trigger required
compositing updates when visibility changes on non-composited layer. Visibility of a non-composited
descendant may affect geometry of the composited ancestor layer.

Test: compositing/backing/non-composited-visibility-change.html

* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::layerStyleChanged):
(WebCore::RenderLayerCompositor::needsCompositingUpdateForStyleChangeOnNonCompositedLayer): Added.

    Trigger compositing update for non-composited layers on visibility change.
    Factor tests into function.

* rendering/RenderLayerCompositor.h:

LayoutTests:
NAS4Free Pop-down menus take 3 seconds to appear
https://bugs.webkit.org/show_bug.cgi?id=173967
<rdar://problem/32690114>

Reviewed by Andreas Kling.

* compositing/backing/non-composited-visibility-change-expected.html: Added.
* compositing/backing/non-composited-visibility-change.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (218924 => 218925)


--- trunk/LayoutTests/ChangeLog	2017-06-29 16:09:36 UTC (rev 218924)
+++ trunk/LayoutTests/ChangeLog	2017-06-29 16:10:10 UTC (rev 218925)
@@ -1,3 +1,14 @@
+2017-06-29  Antti Koivisto  <[email protected]>
+
+        NAS4Free Pop-down menus take 3 seconds to appear
+        https://bugs.webkit.org/show_bug.cgi?id=173967
+        <rdar://problem/32690114>
+
+        Reviewed by Andreas Kling.
+
+        * compositing/backing/non-composited-visibility-change-expected.html: Added.
+        * compositing/backing/non-composited-visibility-change.html: Added.
+
 2017-06-28  Per Arne Vollan  <[email protected]>
 
         [Win] Update expectations for layout tests.

Added: trunk/LayoutTests/compositing/backing/non-composited-visibility-change-expected.html (0 => 218925)


--- trunk/LayoutTests/compositing/backing/non-composited-visibility-change-expected.html	                        (rev 0)
+++ trunk/LayoutTests/compositing/backing/non-composited-visibility-change-expected.html	2017-06-29 16:10:10 UTC (rev 218925)
@@ -0,0 +1,18 @@
+<style>
+#headernavbar {
+    position: fixed;
+}
+#system {
+    position: absolute;
+}
+</style>
+</head>
+<body>
+<div id="headernavbar">
+<div>
+<div>There should be text below</div>
+<div id="system">
+This should be visible
+</div>
+</div>
+</div>

Added: trunk/LayoutTests/compositing/backing/non-composited-visibility-change.html (0 => 218925)


--- trunk/LayoutTests/compositing/backing/non-composited-visibility-change.html	                        (rev 0)
+++ trunk/LayoutTests/compositing/backing/non-composited-visibility-change.html	2017-06-29 16:10:10 UTC (rev 218925)
@@ -0,0 +1,23 @@
+<style>
+#headernavbar {
+    position: fixed;
+}
+#system {
+    position: absolute;
+    visibility: hidden;
+}
+</style>
+</head>
+<body>
+<div id="headernavbar">
+<div>
+<div>There should be text below</div>
+<div id="system">
+This should be visible
+</div>
+</div>
+</div>
+<script>
+document.body.offsetWidth;
+system.style.visibility='visible';
+</script>

Modified: trunk/Source/WebCore/ChangeLog (218924 => 218925)


--- trunk/Source/WebCore/ChangeLog	2017-06-29 16:09:36 UTC (rev 218924)
+++ trunk/Source/WebCore/ChangeLog	2017-06-29 16:10:10 UTC (rev 218925)
@@ -1,3 +1,26 @@
+2017-06-29  Antti Koivisto  <[email protected]>
+
+        REGRESSION(r215347): NAS4Free Pop-down menus fail to appear
+        https://bugs.webkit.org/show_bug.cgi?id=173967
+        <rdar://problem/32690114>
+
+        Reviewed by Andreas Kling.
+
+        Menus on this configuration page operate by mutating visibility. We fail to trigger required
+        compositing updates when visibility changes on non-composited layer. Visibility of a non-composited
+        descendant may affect geometry of the composited ancestor layer.
+
+        Test: compositing/backing/non-composited-visibility-change.html
+
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::layerStyleChanged):
+        (WebCore::RenderLayerCompositor::needsCompositingUpdateForStyleChangeOnNonCompositedLayer): Added.
+
+            Trigger compositing update for non-composited layers on visibility change.
+            Factor tests into function.
+
+        * rendering/RenderLayerCompositor.h:
+
 2017-06-28  Frederic Wang  <[email protected]>
 
         Align Document::canNavigate on the HTM5 specification

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (218924 => 218925)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2017-06-29 16:09:36 UTC (rev 218924)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2017-06-29 16:10:10 UTC (rev 218925)
@@ -948,16 +948,29 @@
         return;
     }
 
-    // We don't have any direct reasons for this style change to affect layer composition. Test if it might affect things indirectly.
-    if (oldStyle && styleChangeMayAffectIndirectCompositingReasons(layer.renderer(), *oldStyle)) {
+    if (needsCompositingUpdateForStyleChangeOnNonCompositedLayer(layer, oldStyle))
         m_layerNeedsCompositingUpdate = true;
-        return;
-    }
+}
 
-    if (layer.isRootLayer()) {
-        // Needed for scroll bars.
-        m_layerNeedsCompositingUpdate = true;
-    }
+bool RenderLayerCompositor::needsCompositingUpdateForStyleChangeOnNonCompositedLayer(RenderLayer& layer, const RenderStyle* oldStyle) const
+{
+    // Needed for scroll bars.
+    if (layer.isRootLayer())
+        return true;
+
+    if (!oldStyle)
+        return false;
+
+    const RenderStyle& newStyle = layer.renderer().style();
+    // Visibility change may affect geometry of the enclosing composited layer.
+    if (oldStyle->visibility() != newStyle.visibility())
+        return true;
+
+    // We don't have any direct reasons for this style change to affect layer composition. Test if it might affect things indirectly.
+    if (styleChangeMayAffectIndirectCompositingReasons(layer.renderer(), *oldStyle))
+        return true;
+
+    return false;
 }
 
 bool RenderLayerCompositor::canCompositeClipPath(const RenderLayer& layer)

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (218924 => 218925)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h	2017-06-29 16:09:36 UTC (rev 218924)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h	2017-06-29 16:10:10 UTC (rev 218925)
@@ -345,6 +345,7 @@
     bool requiresCompositingLayer(const RenderLayer&, RenderLayer::ViewportConstrainedNotCompositedReason* = nullptr) const;
     // Whether the layer could ever be composited.
     bool canBeComposited(const RenderLayer&) const;
+    bool needsCompositingUpdateForStyleChangeOnNonCompositedLayer(RenderLayer&, const RenderStyle* oldStyle) const;
 
     // Make or destroy the backing for this layer; returns true if backing changed.
     enum class BackingRequired { No, Yes, Unknown };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to