Title: [172656] trunk
Revision
172656
Author
za...@apple.com
Date
2014-08-15 15:43:50 -0700 (Fri, 15 Aug 2014)

Log Message

REGRESSION: Parts of the route/route options windows are invisible at maps.google.com
https://bugs.webkit.org/show_bug.cgi?id=135977
<rdar://problem/17961698>

Reviewed by Andreas Kling.

When the style change requires both layout and repaint, the style diff is set to
'layout is needed' (and masks the repaint change) as normally layout is followed by a repaint.
However, in compositing context, layout may not be followed by repaint, so when the style diff
indicates layout, we need to figure out whether it implies repaint too.
This logic should eventually be moved from RenderElement to RenderLayerModelObject/RenderLayer.
-tracked here: webkit.org/b/135990

Source/WebCore:

Test: compositing/cliprect-and-position-change-on-compositing-layer.html

* rendering/RenderElement.cpp:
(WebCore::RenderElement::setNeedsPositionedMovementLayout):
* rendering/style/RenderStyle.cpp:
(WebCore::RenderStyle::changeRequiresLayerRepaint):
(WebCore::RenderStyle::diffRequiresLayerRepaint):
(WebCore::RenderStyle::diffRequiresRepaint): Deleted.
* rendering/style/RenderStyle.h:
* rendering/style/RenderStyleConstants.h:

LayoutTests:

* compositing/cliprect-and-position-change-on-compositing-layer-expected.html: Added.
* compositing/cliprect-and-position-change-on-compositing-layer.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (172655 => 172656)


--- trunk/LayoutTests/ChangeLog	2014-08-15 22:40:33 UTC (rev 172655)
+++ trunk/LayoutTests/ChangeLog	2014-08-15 22:43:50 UTC (rev 172656)
@@ -1,3 +1,21 @@
+2014-08-15  Zalan Bujtas  <za...@apple.com>
+
+        REGRESSION: Parts of the route/route options windows are invisible at maps.google.com
+        https://bugs.webkit.org/show_bug.cgi?id=135977
+        <rdar://problem/17961698>
+
+        Reviewed by Andreas Kling.
+
+        When the style change requires both layout and repaint, the style diff is set to
+        'layout is needed' (and masks the repaint change) as normally layout is followed by a repaint.
+        However, in compositing context, layout may not be followed by repaint, so when the style diff
+        indicates layout, we need to figure out whether it implies repaint too.
+        This logic should eventually be moved from RenderElement to RenderLayerModelObject/RenderLayer.
+        -tracked here: webkit.org/b/135990
+
+        * compositing/cliprect-and-position-change-on-compositing-layer-expected.html: Added.
+        * compositing/cliprect-and-position-change-on-compositing-layer.html: Added.
+
 2014-08-15  Dirk Schulze  <k...@webkit.org>
 
         Turn r/rx/ry to presentation attributes

Added: trunk/LayoutTests/compositing/cliprect-and-position-change-on-compositing-layer-expected.html (0 => 172656)


--- trunk/LayoutTests/compositing/cliprect-and-position-change-on-compositing-layer-expected.html	                        (rev 0)
+++ trunk/LayoutTests/compositing/cliprect-and-position-change-on-compositing-layer-expected.html	2014-08-15 22:43:50 UTC (rev 172656)
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>This test that compositing layers get repainted properly when cliprect is applied with position change.</title>
+<style>
+  #foo {
+    position: absolute;
+    top: 1px;
+    left: 0px;
+    width: 100px;
+    height: 100px;
+    background-color: green;
+    -webkit-transform: translateZ(0);
+}
+</style>
+</head> 
+<body>     
+<div id=foo></div>      
+</body>
+</html>

Added: trunk/LayoutTests/compositing/cliprect-and-position-change-on-compositing-layer.html (0 => 172656)


--- trunk/LayoutTests/compositing/cliprect-and-position-change-on-compositing-layer.html	                        (rev 0)
+++ trunk/LayoutTests/compositing/cliprect-and-position-change-on-compositing-layer.html	2014-08-15 22:43:50 UTC (rev 172656)
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>This test that compositing layers get repainted properly when cliprect is applied with position change.</title>
+<style>
+  #foo {
+    position: absolute;
+    top: 0px;
+    left: 0px;
+    width: 100px;
+    height: 100px;
+    background-color: green;
+    clip: rect(70px, 102px, 102px, -1px);
+    -webkit-transform: translateZ(0);
+}
+</style>
+</head> 
+<body>     
+<div id=foo></div>      
+<script>
+  if (window.testRunner)
+    testRunner.waitUntilDone();
+
+  setTimeout(function() { 
+    var box = document.getElementById("foo");
+    box.style.clip = "rect(0px, 102px, 202px, 0px)";
+    box.style.top = "1px";
+    box.offsetHeight;
+    
+  if (window.testRunner)
+    testRunner.notifyDone();
+  }, 0);
+</script>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (172655 => 172656)


