Title: [133628] trunk
Revision
133628
Author
[email protected]
Date
2012-11-06 09:57:08 -0800 (Tue, 06 Nov 2012)

Log Message

Fix RenderGeometryMap assertion when layers are scrolled during layout
https://bugs.webkit.org/show_bug.cgi?id=101292

Reviewed by Beth Dakin.

Source/WebCore:

When we set RenderLayer scroll positions as part of layout, we don't want
to update compositing layers right away. Updating compositing layers
requires that the entire layer tree has been updated from renderers,
so that the geometry of all RenderLayers can be trusted. When this state
was violated, RenderGeometryMap asserts.

Fix by bailing from updateCompositingLayersAfterScroll() if FrameView
tells us that we're doing layout. A full update of the compositing layers
will happen later anyway.

Test: compositing/geometry/geometry-map-scroll-during-layout-assertion.html

* rendering/RenderLayer.cpp:
(WebCore::frameViewFromLayer):
(WebCore::RenderLayer::updateCompositingLayersAfterScroll):

LayoutTests:

Test that hit the assertion before the fix.

* compositing/geometry/geometry-map-scroll-during-layout-assertion-expected.txt: Added.
* compositing/geometry/geometry-map-scroll-during-layout-assertion.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (133627 => 133628)


--- trunk/LayoutTests/ChangeLog	2012-11-06 17:54:42 UTC (rev 133627)
+++ trunk/LayoutTests/ChangeLog	2012-11-06 17:57:08 UTC (rev 133628)
@@ -1,3 +1,15 @@
+2012-11-05  Simon Fraser  <[email protected]>
+
+        Fix RenderGeometryMap assertion when layers are scrolled during layout
+        https://bugs.webkit.org/show_bug.cgi?id=101292
+
+        Reviewed by Beth Dakin.
+
+        Test that hit the assertion before the fix.
+
+        * compositing/geometry/geometry-map-scroll-during-layout-assertion-expected.txt: Added.
+        * compositing/geometry/geometry-map-scroll-during-layout-assertion.html: Added.
+
 2012-11-06  Joshua Bell  <[email protected]>
 
         [Chromium] Unreviewed gardening - more rebaselines following bug 101115.

Added: trunk/LayoutTests/compositing/geometry/geometry-map-scroll-during-layout-assertion-expected.txt (0 => 133628)


--- trunk/LayoutTests/compositing/geometry/geometry-map-scroll-during-layout-assertion-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/compositing/geometry/geometry-map-scroll-during-layout-assertion-expected.txt	2012-11-06 17:57:08 UTC (rev 133628)
@@ -0,0 +1,3 @@
+This test should not hit an assertion in debug builds.
+
+
Property changes on: trunk/LayoutTests/compositing/geometry/geometry-map-scroll-during-layout-assertion-expected.txt
___________________________________________________________________

Added: svn:mime-type

Added: svn:keywords

Added: svn:eol-style

Added: trunk/LayoutTests/compositing/geometry/geometry-map-scroll-during-layout-assertion.html (0 => 133628)


--- trunk/LayoutTests/compositing/geometry/geometry-map-scroll-during-layout-assertion.html	                        (rev 0)
+++ trunk/LayoutTests/compositing/geometry/geometry-map-scroll-during-layout-assertion.html	2012-11-06 17:57:08 UTC (rev 133628)
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <style>
+        #wpadminbar {
+            height: 28px;
+            position: fixed;
+            top: 0;
+            left: 0;
+            width: 100%;
+            min-width: 600px;
+            z-index: 99999;
+            background-color: gray;
+        }
+        
+        #overflow {
+            overflow: scroll;
+            height: 300px;
+        }
+        
+        #contents {
+            height: 500px;
+            background-color: green;
+        }
+    </style>
+    <script>
+        if (window.testRunner)
+            testRunner.dumpAsText();
+
+        function doTest()
+        {
+            document.getElementById('overflow').scrollTop = 200;
+            var contents = document.getElementById('contents');
+            contents.style.height = '200' + 'px';
+        }
+        window.addEventListener('load', doTest, false);
+    </script>
+</head>
+<body>
+    <p>This test should not hit an assertion in debug builds.</p>
+    <div id="wpadminbar" class="" role="navigation"></div>
+    <div id="overflow" style="width: 430px; margin-left: 100px; margin-top: 100px;">
+        <div id="contents">
+        </div>
+    </div>
+
+</body>
+</html>
Property changes on: trunk/LayoutTests/compositing/geometry/geometry-map-scroll-during-layout-assertion.html
___________________________________________________________________

Added: svn:mime-type

Added: svn:keywords

Added: svn:eol-style

Modified: trunk/Source/WebCore/ChangeLog (133627 => 133628)


--- trunk/Source/WebCore/ChangeLog	2012-11-06 17:54:42 UTC (rev 133627)
+++ trunk/Source/WebCore/ChangeLog	2012-11-06 17:57:08 UTC (rev 133628)
@@ -1,3 +1,26 @@
+2012-11-05  Simon Fraser  <[email protected]>
+
+        Fix RenderGeometryMap assertion when layers are scrolled during layout
+        https://bugs.webkit.org/show_bug.cgi?id=101292
+
+        Reviewed by Beth Dakin.
+
+        When we set RenderLayer scroll positions as part of layout, we don't want
+        to update compositing layers right away. Updating compositing layers
+        requires that the entire layer tree has been updated from renderers,
+        so that the geometry of all RenderLayers can be trusted. When this state
+        was violated, RenderGeometryMap asserts.
+        
+        Fix by bailing from updateCompositingLayersAfterScroll() if FrameView
+        tells us that we're doing layout. A full update of the compositing layers
+        will happen later anyway.
+
+        Test: compositing/geometry/geometry-map-scroll-during-layout-assertion.html
+
+        * rendering/RenderLayer.cpp:
+        (WebCore::frameViewFromLayer):
+        (WebCore::RenderLayer::updateCompositingLayersAfterScroll):
+
 2012-11-06  Michael Saboff  <[email protected]>
 
         quoteCSSString() always creates a 16 bit string

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (133627 => 133628)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2012-11-06 17:54:42 UTC (rev 133627)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2012-11-06 17:57:08 UTC (rev 133628)
@@ -1885,10 +1885,25 @@
         frameView->resumeScheduledEvents();
 }
 
+static FrameView* frameViewFromLayer(const RenderLayer* layer)
+{
+    Frame* frame = layer->renderer()->frame();
+    if (!frame)
+        return 0;
+
+    return frame->view();
+}
+
 void RenderLayer::updateCompositingLayersAfterScroll()
 {
 #if USE(ACCELERATED_COMPOSITING)
     if (compositor()->inCompositingMode()) {
+        // If we're in the middle of layout, we'll just update compositiong once layout has finished.
+        if (FrameView* frameView = frameViewFromLayer(this)) {
+            if (frameView->isInLayout())
+                return;
+        }
+
         // Our stacking context is guaranteed to contain all of our descendants that may need
         // repositioning, so update compositing layers from there.
         if (RenderLayer* compositingAncestor = stackingContext()->enclosingCompositingLayer()) {
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to