Changeset 87755 in webkit


Ignore:
Timestamp:
May 31, 2011 3:11:28 PM (13 years ago)
Author:
mitz@apple.com
Message:

<rdar://problem/9523192> REGRESSION (5.0.5-ToT, WebKit2): Flash to white when navigating between pages on wsj.com, other sites (when navigating away from composited page)
https://bugs.webkit.org/show_bug.cgi?id=61808

Reviewed by Simon Fraser.

WebKit1 has a mechanism to prevent the stale bits from the outgoing page from being erased
until the incoming page has layout. Adapt this in WebKit2 to prevent the composited layer tree
of the outgoing page from being torn down or updated until the incoming page has layout.

  • WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:

(WebKit::WebFrameLoaderClient::dispatchDidFirstLayout): Unfreeze the layer tree state.
(WebKit::WebFrameLoaderClient::frameLoadCompleted): Ditto.
(WebKit::WebFrameLoaderClient::provisionalLoadStarted): Freeze the layer tree state.

  • WebProcess/WebPage/DrawingArea.h:

(WebKit::DrawingArea::setLayerTreeStateIsFrozen): Added.

  • WebProcess/WebPage/DrawingAreaImpl.cpp:

(WebKit::DrawingAreaImpl::DrawingAreaImpl): Initialize new member variables.
(WebKit::DrawingAreaImpl::setLayerTreeStateIsFrozen): Added. When freezing, sets the flag and
disables layer flush scheduling and exiting accelerated compositing mode. When unfreezing,
clears the flag and exits compositing mode if needed.
(WebKit::DrawingAreaImpl::setRootCompositingLayer): Reset m_wantsToExitAcceleratedCompositingMode.
(WebKit::DrawingAreaImpl::enterAcceleratedCompositingMode): Ditto.
(WebKit::DrawingAreaImpl::exitAcceleratedCompositingMode): Ditto.
(WebKit::DrawingAreaImpl::exitAcceleratedCompositingModeSoon): If the layer tree state is frozen,
bail out but set m_wantsToExitAcceleratedCompositingMode.

  • WebProcess/WebPage/DrawingAreaImpl.h:
  • WebProcess/WebPage/LayerTreeHost.h:
  • WebProcess/WebPage/ca/LayerTreeHostCA.cpp:

(WebKit::LayerTreeHostCA::LayerTreeHostCA): Initialize m_layerFlushSchedulingEnabled.

  • WebProcess/WebPage/ca/LayerTreeHostCA.h:
  • WebProcess/WebPage/ca/mac/LayerTreeHostCAMac.h:
  • WebProcess/WebPage/ca/mac/LayerTreeHostCAMac.mm:

(WebKit::LayerTreeHostCAMac::scheduleLayerFlush): Bail out if scheduling is not enabled.
(WebKit::LayerTreeHostCAMac::setLayerFlushSchedulingEnabled): Added. Sets the flag. If disabling
flushing, cancels the pending flush.
(WebKit::LayerTreeHostCAMac::flushPendingLayerChangesRunLoopObserverCallback): Added an assertion.

  • WebProcess/WebPage/ca/win/LayerTreeHostCAWin.cpp:

(WebKit::LayerTreeHostCAWin::scheduleLayerFlush): Bail out if scheduling is not enabled.
(WebKit::LayerTreeHostCAWin::setLayerFlushSchedulingEnabled): Added. Sets the flag. If disabling
flushing, cancels the pending flush.

  • WebProcess/WebPage/ca/win/LayerTreeHostCAWin.h:
