Fix <rdar://5713172> Focus lost from Gmail message body after toggling
authoraroben@apple.com <aroben@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 1 Feb 2008 01:01:43 +0000 (01:01 +0000)
committeraroben@apple.com <aroben@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 1 Feb 2008 01:01:43 +0000 (01:01 +0000)
        tabs

        This regressed in r29583. Prior to r29583, the code path that resulted
        in calling focusController->setFocusedFrame(0) was never getting hit.
        r29583 changed the code to adhere to the comment above the code and
        actually call setFocusedFrame(0) when losing focus to another part of
        the window. It turns out this is wrong behavior (and not what
        WebKit/mac does). The only time we should clear the focused frame is
        when we tab out of the WebView, and that's already taken care of by
        FocusController::advanceFocus. The code to clear the focused frame in
        WebView was written before FocusController::advanceFocus, so it was
        correct at one point but no longer is.

        We now never call setFocusedFrame(0) when the WebView receives a
        WM_KILLFOCUS message. Instead we just call setFocused(false) on the
        focused frame so that blur events will be sent. This matches what
        WebKit/mac does.

        Reviewed by Darin and Adele.

        * WebView.cpp:
        (WebViewWndProc): Also reworded a couple of comments to make them
        clearer.

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

WebKit/win/ChangeLog
WebKit/win/WebView.cpp

index 347071b..fa7a722 100644 (file)
@@ -1,5 +1,32 @@
 2008-01-31  Adam Roben  <aroben@apple.com>
 
+        Fix <rdar://5713172> Focus lost from Gmail message body after toggling
+        tabs
+
+        This regressed in r29583. Prior to r29583, the code path that resulted
+        in calling focusController->setFocusedFrame(0) was never getting hit.
+        r29583 changed the code to adhere to the comment above the code and
+        actually call setFocusedFrame(0) when losing focus to another part of
+        the window. It turns out this is wrong behavior (and not what
+        WebKit/mac does). The only time we should clear the focused frame is
+        when we tab out of the WebView, and that's already taken care of by
+        FocusController::advanceFocus. The code to clear the focused frame in
+        WebView was written before FocusController::advanceFocus, so it was
+        correct at one point but no longer is.
+
+        We now never call setFocusedFrame(0) when the WebView receives a
+        WM_KILLFOCUS message. Instead we just call setFocused(false) on the
+        focused frame so that blur events will be sent. This matches what
+        WebKit/mac does.
+
+        Reviewed by Darin and Adele.
+
+        * WebView.cpp:
+        (WebViewWndProc): Also reworded a couple of comments to make them
+        clearer.
+
+2008-01-31  Adam Roben  <aroben@apple.com>
+
         Let WebCore take care of the highlight drawing entirely
 
         Reviewed by Darin.
index ba6765b..76f81c4 100644 (file)
@@ -1686,8 +1686,8 @@ static LRESULT CALLBACK WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam, L
 
             FocusController* focusController = webView->page()->focusController();
             if (Frame* frame = focusController->focusedFrame()) {
-                // If the previously focused window is a child of ours (for example a plugin), don't send any
-                // focus events.
+                // Send focus events unless the previously focused window is a
+                // child of ours (for example a plugin).
                 if (!IsChild(hWnd, reinterpret_cast<HWND>(wParam)))
                     frame->selectionController()->setFocused(true);
             } else
@@ -1702,20 +1702,12 @@ static LRESULT CALLBACK WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam, L
                 SUCCEEDED(uiDelegate->QueryInterface(IID_IWebUIDelegatePrivate, (void**) &uiDelegatePrivate)) && uiDelegatePrivate)
                 uiDelegatePrivate->webViewLostFocus(webView, (OLE_HANDLE)(ULONG64)newFocusWnd);
 
-            // However here we have to be careful.  If we are losing focus because of a deactivate,
-            // then we need to remember our focused target for restoration later.  
-            // If we are losing focus to another part of our window, then we are no longer focused for real
-            // and we need to clear out the focused target.
             FocusController* focusController = webView->page()->focusController();
-            webView->resetIME(focusController->focusedOrMainFrame());
-            if (webView->topLevelParent() != findTopLevelParent(newFocusWnd)) {
-                if (Frame* frame = focusController->focusedOrMainFrame()) {
-                    // If we're losing focus to a child of ours, don't send blur events.
-                    if (!IsChild(hWnd, newFocusWnd))
-                        frame->selectionController()->setFocused(false);
-                }
-            } else
-                focusController->setFocusedFrame(0);
+            Frame* frame = focusController->focusedOrMainFrame();
+            webView->resetIME(frame);
+            // Send blur events unless we're losing focus to a child of ours.
+            if (!IsChild(hWnd, newFocusWnd))
+                frame->selectionController()->setFocused(false);
             break;
         }
         case WM_WINDOWPOSCHANGED: