summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorshess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-21 18:13:32 +0000
committershess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-21 18:13:32 +0000
commite33fcd586d1441117267a2aa5cba93fe8e30edd2 (patch)
treeffd75cea0e720ca6f24918147de16605a19c9fdf /chrome
parent50e42c82ede93fa90f0af6233f588a472abf0b9f (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/autocomplete/autocomplete_edit_view_mac.h5
-rw-r--r--chrome/browser/autocomplete/autocomplete_edit_view_mac.mm29
-rw-r--r--chrome/browser/cocoa/autocomplete_text_field.h3
-rw-r--r--chrome/browser/cocoa/autocomplete_text_field.mm8
-rw-r--r--chrome/browser/cocoa/autocomplete_text_field_unittest.mm53
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