Title: [129294] trunk/Source/WebCore
Revision
129294
Author
[email protected]
Date
2012-09-21 20:04:16 -0700 (Fri, 21 Sep 2012)

Log Message

RenderMarquee causes ASSERTION FAILED: enclosingIntRect(rendererMappedResult) == enclosingIntRect(FloatQuad(result).boundingBox()) : WebCore::FloatRect WebCore::RenderGeometryMap::absoluteRect(const WebCore::FloatRect &) const
https://bugs.webkit.org/show_bug.cgi?id=92464

Reviewed by Sam Weinig.

Marquees could cause an updateCompositingLayersAfterScroll() to be called when
we're in the middle of updating layer positions. updateCompositingLayersAfterScroll()
does a full RenderLayer tree walk, but its use of RenderGeomeryMap reveals that
it's using layers whose positions haven't been updated yet.

Fix by avoiding the updateCompositingLayersAfterScroll() if we're in the process
of updating a marquee when updating layer positions. We'll do a compositing update
soon anyway.

Tested by fast/events/tabindex-focus-blur-all.html

* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::RenderLayer):
(WebCore::RenderLayer::updateLayerPositions):
(WebCore::RenderLayer::updateLayerPositionsAfterScroll):
(WebCore::RenderLayer::scrollTo):
* rendering/RenderLayer.h:
(RenderLayer):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (129293 => 129294)


--- trunk/Source/WebCore/ChangeLog	2012-09-22 02:22:26 UTC (rev 129293)
+++ trunk/Source/WebCore/ChangeLog	2012-09-22 03:04:16 UTC (rev 129294)
@@ -1,3 +1,29 @@
+2012-09-21  Simon Fraser  <[email protected]>
+
+        RenderMarquee causes ASSERTION FAILED: enclosingIntRect(rendererMappedResult) == enclosingIntRect(FloatQuad(result).boundingBox()) : WebCore::FloatRect WebCore::RenderGeometryMap::absoluteRect(const WebCore::FloatRect &) const
+        https://bugs.webkit.org/show_bug.cgi?id=92464
+
+        Reviewed by Sam Weinig.
+
+        Marquees could cause an updateCompositingLayersAfterScroll() to be called when
+        we're in the middle of updating layer positions. updateCompositingLayersAfterScroll()
+        does a full RenderLayer tree walk, but its use of RenderGeomeryMap reveals that
+        it's using layers whose positions haven't been updated yet.
+        
+        Fix by avoiding the updateCompositingLayersAfterScroll() if we're in the process
+        of updating a marquee when updating layer positions. We'll do a compositing update
+        soon anyway.
+
+        Tested by fast/events/tabindex-focus-blur-all.html
+
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::RenderLayer):
+        (WebCore::RenderLayer::updateLayerPositions):
+        (WebCore::RenderLayer::updateLayerPositionsAfterScroll):
+        (WebCore::RenderLayer::scrollTo):
+        * rendering/RenderLayer.h:
+        (RenderLayer):
+
 2012-09-21  Adam Klein  <[email protected]>
 
         Remove bogus assertions from ChildListMutationScope

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (129293 => 129294)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2012-09-22 02:22:26 UTC (rev 129293)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2012-09-22 03:04:16 UTC (rev 129294)
@@ -154,6 +154,7 @@
     , m_indirectCompositingReason(NoIndirectCompositingReason)
 #endif
     , m_containsDirtyOverlayScrollbars(false)
+    , m_updatingMarqueePosition(false)
 #if !ASSERT_DISABLED
     , m_layerListMutationAllowed(true)
 #endif
@@ -435,8 +436,13 @@
 #endif
         
     // With all our children positioned, now update our marquee if we need to.
-    if (m_marquee)
+    if (m_marquee) {
+        // FIXME: would like to use TemporaryChange<> but it doesn't work with bitfields.
+        bool oldUpdatingMarqueePosition = m_updatingMarqueePosition;
+        m_updatingMarqueePosition = true;
         m_marquee->updateMarqueePosition();
+        m_updatingMarqueePosition = oldUpdatingMarqueePosition;
+    }
 
     if (offsetFromRoot)
         *offsetFromRoot = oldOffsetFromRoot;
@@ -542,8 +548,12 @@
     // of an object, thus RenderReplica will still repaint itself properly as the layer position was
     // updated above.
 
-    if (m_marquee)
+    if (m_marquee) {
+        bool oldUpdatingMarqueePosition = m_updatingMarqueePosition;
+        m_updatingMarqueePosition = true;
         m_marquee->updateMarqueePosition();
+        m_updatingMarqueePosition = oldUpdatingMarqueePosition;
+    }
 }
 
 #if ENABLE(CSS_COMPOSITING)
@@ -1717,7 +1727,13 @@
         view->updateWidgetPositions();
     }
 
-    updateCompositingLayersAfterScroll();
+    if (!m_updatingMarqueePosition) {
+        // Avoid updating compositing layers if, higher on the stack, we're already updating layer
+        // positions. Updating layer positions requires a full walk of up-to-date RenderLayers, and
+        // in this case we're still updating their positions; we'll update compositing layers later
+        // when that completes.
+        updateCompositingLayersAfterScroll();
+    }
 
     RenderBoxModelObject* repaintContainer = renderer()->containerForRepaint();
     Frame* frame = renderer()->frame();

Modified: trunk/Source/WebCore/rendering/RenderLayer.h (129293 => 129294)


--- trunk/Source/WebCore/rendering/RenderLayer.h	2012-09-22 02:22:26 UTC (rev 129293)
+++ trunk/Source/WebCore/rendering/RenderLayer.h	2012-09-22 03:04:16 UTC (rev 129294)
@@ -938,6 +938,8 @@
 #endif
 
     bool m_containsDirtyOverlayScrollbars : 1;
+    bool m_updatingMarqueePosition : 1;
+
 #if !ASSERT_DISABLED
     bool m_layerListMutationAllowed : 1;
 #endif
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to