Notice when the backing store goes away after DidSetSize
authoraroben@apple.com <aroben@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 10 Feb 2011 12:40:09 +0000 (12:40 +0000)
committeraroben@apple.com <aroben@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 10 Feb 2011 12:40:09 +0000 (12:40 +0000)
Fixes <http://webkit.org/b/54142> <rdar://problem/8979365> Crash in
DrawingAreaProxyImpl::paint when WKView paints after being resized while hidden

Reviewed by Darin Adler.

Source/WebKit2:

* UIProcess/DrawingAreaProxyImpl.cpp:
(WebKit::DrawingAreaProxyImpl::paint): Null-check m_backingStore after waiting for
DidSetSize, as m_backingStore can go away when we receive that message. This is the bug fix.
Also moved the accelerated compositing check inside the block where we wait for DidSetSize.
If we didn't wait for DidSetSize, we already know that we're not in accelerated compositing
mode (and asserted so earlier in this function).

Tools:

Test that having a WKView paint after being resized while hidden doesn't cause a crash

* TestWebKitAPI/Tests/WebKit2/win/ResizeViewWhileHidden.cpp:
(TestWebKitAPI::TEST): Force the WKView to paint after resizing it while hidden.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@78199 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/UIProcess/DrawingAreaProxyImpl.cpp
Tools/ChangeLog
Tools/TestWebKitAPI/Tests/WebKit2/win/ResizeViewWhileHidden.cpp

index 50eadb063ce440e68a18f2ac320fba9639dd6732..2bfb1cb0e65022231ec960824375fef8ebe6b69e 100644 (file)
@@ -1,3 +1,19 @@
+2011-02-09  Adam Roben  <aroben@apple.com>
+
+        Notice when the backing store goes away after DidSetSize
+
+        Fixes <http://webkit.org/b/54142> <rdar://problem/8979365> Crash in
+        DrawingAreaProxyImpl::paint when WKView paints after being resized while hidden
+
+        Reviewed by Darin Adler.
+
+        * UIProcess/DrawingAreaProxyImpl.cpp:
+        (WebKit::DrawingAreaProxyImpl::paint): Null-check m_backingStore after waiting for
+        DidSetSize, as m_backingStore can go away when we receive that message. This is the bug fix.
+        Also moved the accelerated compositing check inside the block where we wait for DidSetSize.
+        If we didn't wait for DidSetSize, we already know that we're not in accelerated compositing
+        mode (and asserted so earlier in this function).
+
 2011-02-09  Adam Roben  <aroben@apple.com>
 
         Decode a null SharedMemory::Handle correctly on Windows
index 01ae68f7a1d9d9fe54f0c81e27d8121b6dcb6552..6a658413809ff5817193359e6f079815a51a1975 100644 (file)
@@ -74,11 +74,11 @@ void DrawingAreaProxyImpl::paint(BackingStore::PlatformGraphicsContext context,
         // Wait for a DidSetSize message that contains the new bits before we paint
         // what's currently in the backing store.
         waitForAndDispatchDidSetSize();
-    }
 
-    // Dispatching DidSetSize could change the compositing mode, return if that happens.
-    if (isInAcceleratedCompositingMode())
-        return;
+        // Dispatching DidSetSize could destroy our backing store or change the compositing mode.
+        if (!m_backingStore || isInAcceleratedCompositingMode())
+            return;
+    }
 
     m_backingStore->paint(context, rect);
     unpaintedRegion.subtract(IntRect(IntPoint(), m_backingStore->size()));
index 89424b3402933fb0c442e7f6223a711cfa8ab46f..1098c12a3d8475a76d4a33102df163491d622006 100644 (file)
@@ -1,3 +1,15 @@
+2011-02-09  Adam Roben  <aroben@apple.com>
+
+        Test that having a WKView paint after being resized while hidden doesn't cause a crash
+
+        Test for <http://webkit.org/b/54142> <rdar://problem/8979365> Crash in
+        DrawingAreaProxyImpl::paint when WKView paints after being resized while hidden
+
+        Reviewed by Darin Adler.
+
+        * TestWebKitAPI/Tests/WebKit2/win/ResizeViewWhileHidden.cpp:
+        (TestWebKitAPI::TEST): Force the WKView to paint after resizing it while hidden.
+
 2011-02-09  Adam Roben  <aroben@apple.com>
 
         Add a test that resizes a WKView while it's hidden
index 13cee74b40d6d01ad7d1e146be0ee1ff73aba870..7310e6c5a9fe9d029312de9d0335a6499e2ed3e6 100644 (file)
@@ -112,6 +112,9 @@ TEST(WebKit2, ResizeViewWhileHidden)
     webView.resizeTo(originalRect.right - originalRect.left, originalRect.bottom - originalRect.top);
     ::ShowWindow(window, SW_SHOW);
 
+    // Force the WKView to paint to try to trigger <http://webkit.org/b/54142>.
+    ::SendMessage(window, WM_PAINT, 0, 0);
+
     // In Debug builds without the fix for <http://webkit.org/b/54141>, the web process will assert
     // at this point.
     // FIXME: It would be good to have a way to check that our behavior is correct in Release