Actually pause the process while Drosera is at a breakpoint
authoraroben@apple.com <aroben@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Mar 2008 17:00:22 +0000 (17:00 +0000)
committeraroben@apple.com <aroben@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Mar 2008 17:00:22 +0000 (17:00 +0000)
         WebScriptDebugServer::suspendProcessIfPaused is supposed to pause the
         process while Drosera is at a breakpoint. Previously we were just
         starting a message pump that would deliver messages to all windows in
         the process, allowing mouse events, JS timers, etc. to execute.

         Now we only deliver messages to COM's message window, which is all we
         need to allow RPC to function.

         Reviewed by Anders.

         * WebScriptDebugServer.cpp:
         (comMessageWindow): Added. Finds COM's message window.
         (WebScriptDebugServer::suspendProcessIfPaused): Only deliver messages
         to COM's message window so that mouse events, JS timers, etc., won't
         execute.

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

WebKit/win/ChangeLog
WebKit/win/WebScriptDebugServer.cpp

index e37d68268fe184315e2cd6b24d7b0c7ff5a7fc30..007d8d898809f02ce3308889d402221db6f8d441 100644 (file)
@@ -1,3 +1,23 @@
+2008-03-04  Adam Roben  <aroben@apple.com>
+
+        Actually pause the process while Drosera is at a breakpoint
+
+        WebScriptDebugServer::suspendProcessIfPaused is supposed to pause the
+        process while Drosera is at a breakpoint. Previously we were just
+        starting a message pump that would deliver messages to all windows in
+        the process, allowing mouse events, JS timers, etc. to execute.
+
+        Now we only deliver messages to COM's message window, which is all we
+        need to allow RPC to function.
+
+        Reviewed by Anders.
+
+        * WebScriptDebugServer.cpp:
+        (comMessageWindow): Added. Finds COM's message window.
+        (WebScriptDebugServer::suspendProcessIfPaused): Only deliver messages
+        to COM's message window so that mouse events, JS timers, etc., won't
+        execute.
+
 2008-03-03  Adam Roben  <aroben@apple.com>
 
         Generate WebScriptCallFrame instances dynamically
index 734505d57fa398a3f17582a0e55b997d8bd844ff..ccbe258e915f7aadca81f48ee526a544a48052f4 100644 (file)
@@ -188,6 +188,28 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::isPaused(
     return S_OK;
 }
 
+static HWND comMessageWindow()
+{
+    static bool initialized;
+    static HWND window;
+
+    if (initialized)
+        return window;
+    initialized = true;
+
+    static LPCTSTR windowClass = TEXT("OleMainThreadWndClass");
+    static LPCTSTR windowText = TEXT("OleMainThreadWndName");
+    static const DWORD currentProcess = GetCurrentProcessId();
+
+    window = 0;
+    DWORD windowProcess = 0;
+    do {
+        window = FindWindowEx(HWND_MESSAGE, window, windowClass, windowText);
+        GetWindowThreadProcessId(window, &windowProcess);
+    } while (window && windowProcess != currentProcess);
+
+    return window;
+}
 
 void WebScriptDebugServer::suspendProcessIfPaused()
 {
@@ -198,8 +220,13 @@ void WebScriptDebugServer::suspendProcessIfPaused()
 
     alreadyHere = true;
 
+    // We only deliver messages to COM's message window to pause the process while still allowing RPC to work.
+    // FIXME: It would be nice if we could keep delivering WM_[NC]PAINT messages to all windows to keep them painting on XP.
+
+    HWND messageWindow = comMessageWindow();
+
     MSG msg;
-    while (m_paused && GetMessage(&msg, 0, 0, 0)) {
+    while (m_paused && GetMessage(&msg, messageWindow, 0, 0)) {
         TranslateMessage(&msg);
         DispatchMessage(&msg);
     }