Changeset 87755 in webkit
- Timestamp:
- May 31, 2011 3:11:28 PM (13 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r87727 r87755 1 2011-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 1 53 2011-05-31 ChangeLog <james.cooley@nokia.com> 2 54 -
trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp
r87623 r87755 536 536 // Notify the UIProcess. 537 537 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); 538 541 } 539 542 … … 1021 1024 void WebFrameLoaderClient::frameLoadCompleted() 1022 1025 { 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); 1024 1032 } 1025 1033 … … 1043 1051 void WebFrameLoaderClient::provisionalLoadStarted() 1044 1052 { 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); 1046 1059 } 1047 1060 -
trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.h
r86612 r87755 62 62 virtual void pageBackgroundTransparencyChanged() { } 63 63 virtual void forceRepaint() { } 64 virtual void setLayerTreeStateIsFrozen(bool) { } 64 65 65 66 virtual void didInstallPageOverlay() { } -
trunk/Source/WebKit2/WebProcess/WebPage/DrawingAreaImpl.cpp
r87654 r87755 61 61 , m_isWaitingForDidUpdate(false) 62 62 , m_compositingAccordingToProxyMessages(false) 63 , m_layerTreeStateIsFrozen(false) 64 , m_wantsToExitAcceleratedCompositingMode(false) 63 65 , m_isPaintingSuspended(!parameters.isVisible) 64 66 , m_alwaysUseCompositing(false) … … 148 150 m_scrollRect = scrollRect; 149 151 m_scrollOffset += scrollOffset; 152 } 153 154 void 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(); 150 168 } 151 169 … … 248 266 249 267 m_exitCompositingTimer.stop(); 268 m_wantsToExitAcceleratedCompositingMode = false; 250 269 251 270 // If we haven't sent the EnterAcceleratedCompositingMode message, make sure that the … … 405 424 { 406 425 m_exitCompositingTimer.stop(); 426 m_wantsToExitAcceleratedCompositingMode = false; 407 427 408 428 ASSERT(!m_layerTreeHost); … … 430 450 return; 431 451 452 ASSERT(!m_layerTreeStateIsFrozen); 453 432 454 m_exitCompositingTimer.stop(); 455 m_wantsToExitAcceleratedCompositingMode = false; 433 456 434 457 ASSERT(m_layerTreeHost); … … 477 500 void DrawingAreaImpl::exitAcceleratedCompositingModeSoon() 478 501 { 502 if (m_layerTreeStateIsFrozen) { 503 m_wantsToExitAcceleratedCompositingMode = true; 504 return; 505 } 506 479 507 if (exitAcceleratedCompositingModePending()) 480 508 return; -
trunk/Source/WebKit2/WebProcess/WebPage/DrawingAreaImpl.h
r85780 r87755 50 50 virtual void setNeedsDisplay(const WebCore::IntRect&); 51 51 virtual void scroll(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollOffset); 52 virtual void setLayerTreeStateIsFrozen(bool); 52 53 virtual void forceRepaint(); 53 54 … … 99 100 bool m_compositingAccordingToProxyMessages; 100 101 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 101 110 // Whether painting is suspended. We'll still keep track of the dirty region but we 102 111 // won't paint until painting has resumed again. -
trunk/Source/WebKit2/WebProcess/WebPage/LayerTreeHost.h
r86761 r87755 51 51 virtual const LayerTreeContext& layerTreeContext() = 0; 52 52 virtual void scheduleLayerFlush() = 0; 53 virtual void setLayerFlushSchedulingEnabled(bool) = 0; 53 54 virtual void setShouldNotifyAfterNextScheduledLayerFlush(bool) = 0; 54 55 virtual void setRootCompositingLayer(WebCore::GraphicsLayer*) = 0; -
trunk/Source/WebKit2/WebProcess/WebPage/ca/LayerTreeHostCA.cpp
r85508 r87755 43 43 LayerTreeHostCA::LayerTreeHostCA(WebPage* webPage) 44 44 : LayerTreeHost(webPage) 45 , m_layerFlushSchedulingEnabled(true) 45 46 , m_isValid(true) 46 47 , m_notifyAfterScheduledLayerFlush(false) -
trunk/Source/WebKit2/WebProcess/WebPage/ca/LayerTreeHostCA.h
r84416 r87755 55 55 virtual void didPerformScheduledLayerFlush(); 56 56 57 bool m_layerFlushSchedulingEnabled; 58 57 59 private: 58 60 // LayerTreeHost. -
trunk/Source/WebKit2/WebProcess/WebPage/ca/mac/LayerTreeHostCAMac.h
r83994 r87755 44 44 // LayerTreeHost. 45 45 virtual void scheduleLayerFlush(); 46 virtual void setLayerFlushSchedulingEnabled(bool); 46 47 virtual void invalidate(); 47 48 virtual void sizeDidChange(const WebCore::IntSize& newSize); -
trunk/Source/WebKit2/WebProcess/WebPage/ca/mac/LayerTreeHostCAMac.mm
r83994 r87755 70 70 void LayerTreeHostCAMac::scheduleLayerFlush() 71 71 { 72 if (!m_layerFlushSchedulingEnabled) 73 return; 74 72 75 CFRunLoopRef currentRunLoop = CFRunLoopGetCurrent(); 73 76 … … 84 87 85 88 CFRunLoopAddObserver(currentRunLoop, m_flushPendingLayerChangesRunLoopObserver.get(), kCFRunLoopCommonModes); 89 } 90 91 void 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; 86 106 } 87 107 … … 129 149 void LayerTreeHostCAMac::flushPendingLayerChangesRunLoopObserverCallback(CFRunLoopObserverRef, CFRunLoopActivity, void* context) 130 150 { 151 LayerTreeHostCAMac* layerTreeHost = static_cast<LayerTreeHostCAMac*>(context); 152 153 ASSERT(layerTreeHost->m_layerFlushSchedulingEnabled); 154 131 155 // This gets called outside of the normal event loop so wrap in an autorelease pool 132 156 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 133 static_cast<LayerTreeHostCAMac*>(context)->performScheduledLayerFlush();157 layerTreeHost->performScheduledLayerFlush(); 134 158 [pool drain]; 135 159 } -
trunk/Source/WebKit2/WebProcess/WebPage/ca/win/LayerTreeHostCAWin.cpp
r84635 r87755 137 137 void LayerTreeHostCAWin::scheduleLayerFlush() 138 138 { 139 if (!m_layerFlushSchedulingEnabled) 140 return; 141 139 142 LayerChangesFlusher::shared().flushPendingLayerChangesSoon(this); 143 } 144 145 void 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); 140 156 } 141 157 -
trunk/Source/WebKit2/WebProcess/WebPage/ca/win/LayerTreeHostCAWin.h
r84416 r87755 58 58 virtual void sizeDidChange(const WebCore::IntSize& newSize); 59 59 virtual void scheduleLayerFlush(); 60 virtual void setLayerFlushSchedulingEnabled(bool); 60 61 virtual bool participatesInDisplay(); 61 62 virtual bool needsDisplay();
Note: See TracChangeset
for help on using the changeset viewer.