Changeset 171306 in webkit


Ignore:
Timestamp:
Jul 21, 2014 11:26:43 AM (10 years ago)
Author:
Simon Fraser
Message:

[iOS WK1] Single touch div scrolling doesn't work in framesets (breaks Word previews)
https://bugs.webkit.org/show_bug.cgi?id=135103
<rdar://problem/11830219>

Reviewed by Darin Adler.

After r166117 all layer flushing starts on the root frame; we no longer flush layers
for each frame during painting. However, flushing GraphicsLayers can set some state
on a subframe RenderLayerCompositor that is now never processed, which breaks scroll
layer registration.

Fix by doing a walk of the Frame tree, and calling didFlushLayers() on subframe RenderLayerCompositors
before calling didFlushLayers() on self.

  • rendering/RenderLayerCompositor.cpp:

(WebCore::RenderLayerCompositor::flushPendingLayerChanges):
(WebCore::RenderLayerCompositor::didFlushLayers):
(WebCore::RenderLayerCompositor::notifySubframesAfterLayerFlush):
(WebCore::RenderLayerCompositor::enclosingCompositorFlushingLayers): Drive-by nullptr.

  • rendering/RenderLayerCompositor.h:
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r171299 r171306  
     12014-07-20  Simon Fraser  <simon.fraser@apple.com>
     2
     3        [iOS WK1] Single touch div scrolling doesn't work in framesets (breaks Word previews)
     4        https://bugs.webkit.org/show_bug.cgi?id=135103
     5        <rdar://problem/11830219>
     6
     7        Reviewed by Darin Adler.
     8
     9        After r166117 all layer flushing starts on the root frame; we no longer flush layers
     10        for each frame during painting. However, flushing GraphicsLayers can set some state
     11        on a subframe RenderLayerCompositor that is now never processed, which breaks scroll
     12        layer registration.
     13       
     14        Fix by doing a walk of the Frame tree, and calling didFlushLayers() on subframe RenderLayerCompositors
     15        before calling didFlushLayers() on self.
     16
     17        * rendering/RenderLayerCompositor.cpp:
     18        (WebCore::RenderLayerCompositor::flushPendingLayerChanges):
     19        (WebCore::RenderLayerCompositor::didFlushLayers):
     20        (WebCore::RenderLayerCompositor::notifySubframesAfterLayerFlush):
     21        (WebCore::RenderLayerCompositor::enclosingCompositorFlushingLayers): Drive-by nullptr.
     22        * rendering/RenderLayerCompositor.h:
     23
    1242014-07-21  Eric Carlson  <eric.carlson@apple.com>
    225
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp

    r171073 r171306  
    471471    m_flushingLayers = false;
    472472
     473    updateScrollCoordinatedLayersAfterFlushIncludingSubframes();
     474
    473475#if PLATFORM(IOS)
    474     updateCustomLayersAfterFlush();
    475 
    476476    ChromeClient* client = this->chromeClient();
    477477    if (client && isFlushRoot)
     
    479479#endif
    480480
     481    startLayerFlushTimerIfNeeded();
     482}
     483
     484void RenderLayerCompositor::updateScrollCoordinatedLayersAfterFlushIncludingSubframes()
     485{
     486    updateScrollCoordinatedLayersAfterFlush();
     487
     488    Frame& frame = m_renderView.frameView().frame();
     489    for (Frame* subframe = frame.tree().firstChild(); subframe; subframe = subframe->tree().traverseNext(&frame)) {
     490        RenderView* view = subframe->contentRenderer();
     491        if (!view)
     492            continue;
     493
     494        view->compositor().updateScrollCoordinatedLayersAfterFlush();
     495    }
     496}
     497
     498void RenderLayerCompositor::updateScrollCoordinatedLayersAfterFlush()
     499{
     500#if PLATFORM(IOS)
     501    updateCustomLayersAfterFlush();
     502#endif
     503
    481504    for (auto it = m_scrollCoordinatedLayersNeedingUpdate.begin(), end = m_scrollCoordinatedLayersNeedingUpdate.end(); it != end; ++it)
    482505        updateScrollCoordinatedStatus(**it);
    483506
    484507    m_scrollCoordinatedLayersNeedingUpdate.clear();
    485     startLayerFlushTimerIfNeeded();
    486508}
    487509
     
    601623{
    602624    for (Frame* frame = &m_renderView.frameView().frame(); frame; frame = frame->tree().parent()) {
    603         RenderLayerCompositor* compositor = frame->contentRenderer() ? &frame->contentRenderer()->compositor() : 0;
     625        RenderLayerCompositor* compositor = frame->contentRenderer() ? &frame->contentRenderer()->compositor() : nullptr;
    604626        if (compositor->isFlushingLayers())
    605627            return compositor;
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.h

    r171073 r171306  
    382382
    383383    bool isFlushingLayers() const { return m_flushingLayers; }
     384    void updateScrollCoordinatedLayersAfterFlushIncludingSubframes();
     385    void updateScrollCoordinatedLayersAfterFlush();
    384386   
    385387    Page* page() const;
Note: See TracChangeset for help on using the changeset viewer.