diff options
author | shess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-21 18:13:32 +0000 |
---|---|---|
committer | shess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-21 18:13:32 +0000 |
commit | e33fcd586d1441117267a2aa5cba93fe8e30edd2 (patch) | |
tree | ffd75cea0e720ca6f24918147de16605a19c9fdf /chrome | |
parent | 50e42c82ede93fa90f0af6233f588a472abf0b9f (diff) | |
download | chromium_src-e33fcd586d1441117267a2aa5cba93fe8e30edd2.zip chromium_src-e33fcd586d1441117267a2aa5cba93fe8e30edd2.tar.gz chromium_src-e33fcd586d1441117267a2aa5cba93fe8e30edd2.tar.bz2 |
[Mac] Detect control-key changes in autocomplete field.
http://crbug.com/10934
TEST=Type 'something', and press Control. Autocomplete should show www.something.com at the top. If that's what you'd get anyhow, try a different word. Control-enter should take you there.
Review URL: http://codereview.chromium.org/159105
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@21192 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
5 files changed, 97 insertions, 1 deletions
diff --git a/chrome/browser/autocomplete/autocomplete_edit_view_mac.h b/chrome/browser/autocomplete/autocomplete_edit_view_mac.h index ac0c712..e564706 100644 --- a/chrome/browser/autocomplete/autocomplete_edit_view_mac.h +++ b/chrome/browser/autocomplete/autocomplete_edit_view_mac.h @@ -86,8 +86,11 @@ class AutocompleteEditViewMac : public AutocompleteEditView { // Helper functions for use from AutocompleteEditHelper Objective-C // class. - void OnUpOrDownKeyPressed(bool up, bool by_page); + + // Trivial wrappers forwarding to |model_| methods. + void OnControlKeyChanged(bool pressed); void OnEscapeKeyPressed(); + void OnUpOrDownKeyPressed(bool up, bool by_page); // Called when editing begins in the field, and before the results // of any editing are communicated to |model_|. diff --git a/chrome/browser/autocomplete/autocomplete_edit_view_mac.mm b/chrome/browser/autocomplete/autocomplete_edit_view_mac.mm index 6f441fa..7bbc086 100644 --- a/chrome/browser/autocomplete/autocomplete_edit_view_mac.mm +++ b/chrome/browser/autocomplete/autocomplete_edit_view_mac.mm @@ -579,6 +579,10 @@ void AutocompleteEditViewMac::OnPaste() { OnAfterPossibleChange(); } +void AutocompleteEditViewMac::OnControlKeyChanged(bool pressed) { + model_->OnControlKeyChanged(pressed); +} + void AutocompleteEditViewMac::AcceptInput( WindowOpenDisposition disposition, bool for_drop) { model_->AcceptInput(disposition, for_drop); @@ -671,6 +675,16 @@ std::wstring AutocompleteEditViewMac::GetClipboardText(Clipboard* clipboard) { return YES; } + // When the user does Control-Enter, the existing content has "www." + // prepended and ".com" appended. |model_| should already have + // received notification when the Control key was depressed, but it + // is safe to tell it twice. + if (cmd == @selector(insertLineBreak:)) { + edit_view_->OnControlKeyChanged(true); + edit_view_->AcceptInput(CURRENT_TAB, false); + return YES; + } + // Capture the state before the operation changes the content. // TODO(shess): Determine if this is always redundent WRT the call // in -controlTextDidChange:. @@ -699,6 +713,8 @@ std::wstring AutocompleteEditViewMac::GetClipboardText(Clipboard* clipboard) { // it's set to the start of the text. } +// AutocompleteTextField/Editor adds a delegate method which allows us +// to intercept and handle -paste: calls. - (BOOL)control:(NSControl*)control textShouldPaste:(NSText*)fieldEditor { edit_view_->OnPaste(); @@ -711,4 +727,17 @@ std::wstring AutocompleteEditViewMac::GetClipboardText(Clipboard* clipboard) { edit_view_->OnDidResignKey(); } +// AutocompleteTextField adds a delegate method which allows us to +// track -flagsChanged: calls. +// +// When the user types Control-Enter, the existing content has "www." +// prepended and ".com" appended. This calls down to +// AutocompleteEditModel::OnControlKeyChanged() so that it can change +// the popup to reflect this. See autocomplete_edit.cc +// OnControlKeyChanged() and OnAfterPossibleChange(). +- (void)control:(NSControl*)control flagsChanged:(NSEvent*)theEvent { + BOOL controlFlag = ([theEvent modifierFlags]&NSControlKeyMask) != 0; + edit_view_->OnControlKeyChanged(controlFlag); +} + @end diff --git a/chrome/browser/cocoa/autocomplete_text_field.h b/chrome/browser/cocoa/autocomplete_text_field.h index 17025d2..b592310 100644 --- a/chrome/browser/cocoa/autocomplete_text_field.h +++ b/chrome/browser/cocoa/autocomplete_text_field.h @@ -18,6 +18,9 @@ // edited. See AutocompleteTextFieldEditor implementation. - (BOOL)control:(NSControl*)control textShouldPaste:(NSText*)fieldEditor; +// Let the delegate track -flagsChanged: events. +- (void)control:(NSControl*)control flagsChanged:(NSEvent*)theEvent; + @end @interface AutocompleteTextField : NSTextField { diff --git a/chrome/browser/cocoa/autocomplete_text_field.mm b/chrome/browser/cocoa/autocomplete_text_field.mm index 6d1d5d5..9af1b7d 100644 --- a/chrome/browser/cocoa/autocomplete_text_field.mm +++ b/chrome/browser/cocoa/autocomplete_text_field.mm @@ -25,4 +25,12 @@ return YES; } +- (void)flagsChanged:(NSEvent*)theEvent { + id delegate = [self delegate]; + if ([delegate respondsToSelector:@selector(control:flagsChanged:)]) { + [delegate control:self flagsChanged:theEvent]; + } + [super flagsChanged:theEvent]; +} + @end diff --git a/chrome/browser/cocoa/autocomplete_text_field_unittest.mm b/chrome/browser/cocoa/autocomplete_text_field_unittest.mm index 03a786f..e8a8fb8 100644 --- a/chrome/browser/cocoa/autocomplete_text_field_unittest.mm +++ b/chrome/browser/cocoa/autocomplete_text_field_unittest.mm @@ -7,15 +7,18 @@ #include "base/scoped_nsobject.h" #import "chrome/browser/cocoa/autocomplete_text_field.h" #import "chrome/browser/cocoa/autocomplete_text_field_cell.h" +#import "chrome/browser/cocoa/autocomplete_text_field_editor.h" #import "chrome/browser/cocoa/cocoa_test_helper.h" #include "testing/gtest/include/gtest/gtest.h" @interface AutocompleteTextFieldTestDelegate : NSObject { BOOL textShouldPaste_; BOOL receivedTextShouldPaste_; + BOOL receivedFlagsChanged_; } - initWithTextShouldPaste:(BOOL)flag; - (BOOL)receivedTextShouldPaste; +- (BOOL)receivedFlagsChanged; @end namespace { @@ -71,6 +74,47 @@ TEST_F(AutocompleteTextFieldTest, TextShouldPaste) { EXPECT_TRUE([shouldNotPaste receivedTextShouldPaste]); } +// Test that -control:flagsChanged: properly reaches the delegate. +TEST_F(AutocompleteTextFieldTest, FlagsChanged) { + EXPECT_TRUE(![field_ delegate]); + + // This shouldn't crash, at least. + [field_ flagsChanged:nil]; + + scoped_nsobject<AutocompleteTextFieldTestDelegate> delegate( + [[AutocompleteTextFieldTestDelegate alloc] initWithTextShouldPaste:NO]); + [field_ setDelegate:delegate]; + EXPECT_FALSE([delegate receivedFlagsChanged]); + [field_ flagsChanged:nil]; + EXPECT_TRUE([delegate receivedFlagsChanged]); +} + +// Test that -control:flagsChanged: properly reaches the delegate when +// the -flagsChanged: message goes to the editor. In that case it is +// forwarded via the responder chain. +TEST_F(AutocompleteTextFieldTest, FieldEditorFlagsChanged) { + EXPECT_TRUE(![field_ delegate]); + + scoped_nsobject<AutocompleteTextFieldTestDelegate> delegate( + [[AutocompleteTextFieldTestDelegate alloc] initWithTextShouldPaste:NO]); + + // Setup a field editor for |field_|. + scoped_nsobject<AutocompleteTextFieldEditor> editor( + [[AutocompleteTextFieldEditor alloc] init]); + [field_ setDelegate:delegate]; + + [editor setFieldEditor:YES]; + [[field_ cell] setUpFieldEditorAttributes:editor]; + [[field_ cell] editWithFrame:[field_ bounds] + inView:field_ + editor:editor + delegate:[field_ delegate] + event:nil]; + EXPECT_FALSE([delegate receivedFlagsChanged]); + [editor flagsChanged:nil]; + EXPECT_TRUE([delegate receivedFlagsChanged]); +} + } // namespace @implementation AutocompleteTextFieldTestDelegate @@ -80,6 +124,7 @@ TEST_F(AutocompleteTextFieldTest, TextShouldPaste) { if (self) { textShouldPaste_ = flag; receivedTextShouldPaste_ = NO; + receivedFlagsChanged_ = NO; } return self; } @@ -88,9 +133,17 @@ TEST_F(AutocompleteTextFieldTest, TextShouldPaste) { return receivedTextShouldPaste_; } +- (BOOL)receivedFlagsChanged { + return receivedFlagsChanged_; +} + - (BOOL)control:(NSControl*)control textShouldPaste:(NSText*)fieldEditor { receivedTextShouldPaste_ = YES; return textShouldPaste_; } +- (void)control:(id)control flagsChanged:(NSEvent*)theEvent { + receivedFlagsChanged_ = YES; +} + @end |