Title: [87656] trunk/Source/WebKit2
Revision
87656
Author
[email protected]
Date
2011-05-29 17:19:45 -0700 (Sun, 29 May 2011)

Log Message

2011-05-29  Darin Adler  <[email protected]>

        Reviewed by Dan Bernstein.

        Race condition in full screen controller, which leads to problem when web process crashes
        https://bugs.webkit.org/show_bug.cgi?id=61707

        Second try at this. First try could lead to a WKView leak.

        * UIProcess/mac/WKFullScreenWindowController.h: Added _isExitingAcceleratedCompositingMode.
        Needed to track whether we have retained so we don't leak if the page goes away before
        we get the callback.

        * UIProcess/mac/WKFullScreenWindowController.mm:
        (-[WKFullScreenWindowController exitAcceleratedCompositingMode]): Added code to set
        the new variable to YES.
        (-[WKFullScreenWindowController exitCompositedModeRepaintCompleted]): Added code to
        deal with the new boolean and to release.
        (exitCompositedModeRepaintCompleted): Removed the release that was here.
        (-[WKFullScreenWindowController close]): Added a call to exitCompositedModeRepaintCompleted
        here. We're as complete as we'll ever be when we're closed; we can't get the callback
        after that point.

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (87655 => 87656)


--- trunk/Source/WebKit2/ChangeLog	2011-05-30 00:00:34 UTC (rev 87655)
+++ trunk/Source/WebKit2/ChangeLog	2011-05-30 00:19:45 UTC (rev 87656)
@@ -1,3 +1,26 @@
+2011-05-29  Darin Adler  <[email protected]>
+
+        Reviewed by Dan Bernstein.
+
+        Race condition in full screen controller, which leads to problem when web process crashes
+        https://bugs.webkit.org/show_bug.cgi?id=61707
+
+        Second try at this. First try could lead to a WKView leak.
+
+        * UIProcess/mac/WKFullScreenWindowController.h: Added _isExitingAcceleratedCompositingMode.
+        Needed to track whether we have retained so we don't leak if the page goes away before
+        we get the callback.
+
+        * UIProcess/mac/WKFullScreenWindowController.mm:
+        (-[WKFullScreenWindowController exitAcceleratedCompositingMode]): Added code to set
+        the new variable to YES.
+        (-[WKFullScreenWindowController exitCompositedModeRepaintCompleted]): Added code to
+        deal with the new boolean and to release.
+        (exitCompositedModeRepaintCompleted): Removed the release that was here.
+        (-[WKFullScreenWindowController close]): Added a call to exitCompositedModeRepaintCompleted
+        here. We're as complete as we'll ever be when we're closed; we can't get the callback
+        after that point.
+
 2011-05-29  Sam Weinig  <[email protected]>
 
         Reviewed by Anders Carlsson.

Modified: trunk/Source/WebKit2/UIProcess/mac/WKFullScreenWindowController.h (87655 => 87656)


--- trunk/Source/WebKit2/UIProcess/mac/WKFullScreenWindowController.h	2011-05-30 00:00:34 UTC (rev 87655)
+++ trunk/Source/WebKit2/UIProcess/mac/WKFullScreenWindowController.h	2011-05-30 00:19:45 UTC (rev 87656)
@@ -51,6 +51,7 @@
     BOOL _isWindowLoaded;
     BOOL _forceDisableAnimation;
     BOOL _isPlaying;
+    BOOL _isExitingAcceleratedCompositingMode;
     CGRect _initialFrame;    
     uint32_t _idleDisplaySleepAssertion;
     uint32_t _idleSystemSleepAssertion;

Modified: trunk/Source/WebKit2/UIProcess/mac/WKFullScreenWindowController.mm (87655 => 87656)


--- trunk/Source/WebKit2/UIProcess/mac/WKFullScreenWindowController.mm	2011-05-30 00:00:34 UTC (rev 87655)
+++ trunk/Source/WebKit2/UIProcess/mac/WKFullScreenWindowController.mm	2011-05-30 00:19:45 UTC (rev 87656)
@@ -394,13 +394,23 @@
     if (!_layerHostingView)
         return;
 
+    ASSERT(!_isExitingAcceleratedCompositingMode);
+    if (_isExitingAcceleratedCompositingMode)
+        return;
+
+    [self retain]; // Balanced by release in exitCompositedModeRepaintCompleted below.
+    _isExitingAcceleratedCompositingMode = YES;
+
     NSDisableScreenUpdates();
-    [self retain]; // Balanced by release in exitCompositedModeRepaintCompleted below.
     [self _page]->forceRepaint(VoidCallback::create(self, exitCompositedModeRepaintCompleted));
 }
 
 - (void)exitCompositedModeRepaintCompleted
-{    
+{
+    ASSERT(_isExitingAcceleratedCompositingMode);
+    if (!_isExitingAcceleratedCompositingMode)
+        return;
+
     [CATransaction begin];
     [CATransaction setDisableActions:YES];
     [_layerHostingView.get() removeFromSuperview];
@@ -411,13 +421,14 @@
     
     _layerHostingView = 0;
     NSEnableScreenUpdates();
+
+    _isExitingAcceleratedCompositingMode = NO;
+    [self release]; // Balanced by retain in exitAcceleratedCompositingMode above.
 }
 
 static void exitCompositedModeRepaintCompleted(WKErrorRef, void* context)
 {
-    WKFullScreenWindowController *controller = static_cast<WKFullScreenWindowController *>(context);
-    [controller exitCompositedModeRepaintCompleted];
-    [controller release]; // Balanced by retain in exitAcceleratedCompositingMode above.
+    [static_cast<WKFullScreenWindowController *>(context) exitCompositedModeRepaintCompleted];
 }
 
 - (WebCore::IntRect)getFullScreenRect
@@ -439,6 +450,9 @@
     if (_isExitingFullScreen)
         [self finishedExitFullScreenAnimation:YES];
 
+    if (_isExitingAcceleratedCompositingMode)
+        [self exitCompositedModeRepaintCompleted];
+
     [super close];
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to