| Index: chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_editor.mm
|
| diff --git a/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_editor.mm b/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_editor.mm
|
| index 9bda172a88655fd73100db09fc64b83c51c2d557..83126cf2e5eee10622c834fac7b0c7ca7142aed2 100644
|
| --- a/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_editor.mm
|
| +++ b/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_editor.mm
|
| @@ -4,9 +4,6 @@
|
|
|
| #import "chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_editor.h"
|
|
|
| -#include "base/i18n/break_iterator.h"
|
| -#include "base/mac/foundation_util.h"
|
| -#include "base/mac/scoped_nsobject.h"
|
| #include "base/mac/sdk_forward_declarations.h"
|
| #include "base/strings/string_util.h"
|
| #include "base/strings/sys_string_conversions.h"
|
| @@ -52,57 +49,12 @@
|
| return [[pb stringForType:type] length] > kMaxPasteLength;
|
| }
|
|
|
| -NSRange VisualSelectedRangeFromRange(NSRange range, NSString* string) {
|
| - if (range.location >= string.length)
|
| - return range;
|
| - base::string16 text = base::SysNSStringToUTF16(string);
|
| - base::i18n::BreakIterator grapheme_iterator(
|
| - text, base::i18n::BreakIterator::BREAK_CHARACTER);
|
| - if (!grapheme_iterator.Init())
|
| - return range;
|
| - // This works because NSString uses UTF-16 code units.
|
| - while (range.location < text.length() &&
|
| - !grapheme_iterator.IsGraphemeBoundary(
|
| - static_cast<size_t>(range.location))) {
|
| - range.location++;
|
| - if (range.length > 0)
|
| - range.length--;
|
| - }
|
| - return range;
|
| -}
|
| -
|
| } // namespace
|
| -
|
| -// Method exposed for the purpose of overriding.
|
| -// Used to restore model's selection range when the view doesn't
|
| -// match the model due to combining characters.
|
| -//
|
| -// In some cases, (completing 'y' to 'ÿour', for example), the autocomplete
|
| -// system requests a selection range that begins on a combining character.
|
| -// setSelectedRange: and friends document that the range passed to them
|
| -// "must begin and end on glyph boundaries and not split base glyphs and
|
| -// their nonspacing marks". If passed such a range, the selection is
|
| -// expanded to include the original user input, preventing the user
|
| -// from being able to type other words beginning with that letter.
|
| -//
|
| -// To resolve this, the field editor modifies the selection to start
|
| -// on the next glyph boundary, then keeps track of the original and
|
| -// modified selections, substituting the original when the user takes
|
| -// actions that operate on the selection. Since there are many methods
|
| -// in NSResponder (for example deleteToBeginningOfLine:) that operate
|
| -// on the selection, rather than shimming them all, we override this
|
| -// private method that they're implemented in terms of.
|
| -//
|
| -@interface NSTextView (PrivateTextEditing)
|
| -- (void)_userReplaceRange:(NSRange)range withString:(NSString*)string;
|
| -@end
|
|
|
| @interface AutocompleteTextFieldEditor ()<NSDraggingSource>
|
| @end
|
|
|
| @implementation AutocompleteTextFieldEditor
|
| -
|
| -@synthesize actualSelectedRange = actualSelectedRange_;
|
|
|
| - (BOOL)shouldDrawInsertionPoint {
|
| return [super shouldDrawInsertionPoint] &&
|
| @@ -446,14 +398,6 @@
|
| // (URLDropTarget protocol)
|
| - (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
|
| return [dropHandler_ performDragOperation:sender];
|
| -}
|
| -
|
| -- (void)_userReplaceRange:(NSRange)range withString:(NSString*)string {
|
| - if (NSEqualRanges(visualSelectedRange_, range) &&
|
| - !NSEqualRanges(visualSelectedRange_, actualSelectedRange_)) {
|
| - range = actualSelectedRange_;
|
| - }
|
| - [super _userReplaceRange:range withString:string];
|
| }
|
|
|
| // Prevent control characters from being entered into the Omnibox.
|
| @@ -487,15 +431,11 @@
|
| DCHECK_EQ(range.length, 0U);
|
| }
|
|
|
| - if (!NSEqualRanges(visualSelectedRange_, actualSelectedRange_)) {
|
| - [super replaceCharactersInRange:actualSelectedRange_ withString:aString];
|
| - } else {
|
| - // NOTE: If |aString| is empty, this intentionally replaces the
|
| - // selection with empty. This seems consistent with the case where
|
| - // the input contained a mixture of characters and the string ended
|
| - // up not empty.
|
| - [super insertText:aString];
|
| - }
|
| + // NOTE: If |aString| is empty, this intentionally replaces the
|
| + // selection with empty. This seems consistent with the case where
|
| + // the input contained a mixture of characters and the string ended
|
| + // up not empty.
|
| + [super insertText:aString];
|
| }
|
|
|
| - (NSRange)selectionRangeForProposedRange:(NSRange)proposedSelRange
|
| @@ -517,24 +457,6 @@
|
| // input from the user.
|
| if (interpretingKeyEvents_)
|
| textChangedByKeyEvents_ = YES;
|
| -}
|
| -
|
| -- (void)setSelectedRanges:(NSArray*)ranges
|
| - affinity:(NSSelectionAffinity)affinity
|
| - stillSelecting:(BOOL)flag {
|
| - DCHECK(ranges.count > 0);
|
| - base::scoped_nsobject<NSMutableArray> mutableRanges([ranges mutableCopy]);
|
| - // |ranges| is sorted, and empirically, the first range passed is returned
|
| - // as selectedRange.
|
| - NSRange firstRange = [base::mac::ObjCCastStrict<NSValue>(
|
| - [mutableRanges firstObject]) rangeValue];
|
| - actualSelectedRange_ = firstRange;
|
| - visualSelectedRange_ =
|
| - VisualSelectedRangeFromRange(firstRange, [self string]);
|
| - NSValue* boxedVisualRange = [NSValue valueWithRange:visualSelectedRange_];
|
| - [mutableRanges replaceObjectAtIndex:0 withObject:boxedVisualRange];
|
| -
|
| - [super setSelectedRanges:mutableRanges affinity:affinity stillSelecting:flag];
|
| }
|
|
|
| - (void)interpretKeyEvents:(NSArray *)eventArray {
|
| @@ -642,7 +564,7 @@
|
|
|
| - (BOOL)validateMenuItem:(NSMenuItem*)item {
|
| if ([item action] == @selector(copyToFindPboard:))
|
| - return actualSelectedRange_.length > 0;
|
| + return [self selectedRange].length > 0;
|
| if ([item action] == @selector(pasteAndGo:)) {
|
| // TODO(rohitrao): If the clipboard is empty, should we show a
|
| // greyed-out "Paste and Go" or nothing at all?
|
| @@ -654,10 +576,11 @@
|
| }
|
|
|
| - (void)copyToFindPboard:(id)sender {
|
| - if (actualSelectedRange_.length == 0)
|
| + NSRange selectedRange = [self selectedRange];
|
| + if (selectedRange.length == 0)
|
| return;
|
| NSAttributedString* selection =
|
| - [self attributedSubstringForProposedRange:actualSelectedRange_
|
| + [self attributedSubstringForProposedRange:selectedRange
|
| actualRange:NULL];
|
| if (!selection)
|
| return;
|
|
|