Title: [88654] trunk/Source
Revision
88654
Author
[email protected]
Date
2011-06-13 11:05:09 -0700 (Mon, 13 Jun 2011)

Log Message

2011-06-11  Jer Noble  <[email protected]>

        Reviewed by Anders Carlsson.

        Avoid flashing when exiting full-screen mode.
        https://bugs.webkit.org/show_bug.cgi?id=62338

        No new tests; covered by the existing full-screen tests.

        Now that we are forcing a repaint inside of setRootFullScreenLayer() instead of during
        the next run loop, make sure that we have disabled animation before calling
        setRootFullScreenLayer() so that the RenderFullScreen renderer and its contents are
        painted.

        * dom/Document.cpp:
        (WebCore::Document::webkitDidEnterFullScreenForElement):
2011-06-11  Jer Noble  <[email protected]>

        Reviewed by Anders Carlsson.

        Avoid flashing when exiting full-screen mode.
        https://bugs.webkit.org/show_bug.cgi?id=62338

        Instead of making a round-trip between processes by calling forceRepaint
        and waiting for a callback, instead make a WebProcess-side call to
        forceRepaintWithoutCallback before sending the ExitAcceleratedCompositingMode
        message to the WebFullScreenControllerProxy. This also means we can get rid of
        the dragImage creation and display.

        Because this redraw will happen during the current run-loop instead of a future
        one, make sure the background color has been set before the redraw in
        didEnterFullScreen().

        Wait to hide the full-screen window until after we have received the
        ExitAcceleratedCompositingMode message.  By this time, repaint will have already
        completed.

        * UIProcess/mac/WKFullScreenWindowController.h:
        * UIProcess/mac/WKFullScreenWindowController.mm:
        (-[WKFullScreenWindowController finishedEnterFullScreenAnimation:]): Disable
            screen updates, to be re-enabled during exitAcceleratedCompositingMode.
        (-[WKFullScreenWindowController finishedExitFullScreenAnimation:]): Don't hide
            the full-screen window here; wait for exitAcceleratedCompositing instead.
        (-[WKFullScreenWindowController exitAcceleratedCompositingMode]): Collapse
            the redrawCompleted method into this one.
        (-[WKFullScreenWindowController close]): Remove the reference to
            exitCompositedModeRepaintCompleted.
        * WebProcess/FullScreen/WebFullScreenManager.cpp:
        (WebKit::WebFullScreenManager::didEnterFullScreen): Set the full screen
            background color first.
        * WebProcess/FullScreen/mac/WebFullScreenManagerMac.mm:
        (WebKit::WebFullScreenManagerMac::setRootFullScreenLayer): Repaint before
            sending the ExitAcceleratedCompositingMode message.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (88653 => 88654)


--- trunk/Source/WebCore/ChangeLog	2011-06-13 18:02:13 UTC (rev 88653)
+++ trunk/Source/WebCore/ChangeLog	2011-06-13 18:05:09 UTC (rev 88654)
@@ -1,3 +1,20 @@
+2011-06-11  Jer Noble  <[email protected]>
+
+        Reviewed by Anders Carlsson.
+
+        Avoid flashing when exiting full-screen mode.
+        https://bugs.webkit.org/show_bug.cgi?id=62338
+
+        No new tests; covered by the existing full-screen tests.
+
+        Now that we are forcing a repaint inside of setRootFullScreenLayer() instead of during
+        the next run loop, make sure that we have disabled animation before calling 
+        setRootFullScreenLayer() so that the RenderFullScreen renderer and its contents are
+        painted.
+
+        * dom/Document.cpp:
+        (WebCore::Document::webkitDidEnterFullScreenForElement):
+
 2011-06-10  Jer Noble  <[email protected]>
 
         Reviewed by Darin Adler.

Modified: trunk/Source/WebCore/dom/Document.cpp (88653 => 88654)


--- trunk/Source/WebCore/dom/Document.cpp	2011-06-13 18:02:13 UTC (rev 88653)
+++ trunk/Source/WebCore/dom/Document.cpp	2011-06-13 18:05:09 UTC (rev 88654)
@@ -4792,12 +4792,10 @@
     m_fullScreenElement->didBecomeFullscreenElement();
 
     if (m_fullScreenRenderer) {
-#if USE(ACCELERATED_COMPOSITING)
-        page()->chrome()->client()->setRootFullScreenLayer(0);
-#endif
         setAnimatingFullScreen(false);
 #if USE(ACCELERATED_COMPOSITING)
         view()->updateCompositingLayers();
+        page()->chrome()->client()->setRootFullScreenLayer(0);
 #endif
     }
     m_fullScreenChangeEventTargetQueue.append(m_fullScreenElement);

Modified: trunk/Source/WebKit2/ChangeLog (88653 => 88654)


