diff options
author | shess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-21 19:20:35 +0000 |
---|---|---|
committer | shess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-21 19:20:35 +0000 |
commit | ae49b018895081bbef1bd67d80e0cdeffc3b5558 (patch) | |
tree | 2204c81d41fa79e18e41900e4f06fe8a790aea5e /chrome/browser/cocoa | |
parent | d2405cdc8e15532905e7c8f963cc69039be2b636 (diff) | |
download | chromium_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')
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 |