- 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;
}