Changeset 88654 in webkit


Ignore:
Timestamp:
Jun 13, 2011 11:05:09 AM (13 years ago)
Author:
jer.noble@apple.com
Message:

2011-06-11 Jer Noble <jer.noble@apple.com>

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 <jer.noble@apple.com>

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.

Location:
trunk/Source
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r88653 r88654  
     12011-06-11  Jer Noble  <jer.noble@apple.com>
     2
     3        Reviewed by Anders Carlsson.
     4
     5        Avoid flashing when exiting full-screen mode.
     6        https://bugs.webkit.org/show_bug.cgi?id=62338
     7
     8        No new tests; covered by the existing full-screen tests.
     9
     10        Now that we are forcing a repaint inside of setRootFullScreenLayer() instead of during
     11        the next run loop, make sure that we have disabled animation before calling
     12        setRootFullScreenLayer() so that the RenderFullScreen renderer and its contents are
     13        painted.
     14
     15        * dom/Document.cpp:
     16        (WebCore::Document::webkitDidEnterFullScreenForElement):
     17
    1182011-06-10  Jer Noble  <jer.noble@apple.com>
    219
  • trunk/Source/WebCore/dom/Document.cpp

    r88629 r88654  
    47934793
    47944794    if (m_fullScreenRenderer) {
    4795 #if USE(ACCELERATED_COMPOSITING)
    4796         page()->chrome()->client()->setRootFullScreenLayer(0);
    4797 #endif
    47984795        setAnimatingFullScreen(false);
    47994796#if USE(ACCELERATED_COMPOSITING)
    48004797        view()->updateCompositingLayers();
     4798        page()->chrome()->client()->setRootFullScreenLayer(0);
    48014799#endif
    48024800    }
  • trunk/Source/WebKit2/ChangeLog

    r88650 r88654  
     12011-06-11  Jer Noble  <jer.noble@apple.com>
     2
     3        Reviewed by Anders Carlsson.
     4
     5        Avoid flashing when exiting full-screen mode.
     6        https://bugs.webkit.org/show_bug.cgi?id=62338
     7
     8        Instead of making a round-trip between processes by calling forceRepaint
     9        and waiting for a callback, instead make a WebProcess-side call to
     10        forceRepaintWithoutCallback before sending the ExitAcceleratedCompositingMode
     11        message to the WebFullScreenControllerProxy. This also means we can get rid of
     12        the dragImage creation and display.
     13
     14        Because this redraw will happen during the current run-loop instead of a future
     15        one, make sure the background color has been set before the redraw in
     16        didEnterFullScreen().
     17
     18        Wait to hide the full-screen window until after we have received the
     19        ExitAcceleratedCompositingMode message.  By this time, repaint will have already
     20        completed.
     21
     22        * UIProcess/mac/WKFullScreenWindowController.h:
     23        * UIProcess/mac/WKFullScreenWindowController.mm:
     24        (-[WKFullScreenWindowController finishedEnterFullScreenAnimation:]): Disable
     25            screen updates, to be re-enabled during exitAcceleratedCompositingMode.
     26        (-[WKFullScreenWindowController finishedExitFullScreenAnimation:]): Don't hide
     27            the full-screen window here; wait for exitAcceleratedCompositing instead.
     28        (-[WKFullScreenWindowController exitAcceleratedCompositingMode]): Collapse
     29            the redrawCompleted method into this one.
     30        (-[WKFullScreenWindowController close]): Remove the reference to
     31            exitCompositedModeRepaintCompleted.
     32        * WebProcess/FullScreen/WebFullScreenManager.cpp:
     33        (WebKit::WebFullScreenManager::didEnterFullScreen): Set the full screen
     34            background color first.
     35        * WebProcess/FullScreen/mac/WebFullScreenManagerMac.mm:
     36        (WebKit::WebFullScreenManagerMac::setRootFullScreenLayer): Repaint before
     37            sending the ExitAcceleratedCompositingMode message.
     38
    1392011-06-13  Tony Chang  <tony@chromium.org>
    240
  • trunk/Source/WebKit2/UIProcess/mac/WKFullScreenWindowController.h

    r87656 r88654  
    5252    BOOL _forceDisableAnimation;
    5353    BOOL _isPlaying;
    54     BOOL _isExitingAcceleratedCompositingMode;
    5554    CGRect _initialFrame;   
    5655    uint32_t _idleDisplaySleepAssertion;
  • trunk/Source/WebKit2/UIProcess/mac/WKFullScreenWindowController.mm

    r88599 r88654  
    4848using namespace WebCore;
    4949
    50 static void exitCompositedModeRepaintCompleted(WKErrorRef, void* context);
    51 
    5250#if defined(BUILDING_ON_LEOPARD)
    5351@interface CATransaction(SnowLeopardConvenienceFunctions)
     
    249247   
    250248    if (completed) {               
     249        NSDisableScreenUpdates();
     250
    251251        // Swap the webView placeholder into place.
    252252        if (!_webViewPlaceholder)
     
    355355    [self _updatePowerAssertions];
    356356    [NSCursor setHiddenUntilMouseMoves:YES];
    357     [[self window] orderOut:self];
    358     [[_webView window] makeKeyAndOrderFront:self];
    359357
    360358    [self _manager]->didExitFullScreen();
    361     NSEnableScreenUpdates();   
    362359}
    363360
     
    394391{
    395392    if (!_layerHostingView)
    396         return;
    397 
    398     ASSERT(!_isExitingAcceleratedCompositingMode);
    399     if (_isExitingAcceleratedCompositingMode)
    400         return;
    401 
    402     [self retain]; // Balanced by release in exitCompositedModeRepaintCompleted below.
    403     _isExitingAcceleratedCompositingMode = YES;
    404 
    405     NSDisableScreenUpdates();
    406     [self _page]->forceRepaint(VoidCallback::create(self, exitCompositedModeRepaintCompleted));
    407 }
    408 
    409 - (void)exitCompositedModeRepaintCompleted
    410 {
    411     ASSERT(_isExitingAcceleratedCompositingMode);
    412     if (!_isExitingAcceleratedCompositingMode)
    413393        return;
    414394
     
    420400    [[[self _fullScreenWindow] backgroundLayer] setHidden:YES];
    421401    [CATransaction commit];
     402
     403    // Complete the animation out of full-screen mode
     404    // by hiding the full-screen window:
     405    if (!_isFullScreen) {
     406        [[_webView window] display];
     407        [[self window] orderOut:self];
     408        [[_webView window] makeKeyAndOrderFront:self];
     409    }
    422410   
    423411    _layerHostingView = 0;
     
    425413
    426414    [self _manager]->disposeOfLayerClient();
    427     _isExitingAcceleratedCompositingMode = NO;
    428     [self release]; // Balanced by retain in exitAcceleratedCompositingMode above.
    429 }
    430 
    431 static void exitCompositedModeRepaintCompleted(WKErrorRef, void* context)
    432 {
    433     [static_cast<WKFullScreenWindowController *>(context) exitCompositedModeRepaintCompleted];
    434415}
    435416
     
    452433    if (_isExitingFullScreen)
    453434        [self finishedExitFullScreenAnimation:YES];
    454 
    455     if (_isExitingAcceleratedCompositingMode)
    456         [self exitCompositedModeRepaintCompleted];
    457435
    458436    [super close];
  • trunk/Source/WebKit2/WebProcess/FullScreen/WebFullScreenManager.cpp

    r86135 r88654  
    124124{
    125125    ASSERT(m_element);
     126    m_element->document()->setFullScreenRendererBackgroundColor(Color::black);
    126127    m_element->document()->webkitDidEnterFullScreenForElement(m_element.get());
    127     m_element->document()->setFullScreenRendererBackgroundColor(Color::black);
    128128}
    129129
  • trunk/Source/WebKit2/WebProcess/FullScreen/mac/WebFullScreenManagerMac.mm

    r88599 r88654  
    135135void WebFullScreenManagerMac::setRootFullScreenLayer(WebCore::GraphicsLayer* layer)
    136136{
    137     if ((!m_rootLayer || m_rootLayer->children().isEmpty()) && !layer)
     137    if (!m_rootLayer && !layer)
    138138        return;
    139139
    140140    if (!layer) {
     141        m_page->forceRepaintWithoutCallback();
    141142        m_page->send(Messages::WebFullScreenManagerProxy::ExitAcceleratedCompositingMode());
    142143
    143         Frame* frame = m_element->document()->frame();
    144         FrameView* view = frame ? frame->view() : 0;
    145         DragImageRef dragImage = 0;
    146         if (view) {
    147             Color savedBackgroundColor = view->baseBackgroundColor();
    148             bool savedIsTransparent = view->isTransparent();
    149             view->setBaseBackgroundColor(Color::transparent);
    150             view->setTransparent(true);
    151             dragImage = frame->nodeImage(m_element.get());
    152             view->setBaseBackgroundColor(savedBackgroundColor);
    153             view->setTransparent(savedIsTransparent);
    154         }
    155 
    156         [CATransaction begin];
    157144        PlatformLayer* rootPlatformLayer = m_rootLayer->platformLayer();
    158145        [[NSNotificationCenter defaultCenter] postNotificationName:@"WebKitLayerHostChanged" object:rootPlatformLayer userInfo:nil];
    159 
    160146        m_rootLayer->removeAllChildren();
    161147        m_rootLayer->syncCompositingStateForThisLayerOnly();
    162148        m_rootLayer = nullptr;
    163         [rootPlatformLayer setContents:dragImage.get()];
    164         [CATransaction commit];
    165        
    166149        return;
    167150    }
Note: See TracChangeset for help on using the changeset viewer.