Reviewed by Vicki
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 15 Mar 2005 23:27:44 +0000 (23:27 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 15 Mar 2005 23:27:44 +0000 (23:27 +0000)
        Fox for this bug:

        <rdar://problem/4052642> Each delete keystroke is in its own undo group; not included in undo group with other typing

        Calling -[WebCore setSelectedDOMRange:range affinity:] had the result of "closing" any active set of typing
        keystrokes grouped together in a single undo operation. My change on 27 Jan to route delete keystrokes
        through _deleteRange:killRing:... made this feature regress. Previous to that change, the backwards delete
        key went through separate code that is no longer in the tree that did not set the selection in the way
        it is done now.

        The solution is to add an extra argument to the set-selection call. The WebCoreBridge now offers this method:
        -[WebCore setSelectedDOMRange:range affinity:closeTyping:]. Now, callers must indicate whether setting the
        selection will act to close typing or not. The code changes below all add this new argument with the
        appropriate value for closeTyping.

        * WebView.subproj/WebHTMLView.m:
        (-[WebHTMLView _deleteRange:killRing:prepend:smartDeleteOK:deletionAction:]): Passes NO for closeTyping when
        deletionAction is deleteKeyAction or forwardDeleteKeyAction; YES when deleteSelectionAction.
        (-[WebHTMLView _expandSelectionToGranularity:]): Passes YES for closeTyping.
        (-[WebHTMLView selectToMark:]): Passes YES for closeTyping.
        (-[WebHTMLView swapWithMark:]): Passes YES for closeTyping.
        (-[WebHTMLView transpose:]): Passes YES for closeTyping.
        (-[WebHTMLView _selectMarkedText]): Passes NO for closeTyping.
        (-[WebHTMLView _selectRangeInMarkedText:]): Passes NO for closeTyping.
        * WebView.subproj/WebView.m:
        (-[WebView setSelectedDOMRange:affinity:]): Passes YES for closeTyping.

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

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

index ce0054e850a55aa13dcd0c48d0355720e49cf7d9..976acb6cc691c44721a4dedd9165eaccb2a6a536 100644 (file)
@@ -1,3 +1,34 @@
+2005-03-15  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by Vicki
+
+        Fox for this bug:
+        
+        <rdar://problem/4052642> Each delete keystroke is in its own undo group; not included in undo group with other typing
+
+        Calling -[WebCore setSelectedDOMRange:range affinity:] had the result of "closing" any active set of typing
+        keystrokes grouped together in a single undo operation. My change on 27 Jan to route delete keystrokes 
+        through _deleteRange:killRing:... made this feature regress. Previous to that change, the backwards delete
+        key went through separate code that is no longer in the tree that did not set the selection in the way
+        it is done now.
+        
+        The solution is to add an extra argument to the set-selection call. The WebCoreBridge now offers this method:
+        -[WebCore setSelectedDOMRange:range affinity:closeTyping:]. Now, callers must indicate whether setting the 
+        selection will act to close typing or not. The code changes below all add this new argument with the
+        appropriate value for closeTyping.
+
+        * WebView.subproj/WebHTMLView.m:
+        (-[WebHTMLView _deleteRange:killRing:prepend:smartDeleteOK:deletionAction:]): Passes NO for closeTyping when
+        deletionAction is deleteKeyAction or forwardDeleteKeyAction; YES when deleteSelectionAction.
+        (-[WebHTMLView _expandSelectionToGranularity:]): Passes YES for closeTyping.
+        (-[WebHTMLView selectToMark:]): Passes YES for closeTyping.
+        (-[WebHTMLView swapWithMark:]): Passes YES for closeTyping.
+        (-[WebHTMLView transpose:]): Passes YES for closeTyping.
+        (-[WebHTMLView _selectMarkedText]): Passes NO for closeTyping.
+        (-[WebHTMLView _selectRangeInMarkedText:]): Passes NO for closeTyping.
+        * WebView.subproj/WebView.m:
+        (-[WebView setSelectedDOMRange:affinity:]): Passes YES for closeTyping.
+
 2005-03-14  Richard Williamson   <rjw@apple.com>
 
        Fix <rdar://problem/4051389> 8A413: gifs animating too fast
index bf72b39d55ae814769c9099167502f33bd772ad5..d0ed0cdd4e4f5770023e7141d4fbde7efd19345b 100644 (file)
@@ -516,15 +516,17 @@ void *_NSSoftLinkingGetFrameworkFuncPtr(NSString *inUmbrellaFrameworkName,
         startNewKillRingSequence = NO;
     }
 
-    [bridge setSelectedDOMRange:range affinity:NSSelectionAffinityDownstream];
     switch (deletionAction) {
         case deleteSelectionAction:
+            [bridge setSelectedDOMRange:range affinity:NSSelectionAffinityDownstream closeTyping:YES];
             [bridge deleteSelectionWithSmartDelete:smartDelete];
             break;
         case deleteKeyAction:
+            [bridge setSelectedDOMRange:range affinity:NSSelectionAffinityDownstream closeTyping:NO];
             [bridge deleteKeyPressedWithSmartDelete:smartDelete];
             break;
         case forwardDeleteKeyAction:
+            [bridge setSelectedDOMRange:range affinity:NSSelectionAffinityDownstream closeTyping:NO];
             [bridge forwardDeleteKeyPressedWithSmartDelete:smartDelete];
             break;
     }
@@ -3525,7 +3527,7 @@ static WebHTMLView *lastHitView = nil;
     if (range && ![range collapsed]) {
         WebView *webView = [self _webView];
         if ([[webView _editingDelegateForwarder] webView:webView shouldChangeSelectedDOMRange:[self _selectedRange] toDOMRange:range affinity:[bridge selectionAffinity] stillSelecting:NO]) {
-            [bridge setSelectedDOMRange:range affinity:[bridge selectionAffinity]];
+            [bridge setSelectedDOMRange:range affinity:[bridge selectionAffinity] closeTyping:YES];
         }
     }
 }
