[WinCairo] Crash when plugin window is destroyed.
authorpeavo@outlook.com <peavo@outlook.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 25 Mar 2015 17:55:28 +0000 (17:55 +0000)
committerpeavo@outlook.com <peavo@outlook.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 25 Mar 2015 17:55:28 +0000 (17:55 +0000)
https://bugs.webkit.org/show_bug.cgi?id=142905

Reviewed by Alex Christensen.

When a plugin window is destroyed with the Win32 api function DestroyWindow,
the system will send a synchronous WM_PARENTNOTIFY message to the WebView.
The WebView window procedure will, when processing the WM_PARENTNOTIFY message,
call UpdateWindow to paint synchronously. This will cause reentrancy problems,
since we're already called from WebCore code, and then reenter WebCore painting code.
We should avoid calling UpdateWindow when handling the WM_PARENTNOTIFY message.

* WebView.cpp:
(WebView::WebViewWndProc):
(WebView::updateWindowIfNeeded):
* WebView.h:

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

Source/WebKit/win/ChangeLog
Source/WebKit/win/WebView.cpp
Source/WebKit/win/WebView.h

index b200c15..97b863d 100644 (file)
@@ -1,3 +1,22 @@
+2015-03-25  Per Arne Vollan  <peavo@outlook.com>
+
+        [WinCairo] Crash when plugin window is destroyed.
+        https://bugs.webkit.org/show_bug.cgi?id=142905
+
+        Reviewed by Alex Christensen.
+
+        When a plugin window is destroyed with the Win32 api function DestroyWindow,
+        the system will send a synchronous WM_PARENTNOTIFY message to the WebView.
+        The WebView window procedure will, when processing the WM_PARENTNOTIFY message,
+        call UpdateWindow to paint synchronously. This will cause reentrancy problems,
+        since we're already called from WebCore code, and then reenter WebCore painting code.
+        We should avoid calling UpdateWindow when handling the WM_PARENTNOTIFY message.
+
+        * WebView.cpp:
+        (WebView::WebViewWndProc):
+        (WebView::updateWindowIfNeeded):
+        * WebView.h:
+
 2015-03-19  Chris Dumez  <cdumez@apple.com>
 
         Clean up DOMTimer related settings
index 5a6f409..6641585 100644 (file)
@@ -2501,8 +2501,7 @@ LRESULT CALLBACK WebView::WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam,
             break;
     }
 
-    if (webView->needsDisplay() && message != WM_PAINT)
-        ::UpdateWindow(hWnd);
+    webView->updateWindowIfNeeded(hWnd, message);
 
     if (!handled)
         lResult = DefWindowProc(hWnd, message, wParam, lParam);
@@ -2511,6 +2510,24 @@ LRESULT CALLBACK WebView::WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam,
     return (message == WM_KEYDOWN || message == WM_SYSKEYDOWN || message == WM_KEYUP || message == WM_SYSKEYUP) ? !handled : lResult;
 }
 
+void WebView::updateWindowIfNeeded(HWND hWnd, UINT message)
+{
+    if (!needsDisplay())
+        return;
+
+    // Care should be taken when updating the window from the window procedure.
+    // Updating the window in response to e.g. WM_PARENTNOTIFY may cause reentrancy problems,
+    // because WM_PARENTNOTIFY is sent synchronously to the parent window when e.g. DestroyWindow() is called.
+
+    switch (message) {
+    case WM_PAINT:
+    case WM_PARENTNOTIFY:
+        return;
+    }
+
+    ::UpdateWindow(hWnd);
+}
+
 bool WebView::developerExtrasEnabled() const
 {
     if (m_preferences->developerExtrasDisabledByOverride())
index c005d14..b4f8b67 100644 (file)
@@ -1026,6 +1026,8 @@ protected:
     static bool registerWebViewWindowClass();
     static LRESULT CALLBACK WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
 
+    void updateWindowIfNeeded(HWND hWnd, UINT message);
+
     HIMC getIMMContext();
     void releaseIMMContext(HIMC);
     static bool allowSiteSpecificHacks() { return s_allowSiteSpecificHacks; }