Bug 107326

Summary: Rubberband scrolling on news.google.com causes text to blink repeatedly
Product: WebKit Reporter: Elliott Sprehn <esprehn>
Component: Layout and RenderingAssignee: Simon Fraser (smfr) <simon.fraser>
Status: RESOLVED FIXED    
Severity: Normal CC: bdakin, eric, jamesr, ojan.autocc, simon.fraser, vollick, webkit-bug-importer, webkit.review.bot
Priority: P2 Keywords: InRadar
Version: 528+ (Nightly build)   
Hardware: Mac   
OS: OS X 10.8   
URL: https://news.google.com
Attachments:
Description Flags
Patch bdakin: review+

Description Elliott Sprehn 2013-01-18 14:33:07 PST
In Webkit nightlies (but not Chrome canary) when you two finger scroll to the bottom of news.google.com and then scroll some more so the page bounces up and then back down the side bar of categories on the left has all of it's text blink at you several times. This seems to be some kind of compositing badness.
Comment 1 Elliott Sprehn 2013-01-18 14:34:11 PST
Note that the sidebar is position: fixed in this scenario, so I think it's rubber banding + position fixed + compositing.
Comment 2 Radar WebKit Bug Importer 2013-01-18 14:41:46 PST
<rdar://problem/13045436>
Comment 3 Simon Fraser (smfr) 2013-01-29 18:02:51 PST
The fixed thing is dropping out of a layer briefly, because we think it's layer is at 0,0 in the view (the Y offset should be larger).
Comment 4 Simon Fraser (smfr) 2013-01-29 18:03:01 PST
s/it's/its
Comment 5 Simon Fraser (smfr) 2013-01-29 20:28:17 PST
When we destroy the fixed layer because we think it's outside the viewport, the render tree is actually needing layout:

  RenderView 0x1180834f8 at (0,0) size 1143x605 (needs layout: positioned child)

and the fixed layer has a bogus 0,0 location:

    layer 0x10d67eca8 at (0,0) size 196x606 scrollWidth 204 (composited, bounds=at (0,0) size 196x605, drawsContent=1, paints into ancestor=0)
      RenderBlock (positioned) 0x10d69ded8 zI: 99 {DIV} at (0,0) size 196x608 [bgcolor=#FFFFFF] id="nav-menu-wrapper" class="nav nav-one-col-hp jfk-scrollbar-borderless left-nav-pinned" (needs layout: self)
        RenderBlock 0x10d652d28 {DIV} at (28,3) size 152x553 class="browse-sidebar"
Comment 6 Simon Fraser (smfr) 2013-01-29 20:32:13 PST
Ah, we're actually inside layout at that point:

* thread #1: tid = 0x2303, 0x00000001049d14a3 WebCore`WebCore::RenderLayerCompositor::requiresCompositingForPosition(WebCore::RenderObject*, WebCore::RenderLayer const*, WebCore::RenderLayer::ViewportConstrainedNotCompositedReason*) const + 755 at RenderLayerCompositor.cpp:2079, stop reason = breakpoint 8.1
    frame #0: 0x00000001049d14a3 WebCore`WebCore::RenderLayerCompositor::requiresCompositingForPosition(WebCore::RenderObject*, WebCore::RenderLayer const*, WebCore::RenderLayer::ViewportConstrainedNotCompositedReason*) const + 755 at RenderLayerCompositor.cpp:2079
    frame #1: 0x00000001049cc41d WebCore`WebCore::RenderLayerCompositor::requiresCompositingLayer(WebCore::RenderLayer const*, WebCore::RenderLayer::ViewportConstrainedNotCompositedReason*) const + 381 at RenderLayerCompositor.cpp:1645
    frame #2: 0x00000001049ccdba WebCore`WebCore::RenderLayerCompositor::needsToBeComposited(WebCore::RenderLayer const*, WebCore::RenderLayer::ViewportConstrainedNotCompositedReason*) const + 74 at RenderLayerCompositor.cpp:1621
    frame #3: 0x00000001049cc937 WebCore`WebCore::RenderLayerCompositor::updateBacking(WebCore::RenderLayer*, WebCore::RenderLayerCompositor::CompositingChangeRepaint) + 71 at RenderLayerCompositor.cpp:566
    frame #4: 0x00000001049cd0e3 WebCore`WebCore::RenderLayerCompositor::updateLayerCompositingState(WebCore::RenderLayer*, WebCore::RenderLayerCompositor::CompositingChangeRepaint) + 35 at RenderLayerCompositor.cpp:659
    frame #5: 0x000000010499b293 WebCore`WebCore::RenderLayer::updateScrollInfoAfterLayout() + 435 at RenderLayer.cpp:3097
    frame #6: 0x0000000104864444 WebCore`WebCore::RenderBlock::updateScrollInfoAfterLayout() + 180 at RenderBlock.cpp:1349
    frame #7: 0x0000000104865a0b WebCore`WebCore::RenderBlock::layoutBlock(bool, WebCore::LayoutUnit) + 2779 at RenderBlock.cpp:1589
    frame #8: 0x00000001048644ce WebCore`WebCore::RenderBlock::layout() + 126 at RenderBlock.cpp:1363
    frame #9: 0x0000000103bb8db6 WebCore`WebCore::RenderObject::layoutIfNeeded() + 54 at RenderObject.h:676
    frame #10: 0x0000000104868cb4 WebCore`WebCore::RenderBlock::layoutPositionedObjects(bool, bool) + 724 at RenderBlock.cpp:2711
    frame #11: 0x000000010486619e WebCore`WebCore::RenderBlock::simplifiedLayout() + 574 at RenderBlock.cpp:2604
    frame #12: 0x000000010486500a WebCore`WebCore::RenderBlock::layoutBlock(bool, WebCore::LayoutUnit) + 218 at RenderBlock.cpp:1485
    frame #13: 0x00000001048644ce WebCore`WebCore::RenderBlock::layout() + 126 at RenderBlock.cpp:1363
    frame #14: 0x0000000104b3ad54 WebCore`WebCore::RenderView::layoutContent(WebCore::LayoutState const&) + 116 at RenderView.cpp:131
    frame #15: 0x0000000104b3b54c WebCore`WebCore::RenderView::layout() + 1148 at RenderView.cpp:215
    frame #16: 0x0000000103c4825d WebCore`WebCore::FrameView::layout(bool) + 3261 at FrameView.cpp:1213
    frame #17: 0x00000001038f37d6 WebCore`WebCore::Document::updateLayout() + 374 at Document.cpp:1892
    frame #18: 0x00000001049a0edd WebCore`WebCore::RenderLayer::hitTest(WebCore::HitTestRequest const&, 

RenderBlock::updateScrollInfoAfterLayout() is causing premature compositing stuff to happen inside layout.
Comment 7 Simon Fraser (smfr) 2013-01-29 20:53:31 PST
Looks like the code that was added for compositing scrolling is causing this.
Comment 8 Simon Fraser (smfr) 2013-01-29 21:32:27 PST
Created attachment 185393 [details]
Patch
Comment 9 Simon Fraser (smfr) 2013-01-29 21:40:11 PST
http://trac.webkit.org/changeset/141221