@@ -4528,7 +4530,7 @@ static DOMRange *unionDOMRanges(DOMRange *a, DOMRange *b)
     }
     DOMRange *selection = [self _selectedRange];
     @try {
-        [bridge setSelectedDOMRange:unionDOMRanges(mark, selection) affinity:NSSelectionAffinityDownstream];
+        [bridge setSelectedDOMRange:unionDOMRanges(mark, selection) affinity:NSSelectionAffinityDownstream closeTyping:YES];
     } @catch (NSException *exception) {
         NSBeep();
     }
@@ -4544,7 +4546,7 @@ static DOMRange *unionDOMRanges(DOMRange *a, DOMRange *b)
     }
     DOMRange *selection = [self _selectedRange];
     @try {
-        [bridge setSelectedDOMRange:mark affinity:NSSelectionAffinityDownstream];
+        [bridge setSelectedDOMRange:mark affinity:NSSelectionAffinityDownstream closeTyping:YES];
     } @catch (NSException *exception) {
         NSBeep();
         return;
@@ -4571,7 +4573,7 @@ static DOMRange *unionDOMRanges(DOMRange *a, DOMRange *b)
     if (![[webView _editingDelegateForwarder] webView:webView shouldChangeSelectedDOMRange:[self _selectedRange] toDOMRange:r affinity:NSSelectionAffinityDownstream stillSelecting:NO]) {
         return;
     }
-    [bridge setSelectedDOMRange:r affinity:NSSelectionAffinityDownstream];
+    [bridge setSelectedDOMRange:r affinity:NSSelectionAffinityDownstream closeTyping:YES];
     if ([self _shouldReplaceSelectionWithText:transposed givenAction:WebViewInsertActionTyped]) {
         [bridge replaceSelectionWithText:transposed selectReplacement:NO smartReplace:NO];
     }
@@ -4937,7 +4939,7 @@ static NSArray *validAttributes = nil;
     if ([self hasMarkedText]) {
        WebBridge *bridge = [self _bridge];
        DOMRange *markedTextRange = [bridge markedTextDOMRange];
-       [bridge setSelectedDOMRange:markedTextRange affinity:NSSelectionAffinityDownstream];
+       [bridge setSelectedDOMRange:markedTextRange affinity:NSSelectionAffinityDownstream closeTyping:NO];
     }
 }
 
@@ -4957,7 +4959,7 @@ static NSArray *validAttributes = nil;
     [selectedRange setStart:[markedTextRange startContainer] :selectionStart];
     [selectedRange setEnd:[markedTextRange startContainer] :selectionEnd];
 
-    [bridge setSelectedDOMRange:selectedRange affinity:NSSelectionAffinityDownstream];
+    [bridge setSelectedDOMRange:selectedRange affinity:NSSelectionAffinityDownstream closeTyping:NO];
 }
 
 - (void)_extractAttributes:(NSArray **)a ranges:(NSArray **)r fromAttributedString:(NSAttributedString *)string
index 53a8d8b212709d454753af1baeec1fe3dbb56d93..14c53017d4590783e1d2523e8cfe563d4f22f058 100644 (file)
@@ -2703,7 +2703,7 @@ static WebFrame *incrementFrame(WebFrame *curr, BOOL forward, BOOL wrapFlag)
     // Derive the bridge to use from the range passed in.
     // Using _bridgeForCurrentSelection could give us a different document than
     // the one the range uses.
-    [[[range startContainer] _bridge] setSelectedDOMRange:range affinity:selectionAffinity];
+    [[[range startContainer] _bridge] setSelectedDOMRange:range affinity:selectionAffinity closeTyping:YES];
 }
 
 - (DOMRange *)selectedDOMRange