Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5120)

Unified Diff: chrome/browser/cocoa/autocomplete_text_field_unittest.mm

Issue 159250: [Mac] Omnibox keyword, keyword hint, and search hint support. (Closed)
Patch Set: Get rid of funky cells and other comment responses. Created 11 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/cocoa/autocomplete_text_field_editor.h ('k') | chrome/browser/cocoa/location_bar_view_mac.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/cocoa/autocomplete_text_field_unittest.mm
diff --git a/chrome/browser/cocoa/autocomplete_text_field_unittest.mm b/chrome/browser/cocoa/autocomplete_text_field_unittest.mm
index e8a8fb8c833c7af016c9f69199d7645487a34894..cad88ba749daa81e6690f38e90934deeae29b1a1 100644
--- a/chrome/browser/cocoa/autocomplete_text_field_unittest.mm
+++ b/chrome/browser/cocoa/autocomplete_text_field_unittest.mm
@@ -15,10 +15,20 @@
BOOL textShouldPaste_;
BOOL receivedTextShouldPaste_;
BOOL receivedFlagsChanged_;
+ BOOL receivedControlTextDidBeginEditing_;
+ BOOL receivedControlTextShouldEndEditing_;
}
- initWithTextShouldPaste:(BOOL)flag;
- (BOOL)receivedTextShouldPaste;
- (BOOL)receivedFlagsChanged;
+- (BOOL)receivedControlTextDidBeginEditing;
+- (BOOL)receivedControlTextShouldEndEditing;
+@end
+
+@interface AutocompleteTextFieldWindowTestDelegate : NSObject {
+ scoped_nsobject<AutocompleteTextFieldEditor> editor_;
+}
+- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)anObject;
@end
namespace {
@@ -26,14 +36,21 @@ namespace {
class AutocompleteTextFieldTest : public testing::Test {
public:
AutocompleteTextFieldTest() {
- NSRect frame = NSMakeRect(0, 0, 50, 30);
+ // Make sure this is wide enough to play games with the cell
+ // decorations.
+ NSRect frame = NSMakeRect(0, 0, 300, 30);
field_.reset([[AutocompleteTextField alloc] initWithFrame:frame]);
[field_ setStringValue:@"Testing"];
[cocoa_helper_.contentView() addSubview:field_.get()];
+
+ window_delegate_.reset(
+ [[AutocompleteTextFieldWindowTestDelegate alloc] init]);
+ [cocoa_helper_.window() setDelegate:window_delegate_];
}
CocoaTestHelper cocoa_helper_; // Inits Cocoa, creates window, etc...
scoped_nsobject<AutocompleteTextField> field_;
+ scoped_nsobject<AutocompleteTextFieldWindowTestDelegate> window_delegate_;
};
// Test that we have the right cell class.
@@ -49,9 +66,33 @@ TEST_F(AutocompleteTextFieldTest, AddRemove) {
EXPECT_FALSE([field_ superview]);
}
+// Test that we get the same cell from -cell and
+// -autocompleteTextFieldCell.
+TEST_F(AutocompleteTextFieldTest, Cell) {
+ AutocompleteTextFieldCell* cell = [field_ autocompleteTextFieldCell];
+ EXPECT_EQ(cell, [field_ cell]);
+ EXPECT_TRUE(cell != nil);
+}
+
// Test drawing, mostly to ensure nothing leaks or crashes.
TEST_F(AutocompleteTextFieldTest, Display) {
[field_ display];
+
+ // Test display of various cell configurations.
+ AutocompleteTextFieldCell* cell = [field_ autocompleteTextFieldCell];
+
+ [cell setSearchHintString:@"Type to search"];
+ [field_ display];
+
+ NSImage* image = [NSImage imageNamed:@"NSApplicationIcon"];
+ [cell setKeywordHintPrefix:@"prefix" image:image suffix:@"suffix"];
+ [field_ display];
+
+ [cell setKeywordString:@"Search Engine:"];
+ [field_ display];
+
+ [cell clearKeywordAndHint];
+ [field_ display];
}
// Test that -textShouldPaste: properly queries the delegate.
@@ -115,6 +156,129 @@ TEST_F(AutocompleteTextFieldTest, FieldEditorFlagsChanged) {
EXPECT_TRUE([delegate receivedFlagsChanged]);
}
+// Test that the field editor is reset correctly when search keyword
+// or hints change.
+TEST_F(AutocompleteTextFieldTest, ResetFieldEditor) {
+ EXPECT_EQ(nil, [field_ currentEditor]);
+ EXPECT_EQ([[field_ subviews] count], 0U);
+ [[field_ window] makeFirstResponder:field_];
+ EXPECT_FALSE(nil == [field_ currentEditor]);
+ EXPECT_EQ([[field_ subviews] count], 1U);
+
+ // Check that the window delegate is working right.
+ {
+ Class c = [AutocompleteTextFieldEditor class];
+ EXPECT_TRUE([[field_ currentEditor] isKindOfClass:c]);
+ }
+
+ // The field editor may not be an immediate subview of |field_|, it
+ // may be a subview of a clipping view (for purposes of scrolling).
+ // So just look at the immediate subview.
+ EXPECT_EQ([[field_ subviews] count], 1U);
+ const NSRect baseEditorFrame([[[field_ subviews] objectAtIndex:0] frame]);
+
+ AutocompleteTextFieldCell* cell = [field_ autocompleteTextFieldCell];
+ EXPECT_FALSE([cell fieldEditorNeedsReset]);
+
+ // Asking the cell to add a search hint should leave the field
+ // editor alone until -resetFieldEditorFrameIfNeeded is called.
+ // Then the field editor should be moved to a smaller region with
+ // the same left-hand side.
+ [cell setSearchHintString:@"Type to search"];
+ EXPECT_TRUE([cell fieldEditorNeedsReset]);
+ NSRect r = [[[field_ subviews] objectAtIndex:0] frame];
+ EXPECT_TRUE(NSEqualRects(r, baseEditorFrame));
+ [field_ resetFieldEditorFrameIfNeeded];
+ r = [[[field_ subviews] objectAtIndex:0] frame];
+ EXPECT_FALSE([cell fieldEditorNeedsReset]);
+ EXPECT_FALSE(NSEqualRects(r, baseEditorFrame));
+ EXPECT_TRUE(NSContainsRect(baseEditorFrame, r));
+ EXPECT_EQ(NSMinX(r), NSMinX(baseEditorFrame));
+ EXPECT_LT(NSWidth(r), NSWidth(baseEditorFrame));
+
+ // Save the search-hint editor frame for later.
+ const NSRect searchHintEditorFrame(r);
+
+ // Asking the cell to change to keyword mode should leave the field
+ // editor alone until -resetFieldEditorFrameIfNeeded is called.
+ // Then the field editor should be moved to a smaller region with
+ // the same right-hand side.
+ [cell setKeywordString:@"Search Engine:"];
+ EXPECT_TRUE([cell fieldEditorNeedsReset]);
+ r = [[[field_ subviews] objectAtIndex:0] frame];
+ EXPECT_TRUE(NSEqualRects(r, searchHintEditorFrame));
+ [field_ resetFieldEditorFrameIfNeeded];
+ r = [[[field_ subviews] objectAtIndex:0] frame];
+ EXPECT_FALSE([cell fieldEditorNeedsReset]);
+ EXPECT_FALSE(NSEqualRects(r, baseEditorFrame));
+ EXPECT_FALSE(NSEqualRects(r, searchHintEditorFrame));
+ EXPECT_TRUE(NSContainsRect(baseEditorFrame, r));
+ EXPECT_EQ(NSMaxX(r), NSMaxX(baseEditorFrame));
+ EXPECT_LT(NSWidth(r), NSWidth(baseEditorFrame));
+
+ // Asking the cell to clear everything should leave the field editor
+ // alone until -resetFieldEditorFrameIfNeeded is called. Then the
+ // field editor should be back to baseEditorFrame.
+ [cell clearKeywordAndHint];
+ EXPECT_TRUE([cell fieldEditorNeedsReset]);
+ [field_ resetFieldEditorFrameIfNeeded];
+ r = [[[field_ subviews] objectAtIndex:0] frame];
+ EXPECT_FALSE([cell fieldEditorNeedsReset]);
+ EXPECT_TRUE(NSEqualRects(r, baseEditorFrame));
+}
+
+// Test that the field editor is reset correctly when search keyword
+// or hints change.
+TEST_F(AutocompleteTextFieldTest, ResetFieldEditorBlocksEndEditing) {
+ [[field_ window] makeFirstResponder:field_];
+
+ // First, test that -makeFirstResponder: sends
+ // -controlTextDidBeginEditing: and -control:textShouldEndEditing at
+ // the expected times.
+ {
+ scoped_nsobject<AutocompleteTextFieldTestDelegate> delegate(
+ [[AutocompleteTextFieldTestDelegate alloc] initWithTextShouldPaste:NO]);
+ EXPECT_FALSE([delegate receivedControlTextDidBeginEditing]);
+ EXPECT_FALSE([delegate receivedControlTextShouldEndEditing]);
+
+ [field_ setDelegate:delegate];
+ [[field_ window] makeFirstResponder:field_];
+ NSTextView* editor = static_cast<NSTextView*>([field_ currentEditor]);
+ EXPECT_TRUE(nil != editor);
+ EXPECT_FALSE([delegate receivedControlTextDidBeginEditing]);
+ EXPECT_FALSE([delegate receivedControlTextShouldEndEditing]);
+
+ // This should start the begin/end editing state.
+ [editor shouldChangeTextInRange:NSMakeRange(0, 0) replacementString:@""];
+ EXPECT_TRUE([delegate receivedControlTextDidBeginEditing]);
+ EXPECT_FALSE([delegate receivedControlTextShouldEndEditing]);
+
+ // This should send the end-editing message.
+ [[field_ window] makeFirstResponder:field_];
+ EXPECT_TRUE([delegate receivedControlTextShouldEndEditing]);
+ [field_ setDelegate:nil];
+ }
+
+ // Then test that -resetFieldEditorFrameIfNeeded manages without
+ // sending that message.
+ {
+ scoped_nsobject<AutocompleteTextFieldTestDelegate> delegate(
+ [[AutocompleteTextFieldTestDelegate alloc] initWithTextShouldPaste:NO]);
+ [field_ setDelegate:delegate];
+ EXPECT_FALSE([delegate receivedControlTextDidBeginEditing]);
+ EXPECT_FALSE([delegate receivedControlTextShouldEndEditing]);
+
+ AutocompleteTextFieldCell* cell = [field_ autocompleteTextFieldCell];
+ EXPECT_FALSE([cell fieldEditorNeedsReset]);
+ [cell setSearchHintString:@"Type to search"];
+ EXPECT_TRUE([cell fieldEditorNeedsReset]);
+ EXPECT_FALSE([delegate receivedControlTextShouldEndEditing]);
+ [field_ resetFieldEditorFrameIfNeeded];
+ EXPECT_FALSE([delegate receivedControlTextShouldEndEditing]);
+ EXPECT_TRUE([delegate receivedControlTextDidBeginEditing]);
+ }
+}
+
} // namespace
@implementation AutocompleteTextFieldTestDelegate
@@ -125,6 +289,8 @@ TEST_F(AutocompleteTextFieldTest, FieldEditorFlagsChanged) {
textShouldPaste_ = flag;
receivedTextShouldPaste_ = NO;
receivedFlagsChanged_ = NO;
+ receivedControlTextDidBeginEditing_ = NO;
+ receivedControlTextShouldEndEditing_ = NO;
}
return self;
}
@@ -137,6 +303,14 @@ TEST_F(AutocompleteTextFieldTest, FieldEditorFlagsChanged) {
return receivedFlagsChanged_;
}
+- (BOOL)receivedControlTextDidBeginEditing {
+ return receivedControlTextDidBeginEditing_;
+}
+
+- (BOOL)receivedControlTextShouldEndEditing {
+ return receivedControlTextShouldEndEditing_;
+}
+
- (BOOL)control:(NSControl*)control textShouldPaste:(NSText*)fieldEditor {
receivedTextShouldPaste_ = YES;
return textShouldPaste_;
@@ -146,4 +320,31 @@ TEST_F(AutocompleteTextFieldTest, FieldEditorFlagsChanged) {
receivedFlagsChanged_ = YES;
}
+- (void)controlTextDidBeginEditing:(NSNotification*)aNotification {
+ receivedControlTextDidBeginEditing_ = YES;
+}
+
+- (BOOL)control:(NSControl*)control textShouldEndEditing:(NSText*)fieldEditor {
+ receivedControlTextShouldEndEditing_ = YES;
+ return YES;
+}
+
+@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
« no previous file with comments | « chrome/browser/cocoa/autocomplete_text_field_editor.h ('k') | chrome/browser/cocoa/location_bar_view_mac.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698