2009-12-07 Finnur Thorarinsson <finnur.webkit@gmail.com>
authoreric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 8 Dec 2009 01:22:23 +0000 (01:22 +0000)
committereric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 8 Dec 2009 01:22:23 +0000 (01:22 +0000)
        Reviewed by Darin Fisher.

        A patch for Chromium to restrict the scope of the Gmail focus fix,
        where we set the Selection to 0,0 for content-editable fields and
        also make sure we set the selection end-state for find to select the
        text found (when not focusing a link we found).
        WebKit bug: https://bugs.webkit.org/show_bug.cgi?id=32248

        * src/WebFrameImpl.cpp:
        (WebKit::WebFrameImpl::setFindEndstateFocusAndSelection):
        * src/WebViewImpl.cpp:
        (WebKit::WebViewImpl::setFocus):

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

WebKit/chromium/ChangeLog
WebKit/chromium/src/WebFrameImpl.cpp
WebKit/chromium/src/WebViewImpl.cpp

index 1da6e3de41c256a8227d187c51124d9480cb15a2..58b78eeca89a3afd9fc96108158cf560c5e075f6 100644 (file)
@@ -1,3 +1,18 @@
+2009-12-07  Finnur Thorarinsson  <finnur.webkit@gmail.com>
+
+        Reviewed by Darin Fisher.
+
+        A patch for Chromium to restrict the scope of the Gmail focus fix,
+        where we set the Selection to 0,0 for content-editable fields and
+        also make sure we set the selection end-state for find to select the
+        text found (when not focusing a link we found).
+        WebKit bug: https://bugs.webkit.org/show_bug.cgi?id=32248
+
+        * src/WebFrameImpl.cpp:
+        (WebKit::WebFrameImpl::setFindEndstateFocusAndSelection):
+        * src/WebViewImpl.cpp:
+        (WebKit::WebViewImpl::setFocus):
+
 2009-12-07  Dmitry Titov  <dimich@chromium.org>
 
         Rubber-stamped by Darin Adler.
 2009-12-07  Dmitry Titov  <dimich@chromium.org>
 
         Rubber-stamped by Darin Adler.
index f722860b6296ae7d46e2f1b2713e8d95dd158b99..45066967e53d586a817d2d325b580c00429909c6 100644 (file)
@@ -1669,19 +1669,28 @@ void WebFrameImpl::setFindEndstateFocusAndSelection()
         if (node && node != frame()->document()) {
             // Found a focusable parent node. Set focus to it.
             frame()->document()->setFocusedNode(node);
         if (node && node != frame()->document()) {
             // Found a focusable parent node. Set focus to it.
             frame()->document()->setFocusedNode(node);
-        } else {
-            // Iterate over all the nodes in the range until we find a focusable node.
-            // This, for example, sets focus to the first link if you search for
-            // text and text that is within one or more links.
-            node = m_activeMatch->firstNode();
-            while (node && node != m_activeMatch->pastLastNode()) {
-                if (node->isFocusable()) {
-                    frame()->document()->setFocusedNode(node);
-                    break;
-                }
-                node = node->traverseNextNode();
+            return;
+        }
+
+        // Iterate over all the nodes in the range until we find a focusable node.
+        // This, for example, sets focus to the first link if you search for
+        // text and text that is within one or more links.
+        node = m_activeMatch->firstNode();
+        while (node && node != m_activeMatch->pastLastNode()) {
+            if (node->isFocusable()) {
+                frame()->document()->setFocusedNode(node);
+                return;
             }
             }
+            node = node->traverseNextNode();
         }
         }
+
+        // No node related to the active match was focusable, so set the
+        // active match as the selection (so that when you end the Find session,
+        // you'll have the last thing you found highlighted) and make sure that
+        // we have nothing focused (otherwise you might have text selected but
+        // a link focused, which is weird).
+        frame()->selection()->setSelection(m_activeMatch.get());
+        frame()->document()->setFocusedNode(0);
     }
 }
 
     }
 }
 
index 834e1ca1874b5c6d5759531ba0a933a83966b34f..1f89ffe6ebcce15a1e14625afda80da946492d0d 100644 (file)
@@ -925,11 +925,11 @@ void WebViewImpl::setFocus(bool enable)
                 Element* element = static_cast<Element*>(focusedNode);
                 if (element->isTextFormControl())
                     element->updateFocusAppearance(true);
                 Element* element = static_cast<Element*>(focusedNode);
                 if (element->isTextFormControl())
                     element->updateFocusAppearance(true);
-                else {
+                else if (focusedNode->isContentEditable()) {
                     // updateFocusAppearance() selects all the text of
                     // contentseditable DIVs. So we set the selection explicitly
                     // instead. Note that this has the side effect of moving the
                     // updateFocusAppearance() selects all the text of
                     // contentseditable DIVs. So we set the selection explicitly
                     // instead. Note that this has the side effect of moving the
-                    // caret back to the begining of the text.
+                    // caret back to the beginning of the text.
                     Position position(focusedNode, 0,
                                       Position::PositionIsOffsetInAnchor);
                     focusedFrame->selection()->setSelection(
                     Position position(focusedNode, 0,
                                       Position::PositionIsOffsetInAnchor);
                     focusedFrame->selection()->setSelection(