summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cocoa
diff options
context:
space:
mode:
authorshess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-21 19:20:35 +0000
committershess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-21 19:20:35 +0000
commitae49b018895081bbef1bd67d80e0cdeffc3b5558 (patch)
tree2204c81d41fa79e18e41900e4f06fe8a790aea5e /chrome/browser/cocoa
parentd2405cdc8e15532905e7c8f963cc69039be2b636 (diff)
downloadchromium_src-ae49b018895081bbef1bd67d80e0cdeffc3b5558.zip
chromium_src-ae49b018895081bbef1bd67d80e0cdeffc3b5558.tar.gz
chromium_src-ae49b018895081bbef1bd67d80e0cdeffc3b5558.tar.bz2
[Mac] Expose AutocompleteEditViewMac to Cocoa code.
This reduces the number of forwarding/delegate shenanigans we have to go through. Review URL: http://codereview.chromium.org/211030 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@26710 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa')
-rw-r--r--chrome/browser/cocoa/autocomplete_text_field.h27
-rw-r--r--chrome/browser/cocoa/autocomplete_text_field.mm17
-rw-r--r--chrome/browser/cocoa/autocomplete_text_field_editor.h18
-rw-r--r--chrome/browser/cocoa/autocomplete_text_field_editor.mm27
-rw-r--r--chrome/browser/cocoa/autocomplete_text_field_editor_unittest.mm114
-rw-r--r--chrome/browser/cocoa/autocomplete_text_field_unittest.mm170
-rw-r--r--chrome/browser/cocoa/autocomplete_text_field_unittest_helper.h51
-rw-r--r--chrome/browser/cocoa/autocomplete_text_field_unittest_helper.mm27
8 files changed, 236 insertions, 215 deletions
diff --git a/chrome/browser/cocoa/autocomplete_text_field.h b/chrome/browser/cocoa/autocomplete_text_field.h
index 51afa05..2f87c43 100644
--- a/chrome/browser/cocoa/autocomplete_text_field.h
+++ b/chrome/browser/cocoa/autocomplete_text_field.h
@@ -23,30 +23,33 @@
// Chrome internals, though it's really more of a mish-mash of model,
// view, and controller.
-// AutocompleteTextFieldDelegateMethods are meant to be similar to
-// NSControl delegate methods, adding additional intercepts relevant
-// to the Omnibox implementation.
+// Provides a hook so that we can call directly down to
+// AutocompleteEditViewMac rather than traversing the delegate chain.
-@protocol AutocompleteTextFieldDelegateMethods
+class AutocompleteTextFieldObserver {
+ public:
+
+ // Called when the control-key state changes while the field is
+ // first responder.
+ virtual void OnControlKeyChanged(bool pressed) = 0;
-// Delegate -textShouldPaste: implementation to the field being
-// edited. See AutocompleteTextFieldEditor implementation.
-- (BOOL)control:(NSControl*)control textShouldPaste:(NSText*)fieldEditor;
+ // Called when the user pastes into the field.
+ virtual void OnPaste() = 0;
+};
+@protocol AutocompleteTextFieldDelegateMethods
// Returns nil if paste actions are not supported.
- (NSString*)control:(NSControl*)control
textPasteActionString:(NSText*)fieldEditor;
- (void)control:(NSControl*)control textDidPasteAndGo:(NSText*)fieldEditor;
-
-// Let the delegate track -flagsChanged: events.
-- (void)control:(NSControl*)control flagsChanged:(NSEvent*)theEvent;
-
@end
@interface AutocompleteTextField : NSTextField {
+ @private
+ AutocompleteTextFieldObserver* observer_; // weak, owned by location bar.
}
-- (BOOL)textShouldPaste:(NSText*)fieldEditor;
+@property AutocompleteTextFieldObserver* observer;
// Convenience method to return the cell, casted appropriately.
- (AutocompleteTextFieldCell*)autocompleteTextFieldCell;
diff --git a/chrome/browser/cocoa/autocomplete_text_field.mm b/chrome/browser/cocoa/autocomplete_text_field.mm
index 9c3e593..efc114a 100644
--- a/chrome/browser/cocoa/autocomplete_text_field.mm
+++ b/chrome/browser/cocoa/autocomplete_text_field.mm
@@ -9,6 +9,8 @@
@implementation AutocompleteTextField
+@synthesize observer = observer_;
+
+ (Class)cellClass {
return [AutocompleteTextFieldCell class];
}
@@ -17,14 +19,6 @@
DCHECK([[self cell] isKindOfClass:[AutocompleteTextFieldCell class]]);
}
-- (BOOL)textShouldPaste:(NSText*)fieldEditor {
- id delegate = [self delegate];
- if ([delegate respondsToSelector:@selector(control:textShouldPaste:)]) {
- return [delegate control:self textShouldPaste:fieldEditor];
- }
- return YES;
-}
-
- (NSString*)textPasteActionString:(NSText*)fieldEditor {
id delegate = [self delegate];
if ([delegate respondsToSelector:@selector(control:textPasteActionString:)]) {
@@ -41,11 +35,8 @@
}
- (void)flagsChanged:(NSEvent*)theEvent {
- id delegate = [self delegate];
- if ([delegate respondsToSelector:@selector(control:flagsChanged:)]) {
- [delegate control:self flagsChanged:theEvent];
- }
- [super flagsChanged:theEvent];
+ bool controlFlag = ([theEvent modifierFlags]&NSControlKeyMask) != 0;
+ observer_->OnControlKeyChanged(controlFlag);
}
- (AutocompleteTextFieldCell*)autocompleteTextFieldCell {
diff --git a/chrome/browser/cocoa/autocomplete_text_field_editor.h b/chrome/browser/cocoa/autocomplete_text_field_editor.h
index 6640f69..0821e08 100644
--- a/chrome/browser/cocoa/autocomplete_text_field_editor.h
+++ b/chrome/browser/cocoa/autocomplete_text_field_editor.h
@@ -4,6 +4,8 @@
#import <Cocoa/Cocoa.h>
+class AutocompleteTextFieldObserver;
+
// AutocompleteTextFieldEditor customized the AutocompletTextField
// field editor (helper text-view used in editing). It intercepts UI
// events for forwarding to the core Omnibox code. It also undoes
@@ -11,18 +13,10 @@
// is styled but should not appear that way when copied to the
// pasteboard).
-// AutocompleteTextFieldEditorDelegateMethods are meant to be similar
-// to NSTextView delegate methods, adding additional intercepts
-// relevant to the Omnibox implementation.
+// TODO(shess): Move delegate stuff to AutocompleteTextFieldObserver.
@protocol AutocompleteTextFieldEditorDelegateMethods
-// Delegate -paste: implementation to the field being edited. If the
-// delegate returns YES, or does not implement the method, NSTextView
-// is called to handle the paste. The delegate can block the paste
-// (or handle it internally) by returning NO.
-- (BOOL)textShouldPaste:(NSText*)fieldEditor;
-
// Returns nil if paste actions are not supported.
- (NSString*)textPasteActionString:(NSText*)fieldEditor;
- (void)textDidPasteAndGo:(NSText*)fieldEditor;
@@ -39,8 +33,8 @@
// Same as above, note that this calls through to performCopy.
- (void)performCut:(NSPasteboard*)pb;
-// Called by -paste: to decide whether to forward to superclass.
-// Exposed for unit testing.
-- (BOOL)shouldPaste;
+@end
+@interface AutocompleteTextFieldEditor(PrivateTestMethods)
+- (AutocompleteTextFieldObserver*)observer;
@end
diff --git a/chrome/browser/cocoa/autocomplete_text_field_editor.mm b/chrome/browser/cocoa/autocomplete_text_field_editor.mm
index 5bcacff..6516e4b 100644
--- a/chrome/browser/cocoa/autocomplete_text_field_editor.mm
+++ b/chrome/browser/cocoa/autocomplete_text_field_editor.mm
@@ -7,6 +7,8 @@
#include "app/l10n_util_mac.h"
#include "base/string_util.h"
#include "grit/generated_resources.h"
+#include "base/sys_string_conversions.h"
+#import "chrome/browser/cocoa/autocomplete_text_field.h"
@implementation AutocompleteTextFieldEditor
@@ -31,18 +33,25 @@
[self delete:nil];
}
-- (BOOL)shouldPaste {
- id delegate = [self delegate];
- if (![delegate respondsToSelector:@selector(textShouldPaste:)] ||
- [delegate textShouldPaste:self]) {
- return YES;
- }
- return NO;
+// This class assumes that the delegate is an AutocompleteTextField.
+// Enforce that assumption.
+- (void)setDelegate:(id)anObject {
+ DCHECK(anObject == nil ||
+ [anObject isKindOfClass:[AutocompleteTextField class]]);
+ [super setDelegate:anObject];
+}
+
+// Convenience method for retrieving the observer from the delegate.
+- (AutocompleteTextFieldObserver*)observer {
+ DCHECK([[self delegate] isKindOfClass:[AutocompleteTextField class]]);
+ return [static_cast<AutocompleteTextField*>([self delegate]) observer];
}
- (void)paste:(id)sender {
- if ([self shouldPaste]) {
- [super paste:sender];
+ AutocompleteTextFieldObserver* observer = [self observer];
+ DCHECK(observer);
+ if (observer) {
+ observer->OnPaste();
}
}
diff --git a/chrome/browser/cocoa/autocomplete_text_field_editor_unittest.mm b/chrome/browser/cocoa/autocomplete_text_field_editor_unittest.mm
index d09eb84..6d42964 100644
--- a/chrome/browser/cocoa/autocomplete_text_field_editor_unittest.mm
+++ b/chrome/browser/cocoa/autocomplete_text_field_editor_unittest.mm
@@ -7,18 +7,11 @@
#include "base/scoped_nsobject.h"
#include "base/scoped_ptr.h"
#include "base/string_util.h"
+#import "chrome/browser/cocoa/autocomplete_text_field_unittest_helper.h"
#import "chrome/browser/cocoa/cocoa_test_helper.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"
-@interface AutocompleteTextFieldEditorTestDelegate : NSObject {
- BOOL textShouldPaste_;
- BOOL receivedTextShouldPaste_;
-}
-- initWithTextShouldPaste:(BOOL)flag;
-- (BOOL)receivedTextShouldPaste;
-@end
-
namespace {
int NumTypesOnPasteboard(NSPasteboard* pb) {
@@ -45,12 +38,35 @@ class AutocompleteTextFieldEditorTest : public PlatformTest {
AutocompleteTextFieldEditorTest()
: pb_([NSPasteboard pasteboardWithUniqueName]) {
NSRect frame = NSMakeRect(0, 0, 50, 30);
- editor_.reset([[AutocompleteTextFieldEditor alloc] initWithFrame:frame]);
- [editor_ setString:@"Testing"];
- [cocoa_helper_.contentView() addSubview:editor_.get()];
+ field_.reset([[AutocompleteTextField alloc] initWithFrame:frame]);
+ [field_ setStringValue:@"Testing"];
+ [field_ setObserver:&field_observer_];
+ [cocoa_helper_.contentView() addSubview:field_.get()];
+
+ // Arrange for |field_| to get the right field editor.
+ window_delegate_.reset(
+ [[AutocompleteTextFieldWindowTestDelegate alloc] init]);
+ [cocoa_helper_.window() setDelegate:window_delegate_];
+
+ // Get the field editor setup.
+ cocoa_helper_.makeFirstResponder(field_);
+ id editor = [field_.get() currentEditor];
+ editor_.reset([static_cast<AutocompleteTextFieldEditor*>(editor) retain]);
+ }
+
+ virtual void SetUp() {
+ EXPECT_TRUE(editor_.get() != nil);
+ EXPECT_TRUE(
+ [editor_.get() isKindOfClass:[AutocompleteTextFieldEditor class]]);
}
+ // The removeFromSuperview call is needed to prevent crashes in
+ // later tests.
+ // TODO(shess): -removeromSuperview should not be necessary. Fix
+ // it. Also in autocomplete_text_field_unittest.mm.
virtual ~AutocompleteTextFieldEditorTest() {
+ [cocoa_helper_.window() setDelegate:nil];
+ [field_ removeFromSuperview];
[pb_ releaseGlobally];
}
@@ -61,11 +77,22 @@ class AutocompleteTextFieldEditorTest : public PlatformTest {
CocoaTestHelper cocoa_helper_; // Inits Cocoa, creates window, etc...
scoped_nsobject<AutocompleteTextFieldEditor> editor_;
+ scoped_nsobject<AutocompleteTextField> field_;
+ AutocompleteTextFieldObserverMock field_observer_;
+ scoped_nsobject<AutocompleteTextFieldWindowTestDelegate> window_delegate_;
private:
NSPasteboard *pb_;
};
+// Test that the field editor is linked in correctly.
+TEST_F(AutocompleteTextFieldEditorTest, FirstResponder) {
+ EXPECT_EQ(editor_.get(), [field_ currentEditor]);
+ EXPECT_TRUE([editor_.get() isDescendantOf:field_.get()]);
+ EXPECT_EQ([editor_.get() delegate], field_.get());
+ EXPECT_EQ([editor_.get() observer], [field_.get() observer]);
+}
+
TEST_F(AutocompleteTextFieldEditorTest, CutCopyTest) {
// Make sure pasteboard is empty before we start.
ASSERT_EQ(NumTypesOnPasteboard(clipboard()), 0);
@@ -99,58 +126,33 @@ TEST_F(AutocompleteTextFieldEditorTest, CutCopyTest) {
// Test adding/removing from the view hierarchy, mostly to ensure nothing
// leaks or crashes.
TEST_F(AutocompleteTextFieldEditorTest, AddRemove) {
- EXPECT_EQ(cocoa_helper_.contentView(), [editor_ superview]);
- [editor_.get() removeFromSuperview];
- EXPECT_FALSE([editor_ superview]);
+ EXPECT_EQ(cocoa_helper_.contentView(), [field_ superview]);
+
+ // TODO(shess): For some reason, -removeFromSuperview while |field_|
+ // is first-responder causes AutocompleteTextFieldWindowTestDelegate
+ // -windowWillReturnFieldEditor:toObject: to be passed an object of
+ // class AutocompleteTextFieldEditor. Which is weird. Changing
+ // first responder will remove the field editor.
+ cocoa_helper_.makeFirstResponder(nil);
+ EXPECT_FALSE([field_.get() currentEditor]);
+ EXPECT_FALSE([editor_.get() superview]);
+
+ [field_.get() removeFromSuperview];
+ EXPECT_FALSE([field_.get() superview]);
}
// Test drawing, mostly to ensure nothing leaks or crashes.
TEST_F(AutocompleteTextFieldEditorTest, Display) {
+ [field_ display];
[editor_ display];
}
-// Test that -shouldPaste properly queries the delegate.
-TEST_F(AutocompleteTextFieldEditorTest, TextShouldPaste) {
- EXPECT_TRUE(![editor_ delegate]);
- EXPECT_TRUE([editor_ shouldPaste]);
-
- scoped_nsobject<AutocompleteTextFieldEditorTestDelegate> shouldPaste(
- [[AutocompleteTextFieldEditorTestDelegate alloc]
- initWithTextShouldPaste:YES]);
- [editor_ setDelegate:shouldPaste];
- EXPECT_FALSE([shouldPaste receivedTextShouldPaste]);
- EXPECT_TRUE([editor_ shouldPaste]);
- EXPECT_TRUE([shouldPaste receivedTextShouldPaste]);
-
- scoped_nsobject<AutocompleteTextFieldEditorTestDelegate> shouldNotPaste(
- [[AutocompleteTextFieldEditorTestDelegate alloc]
- initWithTextShouldPaste:NO]);
- [editor_ setDelegate:shouldNotPaste];
- EXPECT_FALSE([shouldNotPaste receivedTextShouldPaste]);
- EXPECT_FALSE([editor_ shouldPaste]);
- EXPECT_TRUE([shouldNotPaste receivedTextShouldPaste]);
+// Test that -paste: is correctly delegated to the observer.
+TEST_F(AutocompleteTextFieldEditorTest, Paste) {
+ field_observer_.Reset();
+ EXPECT_FALSE(field_observer_.on_paste_called_);
+ [editor_.get() paste:nil];
+ EXPECT_TRUE(field_observer_.on_paste_called_);
}
} // namespace
-
-@implementation AutocompleteTextFieldEditorTestDelegate
-
-- initWithTextShouldPaste:(BOOL)flag {
- self = [super init];
- if (self) {
- textShouldPaste_ = flag;
- receivedTextShouldPaste_ = NO;
- }
- return self;
-}
-
-- (BOOL)receivedTextShouldPaste {
- return receivedTextShouldPaste_;
-}
-
-- (BOOL)textShouldPaste:(NSText*)fieldEditor {
- receivedTextShouldPaste_ = YES;
- return textShouldPaste_;
-}
-
-@end
diff --git a/chrome/browser/cocoa/autocomplete_text_field_unittest.mm b/chrome/browser/cocoa/autocomplete_text_field_unittest.mm
index 8f4f098..6e8dbfc 100644
--- a/chrome/browser/cocoa/autocomplete_text_field_unittest.mm
+++ b/chrome/browser/cocoa/autocomplete_text_field_unittest.mm
@@ -9,31 +9,20 @@
#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/autocomplete_text_field_unittest_helper.h"
#import "chrome/browser/cocoa/cocoa_test_helper.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"
@interface AutocompleteTextFieldTestDelegate : NSObject {
- BOOL textShouldPaste_;
- BOOL receivedTextShouldPaste_;
- BOOL receivedFlagsChanged_;
BOOL receivedControlTextDidBeginEditing_;
BOOL receivedControlTextShouldEndEditing_;
}
-- initWithTextShouldPaste:(BOOL)flag;
-- (BOOL)receivedTextShouldPaste;
-- (BOOL)receivedFlagsChanged;
+- init;
- (BOOL)receivedControlTextDidBeginEditing;
- (BOOL)receivedControlTextShouldEndEditing;
@end
-@interface AutocompleteTextFieldWindowTestDelegate :
- NSObject<NSWindowDelegate> {
- scoped_nsobject<AutocompleteTextFieldEditor> editor_;
-}
-- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)anObject;
-@end
-
namespace {
class AutocompleteTextFieldTest : public PlatformTest {
@@ -44,6 +33,7 @@ class AutocompleteTextFieldTest : public PlatformTest {
NSRect frame = NSMakeRect(0, 0, 300, 30);
field_.reset([[AutocompleteTextField alloc] initWithFrame:frame]);
[field_ setStringValue:@"Testing"];
+ [field_ setObserver:&field_observer_];
[cocoa_helper_.contentView() addSubview:field_.get()];
window_delegate_.reset(
@@ -51,14 +41,31 @@ class AutocompleteTextFieldTest : public PlatformTest {
[cocoa_helper_.window() setDelegate:window_delegate_.get()];
}
- // The removeFromSuperview call is needed to prevent crashes in later tests.
+ // The removeFromSuperview call is needed to prevent crashes in
+ // later tests.
+ // TODO(shess): -removeromSuperview should not be necessary. Fix
+ // it. Also in autocomplete_text_field_editor_unittest.mm.
~AutocompleteTextFieldTest() {
[cocoa_helper_.window() setDelegate:nil];
[field_ removeFromSuperview];
}
+ NSEvent* KeyDownEventWithFlags(NSUInteger flags) {
+ return [NSEvent keyEventWithType:NSKeyDown
+ location:NSZeroPoint
+ modifierFlags:flags
+ timestamp:0.0
+ windowNumber:[cocoa_helper_.window() windowNumber]
+ context:nil
+ characters:@"a"
+ charactersIgnoringModifiers:@"a"
+ isARepeat:NO
+ keyCode:'a'];
+ }
+
CocoaTestHelper cocoa_helper_; // Inits Cocoa, creates window, etc...
scoped_nsobject<AutocompleteTextField> field_;
+ AutocompleteTextFieldObserverMock field_observer_;
scoped_nsobject<AutocompleteTextFieldWindowTestDelegate> window_delegate_;
};
@@ -109,68 +116,43 @@ TEST_F(AutocompleteTextFieldTest, Display) {
[field_ display];
}
-// Test that -textShouldPaste: properly queries the delegate.
-TEST_F(AutocompleteTextFieldTest, TextShouldPaste) {
- EXPECT_TRUE(![field_ delegate]);
- EXPECT_TRUE([field_ textShouldPaste:nil]);
-
- scoped_nsobject<AutocompleteTextFieldTestDelegate> shouldPaste(
- [[AutocompleteTextFieldTestDelegate alloc] initWithTextShouldPaste:YES]);
- [field_ setDelegate:shouldPaste];
- EXPECT_FALSE([shouldPaste receivedTextShouldPaste]);
- EXPECT_TRUE([field_ textShouldPaste:nil]);
- EXPECT_TRUE([shouldPaste receivedTextShouldPaste]);
-
- scoped_nsobject<AutocompleteTextFieldTestDelegate> shouldNotPaste(
- [[AutocompleteTextFieldTestDelegate alloc] initWithTextShouldPaste:NO]);
- [field_ setDelegate:shouldNotPaste];
- EXPECT_FALSE([shouldNotPaste receivedTextShouldPaste]);
- EXPECT_FALSE([field_ textShouldPaste:nil]);
- EXPECT_TRUE([shouldNotPaste receivedTextShouldPaste]);
- [field_ setDelegate:nil];
-}
-
-// 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]);
- [field_ setDelegate:nil];
+ // Test without Control key down, but some other modifier down.
+ field_observer_.Reset();
+ EXPECT_FALSE(field_observer_.on_control_key_changed_called_);
+ [field_ flagsChanged:KeyDownEventWithFlags(NSShiftKeyMask)];
+ EXPECT_TRUE(field_observer_.on_control_key_changed_called_);
+ EXPECT_FALSE(field_observer_.on_control_key_changed_value_);
+
+ // Test with Control key down.
+ field_observer_.Reset();
+ EXPECT_FALSE(field_observer_.on_control_key_changed_called_);
+ [field_ flagsChanged:KeyDownEventWithFlags(NSControlKeyMask)];
+ EXPECT_TRUE(field_observer_.on_control_key_changed_called_);
+ EXPECT_TRUE(field_observer_.on_control_key_changed_value_);
}
-// 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.
+// This test is here rather than in the editor's tests because the
+// field catches -flagsChanged: because it's on the responder chain,
+// the field editor doesn't implement it.
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]);
- [field_ setDelegate:nil];
+ cocoa_helper_.makeFirstResponder(field_);
+ NSResponder* firstResponder = [[field_ window] firstResponder];
+ EXPECT_EQ(firstResponder, [field_ currentEditor]);
+
+ // Test without Control key down, but some other modifier down.
+ field_observer_.Reset();
+ EXPECT_FALSE(field_observer_.on_control_key_changed_called_);
+ [firstResponder flagsChanged:KeyDownEventWithFlags(NSShiftKeyMask)];
+ EXPECT_TRUE(field_observer_.on_control_key_changed_called_);
+ EXPECT_FALSE(field_observer_.on_control_key_changed_value_);
+
+ // Test with Control key down.
+ field_observer_.Reset();
+ EXPECT_FALSE(field_observer_.on_control_key_changed_called_);
+ [firstResponder flagsChanged:KeyDownEventWithFlags(NSControlKeyMask)];
+ EXPECT_TRUE(field_observer_.on_control_key_changed_called_);
+ EXPECT_TRUE(field_observer_.on_control_key_changed_value_);
}
// Test that the field editor is reset correctly when search keyword
@@ -254,7 +236,7 @@ TEST_F(AutocompleteTextFieldTest, ResetFieldEditorBlocksEndEditing) {
// the expected times.
{
scoped_nsobject<AutocompleteTextFieldTestDelegate> delegate(
- [[AutocompleteTextFieldTestDelegate alloc] initWithTextShouldPaste:NO]);
+ [[AutocompleteTextFieldTestDelegate alloc] init]);
EXPECT_FALSE([delegate receivedControlTextDidBeginEditing]);
EXPECT_FALSE([delegate receivedControlTextShouldEndEditing]);
@@ -280,7 +262,7 @@ TEST_F(AutocompleteTextFieldTest, ResetFieldEditorBlocksEndEditing) {
// sending that message.
{
scoped_nsobject<AutocompleteTextFieldTestDelegate> delegate(
- [[AutocompleteTextFieldTestDelegate alloc] initWithTextShouldPaste:NO]);
+ [[AutocompleteTextFieldTestDelegate alloc] init]);
[field_ setDelegate:delegate];
EXPECT_FALSE([delegate receivedControlTextDidBeginEditing]);
EXPECT_FALSE([delegate receivedControlTextShouldEndEditing]);
@@ -301,26 +283,15 @@ TEST_F(AutocompleteTextFieldTest, ResetFieldEditorBlocksEndEditing) {
@implementation AutocompleteTextFieldTestDelegate
-- initWithTextShouldPaste:(BOOL)flag {
+- init {
self = [super init];
if (self) {
- textShouldPaste_ = flag;
- receivedTextShouldPaste_ = NO;
- receivedFlagsChanged_ = NO;
receivedControlTextDidBeginEditing_ = NO;
receivedControlTextShouldEndEditing_ = NO;
}
return self;
}
-- (BOOL)receivedTextShouldPaste {
- return receivedTextShouldPaste_;
-}
-
-- (BOOL)receivedFlagsChanged {
- return receivedFlagsChanged_;
-}
-
- (BOOL)receivedControlTextDidBeginEditing {
return receivedControlTextDidBeginEditing_;
}
@@ -329,15 +300,6 @@ TEST_F(AutocompleteTextFieldTest, ResetFieldEditorBlocksEndEditing) {
return receivedControlTextShouldEndEditing_;
}
-- (BOOL)control:(NSControl*)control textShouldPaste:(NSText*)fieldEditor {
- receivedTextShouldPaste_ = YES;
- return textShouldPaste_;
-}
-
-- (void)control:(id)control flagsChanged:(NSEvent*)theEvent {
- receivedFlagsChanged_ = YES;
-}
-
- (void)controlTextDidBeginEditing:(NSNotification*)aNotification {
receivedControlTextDidBeginEditing_ = YES;
}
@@ -348,21 +310,3 @@ TEST_F(AutocompleteTextFieldTest, ResetFieldEditorBlocksEndEditing) {
}
@end
-
-@implementation AutocompleteTextFieldWindowTestDelegate
-
-- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)anObject {
- EXPECT_TRUE([anObject isKindOfClass:[AutocompleteTextField class]]);
-
- if (editor_ == nil) {
- editor_.reset([[AutocompleteTextFieldEditor alloc] init]);
- }
- EXPECT_TRUE(editor_ != nil);
-
- // This needs to be called every time, otherwise notifications
- // aren't sent correctly.
- [editor_ setFieldEditor:YES];
- return editor_;
-}
-
-@end
diff --git a/chrome/browser/cocoa/autocomplete_text_field_unittest_helper.h b/chrome/browser/cocoa/autocomplete_text_field_unittest_helper.h
new file mode 100644
index 0000000..ae5cb1c
--- /dev/null
+++ b/chrome/browser/cocoa/autocomplete_text_field_unittest_helper.h
@@ -0,0 +1,51 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_COCOA_AUTOCOMPLETE_TEXT_FIELD_UNITTEST_HELPER_H_
+#define CHROME_BROWSER_COCOA_AUTOCOMPLETE_TEXT_FIELD_UNITTEST_HELPER_H_
+
+#import <Cocoa/Cocoa.h>
+
+#include "base/scoped_nsobject.h"
+#import "chrome/browser/cocoa/autocomplete_text_field.h"
+
+@class AutocompleteTextFieldEditor;
+
+// Return the right field editor for AutocompleteTextField instance.
+
+@interface AutocompleteTextFieldWindowTestDelegate : NSObject {
+ scoped_nsobject<AutocompleteTextFieldEditor> editor_;
+}
+- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)anObject;
+@end
+
+namespace {
+
+// Allow monitoring calls into AutocompleteTextField's observer.
+
+class AutocompleteTextFieldObserverMock : public AutocompleteTextFieldObserver {
+ public:
+ virtual void OnControlKeyChanged(bool pressed) {
+ on_control_key_changed_called_ = true;
+ on_control_key_changed_value_ = pressed;
+ }
+
+ virtual void OnPaste() {
+ on_paste_called_ = true;
+ }
+
+ void Reset() {
+ on_control_key_changed_called_ = false;
+ on_control_key_changed_value_ = false;
+ on_paste_called_ = false;
+ }
+
+ bool on_control_key_changed_called_;
+ bool on_control_key_changed_value_;
+ bool on_paste_called_;
+};
+
+} // namespace
+
+#endif // CHROME_BROWSER_COCOA_AUTOCOMPLETE_TEXT_FIELD_UNITTEST_HELPER_H_
diff --git a/chrome/browser/cocoa/autocomplete_text_field_unittest_helper.mm b/chrome/browser/cocoa/autocomplete_text_field_unittest_helper.mm
new file mode 100644
index 0000000..5e3f4d8
--- /dev/null
+++ b/chrome/browser/cocoa/autocomplete_text_field_unittest_helper.mm
@@ -0,0 +1,27 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "chrome/browser/cocoa/autocomplete_text_field_unittest_helper.h"
+
+#import "chrome/browser/cocoa/autocomplete_text_field.h"
+#import "chrome/browser/cocoa/autocomplete_text_field_editor.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+@implementation AutocompleteTextFieldWindowTestDelegate
+
+- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)anObject {
+ EXPECT_TRUE([anObject isKindOfClass:[AutocompleteTextField class]]);
+
+ if (editor_ == nil) {
+ editor_.reset([[AutocompleteTextFieldEditor alloc] init]);
+ }
+ EXPECT_TRUE(editor_ != nil);
+
+ // This needs to be called every time, otherwise notifications
+ // aren't sent correctly.
+ [editor_ setFieldEditor:YES];
+ return editor_;
+}
+
+@end