Reviewed by Darin.
authorharrison <harrison@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 31 Jan 2005 23:52:28 +0000 (23:52 +0000)
committerharrison <harrison@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 31 Jan 2005 23:52:28 +0000 (23:52 +0000)
        <rdar://problem/3961239> AX Setting AXFocused on AXScrollArea of AXWebArea will cause keyboard selection change

        * WebView.subproj/WebHTMLView.m:
        (-[WebHTMLView maintainsInactiveSelection]):
        Keep the selection when the new first respomder is our own scrollview, in both editable and non-editaqble content.

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

WebKit/ChangeLog
WebKit/WebView.subproj/WebHTMLView.m

index 4d436852d45e720e1731038432027eb446ae7298..7d050a4aec3ff38b5e448b9513b3139afe330829 100644 (file)
@@ -1,3 +1,13 @@
+2005-01-31  David Harrison  <harrison@apple.com>
+
+        Reviewed by Darin.
+
+        <rdar://problem/3961239> AX Setting AXFocused on AXScrollArea of AXWebArea will cause keyboard selection change
+
+        * WebView.subproj/WebHTMLView.m:
+        (-[WebHTMLView maintainsInactiveSelection]):
+        Keep the selection when the new first respomder is our own scrollview, in both editable and non-editaqble content.
+
 2005-01-31  Jens Alfke  <set EMAIL_ADDRESS environment variable>
 
         Reviewed by John.
index e7ab2bc6c401d05dadce56789104f99516f2cc40..3cb43387fb59174343854eeccef3af85d52b9909 100644 (file)
@@ -1783,11 +1783,36 @@ static WebHTMLView *lastHitView = nil;
     // clients to ste the web view to be editable probably want it
     // to act like a "regular" Cocoa view in terms of its selection
     // behavior.
+    id nextResponder = [[self window] _newFirstResponderAfterResigning];
+
+    // Predict the case where we are losing first responder status only to
+    // gain it back again.  Want to keep the selection in that case.
+    if ([nextResponder isKindOfClass:[NSScrollView class]]) {
+        id contentView = [nextResponder contentView];
+        if (contentView) {
+            nextResponder = contentView;
+        }
+    }
+    if ([nextResponder isKindOfClass:[NSClipView class]]) {
+        id documentView = [nextResponder documentView];
+        if (documentView) {
+            nextResponder = documentView;
+        }
+    }
+
+    if (nextResponder == self)
+        return YES;
+
+    // non-editable views lose selection whenever losing first responder status
     if (![[self _webView] isEditable])
         return NO;
-        
-    id nextResponder = [[self window] _newFirstResponderAfterResigning];
-    return !nextResponder || ![nextResponder isKindOfClass:[NSView class]] || ![nextResponder isDescendantOf:[self _webView]];
+    
+    // editable views lose selection when losing first responder status
+    // to a widget in the same page, but not otherwise
+    BOOL loseSelection = [nextResponder isKindOfClass:[NSView class]]
+        && [nextResponder isDescendantOf:[self _webView]];
+
+    return !loseSelection;
 }
 
 - (void)addMouseMovedObserver