--- trunk/Source/WebCore/ChangeLog	2014-08-15 22:40:33 UTC (rev 172655)
+++ trunk/Source/WebCore/ChangeLog	2014-08-15 22:43:50 UTC (rev 172656)
@@ -1,3 +1,29 @@
+2014-08-15  Zalan Bujtas  <za...@apple.com>
+
+        REGRESSION: Parts of the route/route options windows are invisible at maps.google.com
+        https://bugs.webkit.org/show_bug.cgi?id=135977
+        <rdar://problem/17961698>
+
+        Reviewed by Andreas Kling.
+
+        When the style change requires both layout and repaint, the style diff is set to
+        'layout is needed' (and masks the repaint change) as normally layout is followed by a repaint.
+        However, in compositing context, layout may not be followed by repaint, so when the style diff
+        indicates layout, we need to figure out whether it implies repaint too.
+        This logic should eventually be moved from RenderElement to RenderLayerModelObject/RenderLayer.
+        -tracked here: webkit.org/b/135990
+
+        Test: compositing/cliprect-and-position-change-on-compositing-layer.html
+
+        * rendering/RenderElement.cpp:
+        (WebCore::RenderElement::setNeedsPositionedMovementLayout):
+        * rendering/style/RenderStyle.cpp:
+        (WebCore::RenderStyle::changeRequiresLayerRepaint):
+        (WebCore::RenderStyle::diffRequiresLayerRepaint):
+        (WebCore::RenderStyle::diffRequiresRepaint): Deleted.
+        * rendering/style/RenderStyle.h:
+        * rendering/style/RenderStyleConstants.h:
+
 2014-08-15  Brian J. Burg  <b...@cs.washington.edu>
 
         Web Inspector: rewrite CodeGeneratorInspector to be modular and testable

Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (172655 => 172656)


--- trunk/Source/WebCore/rendering/RenderElement.cpp	2014-08-15 22:40:33 UTC (rev 172655)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp	2014-08-15 22:43:50 UTC (rev 172656)
@@ -1028,7 +1028,7 @@
     setNeedsPositionedMovementLayoutBit(true);
     markContainingBlocksForLayout();
     if (hasLayer()) {
-        if (oldStyle && style().diffRequiresRepaint(oldStyle))
+        if (oldStyle && style().diffRequiresLayerRepaint(*oldStyle, toRenderLayerModelObject(this)->layer()->isComposited()))
             setLayerNeedsFullRepaint();
         else
             setLayerNeedsFullRepaintForPositionedMovementLayout();

Modified: trunk/Source/WebCore/rendering/style/RenderStyle.cpp (172655 => 172656)


--- trunk/Source/WebCore/rendering/style/RenderStyle.cpp	2014-08-15 22:40:33 UTC (rev 172655)
+++ trunk/Source/WebCore/rendering/style/RenderStyle.cpp	2014-08-15 22:43:50 UTC (rev 172656)
@@ -679,9 +679,10 @@
         return true;
 
     if (position() != StaticPosition) {
-        if (visual->clip != other->visual->clip
-            || visual->hasClip != other->visual->hasClip)
+        if (visual->clip != other->visual->clip || visual->hasClip != other->visual->hasClip) {
+            changedContextSensitiveProperties |= ContextSensitivePropertyClipRect;
             return true;
+        }
     }
 
 #if ENABLE(CSS_COMPOSITING)
@@ -810,10 +811,17 @@
     return StyleDifferenceEqual;
 }
 
-bool RenderStyle::diffRequiresRepaint(const RenderStyle* style) const
+bool RenderStyle::diffRequiresLayerRepaint(const RenderStyle& style, bool isComposited) const
 {
     unsigned changedContextSensitiveProperties = 0;
-    return changeRequiresRepaint(style, changedContextSensitiveProperties);
+
+    if (changeRequiresRepaint(&style, changedContextSensitiveProperties))
+        return true;
+
+    if (isComposited && changeRequiresLayerRepaint(&style, changedContextSensitiveProperties))
+        return changedContextSensitiveProperties & ContextSensitivePropertyClipRect;
+
+    return false;
 }
 
 void RenderStyle::setClip(Length top, Length right, Length bottom, Length left)

Modified: trunk/Source/WebCore/rendering/style/RenderStyle.h (172655 => 172656)


--- trunk/Source/WebCore/rendering/style/RenderStyle.h	2014-08-15 22:40:33 UTC (rev 172655)
+++ trunk/Source/WebCore/rendering/style/RenderStyle.h	2014-08-15 22:43:50 UTC (rev 172656)
@@ -1757,7 +1757,7 @@
 #endif
 
     StyleDifference diff(const RenderStyle*, unsigned& changedContextSensitiveProperties) const;
-    bool diffRequiresRepaint(const RenderStyle*) const;
+    bool diffRequiresLayerRepaint(const RenderStyle&, bool isComposited) const;
 
     bool isDisplayReplacedType() const { return isDisplayReplacedType(display()); }
     bool isDisplayInlineType() const { return isDisplayInlineType(display()); }

Modified: trunk/Source/WebCore/rendering/style/RenderStyleConstants.h (172655 => 172656)


--- trunk/Source/WebCore/rendering/style/RenderStyleConstants.h	2014-08-15 22:40:33 UTC (rev 172655)
+++ trunk/Source/WebCore/rendering/style/RenderStyleConstants.h	2014-08-15 22:43:50 UTC (rev 172656)
@@ -64,7 +64,8 @@
     ContextSensitivePropertyNone = 0,
     ContextSensitivePropertyTransform = (1 << 0),
     ContextSensitivePropertyOpacity = (1 << 1),
-    ContextSensitivePropertyFilter = (1 << 2)
+    ContextSensitivePropertyFilter = (1 << 2),
+    ContextSensitivePropertyClipRect = (1 << 3)
 };
 
 // Static pseudo styles. Dynamic ones are produced on the fly.
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to