--- trunk/Source/WebKit2/ChangeLog	2011-06-13 18:02:13 UTC (rev 88653)
+++ trunk/Source/WebKit2/ChangeLog	2011-06-13 18:05:09 UTC (rev 88654)
@@ -1,3 +1,41 @@
+2011-06-11  Jer Noble  <[email protected]>
+
+        Reviewed by Anders Carlsson.
+
+        Avoid flashing when exiting full-screen mode.
+        https://bugs.webkit.org/show_bug.cgi?id=62338
+
+        Instead of making a round-trip between processes by calling forceRepaint
+        and waiting for a callback, instead make a WebProcess-side call to
+        forceRepaintWithoutCallback before sending the ExitAcceleratedCompositingMode
+        message to the WebFullScreenControllerProxy. This also means we can get rid of
+        the dragImage creation and display.
+
+        Because this redraw will happen during the current run-loop instead of a future
+        one, make sure the background color has been set before the redraw in 
+        didEnterFullScreen().
+
+        Wait to hide the full-screen window until after we have received the 
+        ExitAcceleratedCompositingMode message.  By this time, repaint will have already
+        completed.
+
+        * UIProcess/mac/WKFullScreenWindowController.h:
+        * UIProcess/mac/WKFullScreenWindowController.mm:
+        (-[WKFullScreenWindowController finishedEnterFullScreenAnimation:]): Disable
+            screen updates, to be re-enabled during exitAcceleratedCompositingMode.
+        (-[WKFullScreenWindowController finishedExitFullScreenAnimation:]): Don't hide
+            the full-screen window here; wait for exitAcceleratedCompositing instead.
+        (-[WKFullScreenWindowController exitAcceleratedCompositingMode]): Collapse 
+            the redrawCompleted method into this one.
+        (-[WKFullScreenWindowController close]): Remove the reference to 
+            exitCompositedModeRepaintCompleted.
+        * WebProcess/FullScreen/WebFullScreenManager.cpp:
+        (WebKit::WebFullScreenManager::didEnterFullScreen): Set the full screen
+            background color first.
+        * WebProcess/FullScreen/mac/WebFullScreenManagerMac.mm:
+        (WebKit::WebFullScreenManagerMac::setRootFullScreenLayer): Repaint before
+            sending the ExitAcceleratedCompositingMode message. 
+
 2011-06-13  Tony Chang  <[email protected]>
 
         Reviewed by Adam Barth.

Modified: trunk/Source/WebKit2/UIProcess/mac/WKFullScreenWindowController.h (88653 => 88654)


--- trunk/Source/WebKit2/UIProcess/mac/WKFullScreenWindowController.h	2011-06-13 18:02:13 UTC (rev 88653)
+++ trunk/Source/WebKit2/UIProcess/mac/WKFullScreenWindowController.h	2011-06-13 18:05:09 UTC (rev 88654)
@@ -51,7 +51,6 @@
     BOOL _isWindowLoaded;
     BOOL _forceDisableAnimation;
     BOOL _isPlaying;
-    BOOL _isExitingAcceleratedCompositingMode;
     CGRect _initialFrame;    
     uint32_t _idleDisplaySleepAssertion;
     uint32_t _idleSystemSleepAssertion;

Modified: trunk/Source/WebKit2/UIProcess/mac/WKFullScreenWindowController.mm (88653 => 88654)


--- trunk/Source/WebKit2/UIProcess/mac/WKFullScreenWindowController.mm	2011-06-13 18:02:13 UTC (rev 88653)
+++ trunk/Source/WebKit2/UIProcess/mac/WKFullScreenWindowController.mm	2011-06-13 18:05:09 UTC (rev 88654)
@@ -47,8 +47,6 @@
 using namespace WebKit;
 using namespace WebCore;
 
-static void exitCompositedModeRepaintCompleted(WKErrorRef, void* context);
-
 #if defined(BUILDING_ON_LEOPARD)
 @interface CATransaction(SnowLeopardConvenienceFunctions)
 + (void)setDisableActions:(BOOL)flag;
@@ -248,6 +246,8 @@
     _isEnteringFullScreen = NO;
     
     if (completed) {                
+        NSDisableScreenUpdates();
+
         // Swap the webView placeholder into place.
         if (!_webViewPlaceholder)
             _webViewPlaceholder.adoptNS([[NSView alloc] init]);
@@ -354,11 +354,8 @@
     [self _updateMenuAndDockForFullScreen];
     [self _updatePowerAssertions];
     [NSCursor setHiddenUntilMouseMoves:YES];
-    [[self window] orderOut:self];
-    [[_webView window] makeKeyAndOrderFront:self];
 
     [self _manager]->didExitFullScreen();
-    NSEnableScreenUpdates();    
 }
 
 - (void)enterAcceleratedCompositingMode:(const WebKit::LayerTreeContext&)layerTreeContext
@@ -395,23 +392,6 @@
     if (!_layerHostingView)
         return;
 
