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