+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
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;
}
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];
}
}
}
}
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();
}
}
DOMRange *selection = [self _selectedRange];
@try {
- [bridge setSelectedDOMRange:mark affinity:NSSelectionAffinityDownstream];
+ [bridge setSelectedDOMRange:mark affinity:NSSelectionAffinityDownstream closeTyping:YES];
} @catch (NSException *exception) {
NSBeep();
return;
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];
}
if ([self hasMarkedText]) {
WebBridge *bridge = [self _bridge];
DOMRange *markedTextRange = [bridge markedTextDOMRange];
- [bridge setSelectedDOMRange:markedTextRange affinity:NSSelectionAffinityDownstream];
+ [bridge setSelectedDOMRange:markedTextRange affinity:NSSelectionAffinityDownstream closeTyping:NO];
}
}
[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