-    ASSERT(!_isExitingAcceleratedCompositingMode);
-    if (_isExitingAcceleratedCompositingMode)
-        return;
-
-    [self retain]; // Balanced by release in exitCompositedModeRepaintCompleted below.
-    _isExitingAcceleratedCompositingMode = YES;
-
-    NSDisableScreenUpdates();
-    [self _page]->forceRepaint(VoidCallback::create(self, exitCompositedModeRepaintCompleted));
-}
-
-- (void)exitCompositedModeRepaintCompleted
-{
-    ASSERT(_isExitingAcceleratedCompositingMode);
-    if (!_isExitingAcceleratedCompositingMode)
-        return;
-
     [CATransaction begin];
     [CATransaction setDisableActions:YES];
     [_layerHostingView.get() removeFromSuperview];
@@ -419,20 +399,21 @@
     [_layerHostingView.get() setWantsLayer:NO];
     [[[self _fullScreenWindow] backgroundLayer] setHidden:YES];
     [CATransaction commit];
+
+    // Complete the animation out of full-screen mode
+    // by hiding the full-screen window:
+    if (!_isFullScreen) {
+        [[_webView window] display];
+        [[self window] orderOut:self];
+        [[_webView window] makeKeyAndOrderFront:self];
+    }
     
     _layerHostingView = 0;
     NSEnableScreenUpdates();
 
     [self _manager]->disposeOfLayerClient();
-    _isExitingAcceleratedCompositingMode = NO;
-    [self release]; // Balanced by retain in exitAcceleratedCompositingMode above.
 }
 
-static void exitCompositedModeRepaintCompleted(WKErrorRef, void* context)
-{
-    [static_cast<WKFullScreenWindowController *>(context) exitCompositedModeRepaintCompleted];
-}
-
 - (WebCore::IntRect)getFullScreenRect
 {
     return enclosingIntRect([[self window] frame]);
@@ -452,9 +433,6 @@
     if (_isExitingFullScreen)
         [self finishedExitFullScreenAnimation:YES];
 
-    if (_isExitingAcceleratedCompositingMode)
-        [self exitCompositedModeRepaintCompleted];
-
     [super close];
 }
 

Modified: trunk/Source/WebKit2/WebProcess/FullScreen/WebFullScreenManager.cpp (88653 => 88654)


--- trunk/Source/WebKit2/WebProcess/FullScreen/WebFullScreenManager.cpp	2011-06-13 18:02:13 UTC (rev 88653)
+++ trunk/Source/WebKit2/WebProcess/FullScreen/WebFullScreenManager.cpp	2011-06-13 18:05:09 UTC (rev 88654)
@@ -123,8 +123,8 @@
 void WebFullScreenManager::didEnterFullScreen()
 {
     ASSERT(m_element);
+    m_element->document()->setFullScreenRendererBackgroundColor(Color::black);
     m_element->document()->webkitDidEnterFullScreenForElement(m_element.get());
-    m_element->document()->setFullScreenRendererBackgroundColor(Color::black);
 }
 
 void WebFullScreenManager::willExitFullScreen()

Modified: trunk/Source/WebKit2/WebProcess/FullScreen/mac/WebFullScreenManagerMac.mm (88653 => 88654)


--- trunk/Source/WebKit2/WebProcess/FullScreen/mac/WebFullScreenManagerMac.mm	2011-06-13 18:02:13 UTC (rev 88653)
+++ trunk/Source/WebKit2/WebProcess/FullScreen/mac/WebFullScreenManagerMac.mm	2011-06-13 18:05:09 UTC (rev 88654)
@@ -134,35 +134,18 @@
 
 void WebFullScreenManagerMac::setRootFullScreenLayer(WebCore::GraphicsLayer* layer)
 {
-    if ((!m_rootLayer || m_rootLayer->children().isEmpty()) && !layer)
+    if (!m_rootLayer && !layer)
         return;
 
     if (!layer) {
+        m_page->forceRepaintWithoutCallback();
         m_page->send(Messages::WebFullScreenManagerProxy::ExitAcceleratedCompositingMode());
 
-        Frame* frame = m_element->document()->frame();
-        FrameView* view = frame ? frame->view() : 0;
-        DragImageRef dragImage = 0;
-        if (view) {
-            Color savedBackgroundColor = view->baseBackgroundColor();
-            bool savedIsTransparent = view->isTransparent();
-            view->setBaseBackgroundColor(Color::transparent);
-            view->setTransparent(true);
-            dragImage = frame->nodeImage(m_element.get());
-            view->setBaseBackgroundColor(savedBackgroundColor);
-            view->setTransparent(savedIsTransparent);
-        }
-
-        [CATransaction begin];
         PlatformLayer* rootPlatformLayer = m_rootLayer->platformLayer();
         [[NSNotificationCenter defaultCenter] postNotificationName:@"WebKitLayerHostChanged" object:rootPlatformLayer userInfo:nil];
-
         m_rootLayer->removeAllChildren();
         m_rootLayer->syncCompositingStateForThisLayerOnly();
         m_rootLayer = nullptr;
-        [rootPlatformLayer setContents:dragImage.get()];
-        [CATransaction commit];
-        
         return;
     }
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to