Location:
trunk/Source/WebKit2
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r87727 r87755  
     12011-05-31  Dan Bernstein  <mitz@apple.com>
     2
     3        Reviewed by Simon Fraser.
     4
     5        <rdar://problem/9523192> REGRESSION (5.0.5-ToT, WebKit2): Flash to white when navigating between pages on wsj.com, other sites (when navigating away from composited page)
     6        https://bugs.webkit.org/show_bug.cgi?id=61808
     7
     8        WebKit1 has a mechanism to prevent the stale bits from the outgoing page from being erased
     9        until the incoming page has layout. Adapt this in WebKit2 to prevent the composited layer tree
     10        of the outgoing page from being torn down or updated until the incoming page has layout.
     11
     12        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
     13        (WebKit::WebFrameLoaderClient::dispatchDidFirstLayout): Unfreeze the layer tree state.
     14        (WebKit::WebFrameLoaderClient::frameLoadCompleted): Ditto.
     15        (WebKit::WebFrameLoaderClient::provisionalLoadStarted): Freeze the layer tree state.
     16
     17        * WebProcess/WebPage/DrawingArea.h:
     18        (WebKit::DrawingArea::setLayerTreeStateIsFrozen): Added.
     19
     20        * WebProcess/WebPage/DrawingAreaImpl.cpp:
     21        (WebKit::DrawingAreaImpl::DrawingAreaImpl): Initialize new member variables.
     22        (WebKit::DrawingAreaImpl::setLayerTreeStateIsFrozen): Added. When freezing, sets the flag and
     23        disables layer flush scheduling and exiting accelerated compositing mode. When unfreezing,
     24        clears the flag and exits compositing mode if needed.
     25        (WebKit::DrawingAreaImpl::setRootCompositingLayer): Reset m_wantsToExitAcceleratedCompositingMode.
     26        (WebKit::DrawingAreaImpl::enterAcceleratedCompositingMode): Ditto.
     27        (WebKit::DrawingAreaImpl::exitAcceleratedCompositingMode): Ditto.
     28        (WebKit::DrawingAreaImpl::exitAcceleratedCompositingModeSoon): If the layer tree state is frozen,
     29        bail out but set m_wantsToExitAcceleratedCompositingMode.
     30
     31        * WebProcess/WebPage/DrawingAreaImpl.h:
     32        * WebProcess/WebPage/LayerTreeHost.h:
     33
     34        * WebProcess/WebPage/ca/LayerTreeHostCA.cpp:
     35        (WebKit::LayerTreeHostCA::LayerTreeHostCA): Initialize m_layerFlushSchedulingEnabled.
     36
     37        * WebProcess/WebPage/ca/LayerTreeHostCA.h:
     38        * WebProcess/WebPage/ca/mac/LayerTreeHostCAMac.h:
     39
     40        * WebProcess/WebPage/ca/mac/LayerTreeHostCAMac.mm:
     41        (WebKit::LayerTreeHostCAMac::scheduleLayerFlush): Bail out if scheduling is not enabled.
     42        (WebKit::LayerTreeHostCAMac::setLayerFlushSchedulingEnabled): Added. Sets the flag. If disabling
     43        flushing, cancels the pending flush.
     44        (WebKit::LayerTreeHostCAMac::flushPendingLayerChangesRunLoopObserverCallback): Added an assertion.
     45
     46        * WebProcess/WebPage/ca/win/LayerTreeHostCAWin.cpp:
     47        (WebKit::LayerTreeHostCAWin::scheduleLayerFlush): Bail out if scheduling is not enabled.
     48        (WebKit::LayerTreeHostCAWin::setLayerFlushSchedulingEnabled): Added. Sets the flag. If disabling
     49        flushing, cancels the pending flush.
     50
     51        * WebProcess/WebPage/ca/win/LayerTreeHostCAWin.h:
     52
    1532011-05-31  ChangeLog  <james.cooley@nokia.com>
    254
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp

    r87623 r87755  
    536536    // Notify the UIProcess.
    537537    webPage->send(Messages::WebPageProxy::DidFirstLayoutForFrame(m_frame->frameID(), InjectedBundleUserMessageEncoder(userData.get())));
     538
     539    if (m_frame == m_frame->page()->mainFrame())
     540        webPage->drawingArea()->setLayerTreeStateIsFrozen(false);
    538541}
    539542
     
    10211024void WebFrameLoaderClient::frameLoadCompleted()
    10221025{
    1023     notImplemented();
     1026    WebPage* webPage = m_frame->page();
     1027    if (!webPage)
     1028        return;
     1029
     1030    if (m_frame == m_frame->page()->mainFrame())
     1031        webPage->drawingArea()->setLayerTreeStateIsFrozen(false);
    10241032}
    10251033
     
    10431051void WebFrameLoaderClient::provisionalLoadStarted()
    10441052{
    1045     notImplemented();
     1053    WebPage* webPage = m_frame->page();
     1054    if (!webPage)
     1055        return;
     1056
     1057    if (m_frame == m_frame->page()->mainFrame())
     1058        webPage->drawingArea()->setLayerTreeStateIsFrozen(true);
    10461059}
    10471060
  • trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.h

    r86612 r87755  
    6262    virtual void pageBackgroundTransparencyChanged() { }
    6363    virtual void forceRepaint() { }
     64    virtual void setLayerTreeStateIsFrozen(bool) { }
    6465
    6566    virtual void didInstallPageOverlay() { }
  • trunk/Source/WebKit2/WebProcess/WebPage/DrawingAreaImpl.cpp

    r87654 r87755  
    6161    , m_isWaitingForDidUpdate(false)
    6262    , m_compositingAccordingToProxyMessages(false)
     63    , m_layerTreeStateIsFrozen(false)
     64    , m_wantsToExitAcceleratedCompositingMode(false)
    6365    , m_isPaintingSuspended(!parameters.isVisible)
    6466    , m_alwaysUseCompositing(false)
     
    148150    m_scrollRect = scrollRect;
    149151    m_scrollOffset += scrollOffset;
     152}
     153
     154void DrawingAreaImpl::setLayerTreeStateIsFrozen(bool isFrozen)
     155{
     156    if (m_layerTreeStateIsFrozen == isFrozen)
     157        return;
     158
     159    m_layerTreeStateIsFrozen = isFrozen;
     160
     161    if (m_layerTreeHost)
     162        m_layerTreeHost->setLayerFlushSchedulingEnabled(!isFrozen);
     163
     164    if (isFrozen)
     165        m_exitCompositingTimer.stop();
     166    else if (m_wantsToExitAcceleratedCompositingMode)
     167        exitAcceleratedCompositingModeSoon();
    150168}
    151169
     
    248266
    249267            m_exitCompositingTimer.stop();
     268            m_wantsToExitAcceleratedCompositingMode = false;
    250269
    251270            // If we haven't sent the EnterAcceleratedCompositingMode message, make sure that the
     
    405424{
    406425    m_exitCompositingTimer.stop();
     426    m_wantsToExitAcceleratedCompositingMode = false;
    407427
    408428    ASSERT(!m_layerTreeHost);
     
    430450        return;
    431451
     452    ASSERT(!m_layerTreeStateIsFrozen);
     453
    432454    m_exitCompositingTimer.stop();
     455    m_wantsToExitAcceleratedCompositingMode = false;
    433456
    434457    ASSERT(m_layerTreeHost);
     
    477500void DrawingAreaImpl::exitAcceleratedCompositingModeSoon()
    478501{
     502    if (m_layerTreeStateIsFrozen) {
     503        m_wantsToExitAcceleratedCompositingMode = true;
     504        return;
     505    }
     506
    479507    if (exitAcceleratedCompositingModePending())
    480508        return;
  • trunk/Source/WebKit2/WebProcess/WebPage/DrawingAreaImpl.h

    r85780 r87755  
    5050    virtual void setNeedsDisplay(const WebCore::IntRect&);
    5151    virtual void scroll(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollOffset);
     52    virtual void setLayerTreeStateIsFrozen(bool);
    5253    virtual void forceRepaint();
    5354
     
    99100    bool m_compositingAccordingToProxyMessages;
    100101
     102    // When true, we maintain the layer tree in its current state by not leaving accelerated compositing mode
     103    // and not scheduling layer flushes.
     104    bool m_layerTreeStateIsFrozen;
     105
     106    // True when we were asked to exit accelerated compositing mode but couldn't because layer tree
     107    // state was frozen.
     108    bool m_wantsToExitAcceleratedCompositingMode;
     109
    101110    // Whether painting is suspended. We'll still keep track of the dirty region but we
    102111    // won't paint until painting has resumed again.
  • trunk/Source/WebKit2/WebProcess/WebPage/LayerTreeHost.h

    r86761 r87755  
    5151    virtual const LayerTreeContext& layerTreeContext() = 0;
    5252    virtual void scheduleLayerFlush() = 0;
     53    virtual void setLayerFlushSchedulingEnabled(bool) = 0;
    5354    virtual void setShouldNotifyAfterNextScheduledLayerFlush(bool) = 0;
    5455    virtual void setRootCompositingLayer(WebCore::GraphicsLayer*) = 0;
  • trunk/Source/WebKit2/WebProcess/WebPage/ca/LayerTreeHostCA.cpp

    r85508 r87755  
    4343LayerTreeHostCA::LayerTreeHostCA(WebPage* webPage)
    4444    : LayerTreeHost(webPage)
     45    , m_layerFlushSchedulingEnabled(true)
    4546    , m_isValid(true)
    4647    , m_notifyAfterScheduledLayerFlush(false)
  • trunk/Source/WebKit2/WebProcess/WebPage/ca/LayerTreeHostCA.h

    r84416 r87755  
    5555    virtual void didPerformScheduledLayerFlush();
    5656
     57    bool m_layerFlushSchedulingEnabled;
     58
    5759private:
    5860    // LayerTreeHost.
  • trunk/Source/WebKit2/WebProcess/WebPage/ca/mac/LayerTreeHostCAMac.h

    r83994 r87755  
    4444    // LayerTreeHost.
    4545    virtual void scheduleLayerFlush();
     46    virtual void setLayerFlushSchedulingEnabled(bool);
    4647    virtual void invalidate();
    4748    virtual void sizeDidChange(const WebCore::IntSize& newSize);
  • trunk/Source/WebKit2/WebProcess/WebPage/ca/mac/LayerTreeHostCAMac.mm

    r83994 r87755  
    7070void LayerTreeHostCAMac::scheduleLayerFlush()
    7171{
     72    if (!m_layerFlushSchedulingEnabled)
     73        return;
     74
    7275    CFRunLoopRef currentRunLoop = CFRunLoopGetCurrent();
    7376   
     
    8487
    8588    CFRunLoopAddObserver(currentRunLoop, m_flushPendingLayerChangesRunLoopObserver.get(), kCFRunLoopCommonModes);
     89}
     90
     91void LayerTreeHostCAMac::setLayerFlushSchedulingEnabled(bool layerFlushingEnabled)
     92{
     93    if (m_layerFlushSchedulingEnabled == layerFlushingEnabled)
     94        return;
     95
     96    m_layerFlushSchedulingEnabled = layerFlushingEnabled;
     97
     98    if (m_layerFlushSchedulingEnabled)
     99        return;
     100
     101    if (!m_flushPendingLayerChangesRunLoopObserver)
     102        return;
     103
     104    CFRunLoopObserverInvalidate(m_flushPendingLayerChangesRunLoopObserver.get());
     105    m_flushPendingLayerChangesRunLoopObserver = nullptr;
    86106}
    87107
     
    129149void LayerTreeHostCAMac::flushPendingLayerChangesRunLoopObserverCallback(CFRunLoopObserverRef, CFRunLoopActivity, void* context)
    130150{
     151    LayerTreeHostCAMac* layerTreeHost = static_cast<LayerTreeHostCAMac*>(context);
     152
     153    ASSERT(layerTreeHost->m_layerFlushSchedulingEnabled);
     154
    131155    // This gets called outside of the normal event loop so wrap in an autorelease pool
    132156    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    133     static_cast<LayerTreeHostCAMac*>(context)->performScheduledLayerFlush();
     157    layerTreeHost->performScheduledLayerFlush();
    134158    [pool drain];
    135159}
  • trunk/Source/WebKit2/WebProcess/WebPage/ca/win/LayerTreeHostCAWin.cpp

    r84635 r87755  
    137137void LayerTreeHostCAWin::scheduleLayerFlush()
    138138{
     139    if (!m_layerFlushSchedulingEnabled)
     140        return;
     141
    139142    LayerChangesFlusher::shared().flushPendingLayerChangesSoon(this);
     143}
     144
     145void LayerTreeHostCAWin::setLayerFlushSchedulingEnabled(bool layerFlushingEnabled)
     146{
     147    if (m_layerFlushSchedulingEnabled == layerFlushingEnabled)
     148        return;
     149
     150    m_layerFlushSchedulingEnabled = layerFlushingEnabled;
     151
     152    if (m_layerFlushSchedulingEnabled)
     153        return;
     154
     155    LayerChangesFlusher::shared().cancelPendingFlush(thus);
    140156}
    141157
  • trunk/Source/WebKit2/WebProcess/WebPage/ca/win/LayerTreeHostCAWin.h

    r84416 r87755  
    5858    virtual void sizeDidChange(const WebCore::IntSize& newSize);
    5959    virtual void scheduleLayerFlush();
     60    virtual void setLayerFlushSchedulingEnabled(bool);
    6061    virtual bool participatesInDisplay();
    6162    virtual bool needsDisplay();
Note: See TracChangeset for help on using the changeset viewer.