| OLD | NEW | 
|    1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |    1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 #import "chrome/browser/cocoa/autocomplete_text_field_editor.h" |    5 #import "chrome/browser/cocoa/autocomplete_text_field_editor.h" | 
|    6  |    6  | 
|    7 #include "base/scoped_nsobject.h" |    7 #include "base/scoped_nsobject.h" | 
|    8 #include "base/scoped_ptr.h" |    8 #include "base/scoped_ptr.h" | 
|    9 #include "base/string_util.h" |    9 #include "base/string_util.h" | 
 |   10 #import "chrome/browser/cocoa/autocomplete_text_field_unittest_helper.h" | 
|   10 #import "chrome/browser/cocoa/cocoa_test_helper.h" |   11 #import "chrome/browser/cocoa/cocoa_test_helper.h" | 
|   11 #include "testing/gtest/include/gtest/gtest.h" |   12 #include "testing/gtest/include/gtest/gtest.h" | 
|   12 #include "testing/platform_test.h" |   13 #include "testing/platform_test.h" | 
|   13  |   14  | 
|   14 @interface AutocompleteTextFieldEditorTestDelegate : NSObject { |  | 
|   15   BOOL textShouldPaste_; |  | 
|   16   BOOL receivedTextShouldPaste_; |  | 
|   17 } |  | 
|   18 - initWithTextShouldPaste:(BOOL)flag; |  | 
|   19 - (BOOL)receivedTextShouldPaste; |  | 
|   20 @end |  | 
|   21  |  | 
|   22 namespace { |   15 namespace { | 
|   23  |   16  | 
|   24 int NumTypesOnPasteboard(NSPasteboard* pb) { |   17 int NumTypesOnPasteboard(NSPasteboard* pb) { | 
|   25   return [[pb types] count]; |   18   return [[pb types] count]; | 
|   26 } |   19 } | 
|   27  |   20  | 
|   28 void ClearPasteboard(NSPasteboard* pb) { |   21 void ClearPasteboard(NSPasteboard* pb) { | 
|   29   [pb declareTypes:[NSArray array] owner:nil]; |   22   [pb declareTypes:[NSArray array] owner:nil]; | 
|   30 } |   23 } | 
|   31  |   24  | 
|   32 bool NoRichTextOnClipboard(NSPasteboard* pb) { |   25 bool NoRichTextOnClipboard(NSPasteboard* pb) { | 
|   33   return ([pb dataForType:NSRTFPboardType] == nil) && |   26   return ([pb dataForType:NSRTFPboardType] == nil) && | 
|   34       ([pb dataForType:NSRTFDPboardType] == nil) && |   27       ([pb dataForType:NSRTFDPboardType] == nil) && | 
|   35       ([pb dataForType:NSHTMLPboardType] == nil); |   28       ([pb dataForType:NSHTMLPboardType] == nil); | 
|   36 } |   29 } | 
|   37  |   30  | 
|   38 bool ClipboardContainsText(NSPasteboard* pb, NSString* cmp) { |   31 bool ClipboardContainsText(NSPasteboard* pb, NSString* cmp) { | 
|   39   NSString* clipboard_text = [pb stringForType:NSStringPboardType]; |   32   NSString* clipboard_text = [pb stringForType:NSStringPboardType]; | 
|   40   return [clipboard_text isEqualToString:cmp]; |   33   return [clipboard_text isEqualToString:cmp]; | 
|   41 } |   34 } | 
|   42  |   35  | 
|   43 class AutocompleteTextFieldEditorTest : public PlatformTest { |   36 class AutocompleteTextFieldEditorTest : public PlatformTest { | 
|   44  public: |   37  public: | 
|   45   AutocompleteTextFieldEditorTest() |   38   AutocompleteTextFieldEditorTest() | 
|   46       : pb_([NSPasteboard pasteboardWithUniqueName]) { |   39       : pb_([NSPasteboard pasteboardWithUniqueName]) { | 
|   47     NSRect frame = NSMakeRect(0, 0, 50, 30); |   40     NSRect frame = NSMakeRect(0, 0, 50, 30); | 
|   48     editor_.reset([[AutocompleteTextFieldEditor alloc] initWithFrame:frame]); |   41     field_.reset([[AutocompleteTextField alloc] initWithFrame:frame]); | 
|   49     [editor_ setString:@"Testing"]; |   42     [field_ setStringValue:@"Testing"]; | 
|   50     [cocoa_helper_.contentView() addSubview:editor_.get()]; |   43     [field_ setObserver:&field_observer_]; | 
 |   44     [cocoa_helper_.contentView() addSubview:field_.get()]; | 
 |   45  | 
 |   46     // Arrange for |field_| to get the right field editor. | 
 |   47     window_delegate_.reset( | 
 |   48         [[AutocompleteTextFieldWindowTestDelegate alloc] init]); | 
 |   49     [cocoa_helper_.window() setDelegate:window_delegate_]; | 
 |   50  | 
 |   51     // Get the field editor setup. | 
 |   52     cocoa_helper_.makeFirstResponder(field_); | 
 |   53     id editor = [field_.get() currentEditor]; | 
 |   54     editor_.reset([static_cast<AutocompleteTextFieldEditor*>(editor) retain]); | 
|   51   } |   55   } | 
|   52  |   56  | 
 |   57   virtual void SetUp() { | 
 |   58     EXPECT_TRUE(editor_.get() != nil); | 
 |   59     EXPECT_TRUE( | 
 |   60         [editor_.get() isKindOfClass:[AutocompleteTextFieldEditor class]]); | 
 |   61   } | 
 |   62  | 
 |   63   // The removeFromSuperview call is needed to prevent crashes in | 
 |   64   // later tests. | 
 |   65   // TODO(shess): -removeromSuperview should not be necessary.  Fix | 
 |   66   // it.  Also in autocomplete_text_field_unittest.mm. | 
|   53   virtual ~AutocompleteTextFieldEditorTest() { |   67   virtual ~AutocompleteTextFieldEditorTest() { | 
 |   68     [cocoa_helper_.window() setDelegate:nil]; | 
 |   69     [field_ removeFromSuperview]; | 
|   54     [pb_ releaseGlobally]; |   70     [pb_ releaseGlobally]; | 
|   55   } |   71   } | 
|   56  |   72  | 
|   57   NSPasteboard *clipboard() { |   73   NSPasteboard *clipboard() { | 
|   58     DCHECK(pb_); |   74     DCHECK(pb_); | 
|   59     return pb_; |   75     return pb_; | 
|   60   } |   76   } | 
|   61  |   77  | 
|   62   CocoaTestHelper cocoa_helper_;  // Inits Cocoa, creates window, etc... |   78   CocoaTestHelper cocoa_helper_;  // Inits Cocoa, creates window, etc... | 
|   63   scoped_nsobject<AutocompleteTextFieldEditor> editor_; |   79   scoped_nsobject<AutocompleteTextFieldEditor> editor_; | 
 |   80   scoped_nsobject<AutocompleteTextField> field_; | 
 |   81   AutocompleteTextFieldObserverMock field_observer_; | 
 |   82   scoped_nsobject<AutocompleteTextFieldWindowTestDelegate> window_delegate_; | 
|   64  |   83  | 
|   65  private: |   84  private: | 
|   66   NSPasteboard *pb_; |   85   NSPasteboard *pb_; | 
|   67 }; |   86 }; | 
|   68  |   87  | 
 |   88 // Test that the field editor is linked in correctly. | 
 |   89 TEST_F(AutocompleteTextFieldEditorTest, FirstResponder) { | 
 |   90   EXPECT_EQ(editor_.get(), [field_ currentEditor]); | 
 |   91   EXPECT_TRUE([editor_.get() isDescendantOf:field_.get()]); | 
 |   92   EXPECT_EQ([editor_.get() delegate], field_.get()); | 
 |   93   EXPECT_EQ([editor_.get() observer], [field_.get() observer]); | 
 |   94 } | 
 |   95  | 
|   69 TEST_F(AutocompleteTextFieldEditorTest, CutCopyTest) { |   96 TEST_F(AutocompleteTextFieldEditorTest, CutCopyTest) { | 
|   70   // Make sure pasteboard is empty before we start. |   97   // Make sure pasteboard is empty before we start. | 
|   71   ASSERT_EQ(NumTypesOnPasteboard(clipboard()), 0); |   98   ASSERT_EQ(NumTypesOnPasteboard(clipboard()), 0); | 
|   72  |   99  | 
|   73   NSString* test_string_1 = @"astring"; |  100   NSString* test_string_1 = @"astring"; | 
|   74   NSString* test_string_2 = @"another string"; |  101   NSString* test_string_2 = @"another string"; | 
|   75  |  102  | 
|   76   [editor_.get() setRichText:YES]; |  103   [editor_.get() setRichText:YES]; | 
|   77  |  104  | 
|   78   // Put some text on the clipboard. |  105   // Put some text on the clipboard. | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
|   92   [editor_.get() alignLeft:nil];  // Add a rich text attribute. |  119   [editor_.get() alignLeft:nil];  // Add a rich text attribute. | 
|   93   [editor_.get() performCut:clipboard()]; |  120   [editor_.get() performCut:clipboard()]; | 
|   94   ASSERT_TRUE(NoRichTextOnClipboard(clipboard())); |  121   ASSERT_TRUE(NoRichTextOnClipboard(clipboard())); | 
|   95   ASSERT_TRUE(ClipboardContainsText(clipboard(), test_string_2)); |  122   ASSERT_TRUE(ClipboardContainsText(clipboard(), test_string_2)); | 
|   96   ASSERT_EQ([[editor_.get() textStorage] length], 0U); |  123   ASSERT_EQ([[editor_.get() textStorage] length], 0U); | 
|   97 } |  124 } | 
|   98  |  125  | 
|   99 // Test adding/removing from the view hierarchy, mostly to ensure nothing |  126 // Test adding/removing from the view hierarchy, mostly to ensure nothing | 
|  100 // leaks or crashes. |  127 // leaks or crashes. | 
|  101 TEST_F(AutocompleteTextFieldEditorTest, AddRemove) { |  128 TEST_F(AutocompleteTextFieldEditorTest, AddRemove) { | 
|  102   EXPECT_EQ(cocoa_helper_.contentView(), [editor_ superview]); |  129   EXPECT_EQ(cocoa_helper_.contentView(), [field_ superview]); | 
|  103   [editor_.get() removeFromSuperview]; |  130  | 
|  104   EXPECT_FALSE([editor_ superview]); |  131   // TODO(shess): For some reason, -removeFromSuperview while |field_| | 
 |  132   // is first-responder causes AutocompleteTextFieldWindowTestDelegate | 
 |  133   // -windowWillReturnFieldEditor:toObject: to be passed an object of | 
 |  134   // class AutocompleteTextFieldEditor.  Which is weird.  Changing | 
 |  135   // first responder will remove the field editor. | 
 |  136   cocoa_helper_.makeFirstResponder(nil); | 
 |  137   EXPECT_FALSE([field_.get() currentEditor]); | 
 |  138   EXPECT_FALSE([editor_.get() superview]); | 
 |  139  | 
 |  140   [field_.get() removeFromSuperview]; | 
 |  141   EXPECT_FALSE([field_.get() superview]); | 
|  105 } |  142 } | 
|  106  |  143  | 
|  107 // Test drawing, mostly to ensure nothing leaks or crashes. |  144 // Test drawing, mostly to ensure nothing leaks or crashes. | 
|  108 TEST_F(AutocompleteTextFieldEditorTest, Display) { |  145 TEST_F(AutocompleteTextFieldEditorTest, Display) { | 
 |  146   [field_ display]; | 
|  109   [editor_ display]; |  147   [editor_ display]; | 
|  110 } |  148 } | 
|  111  |  149  | 
|  112 // Test that -shouldPaste properly queries the delegate. |  150 // Test that -paste: is correctly delegated to the observer. | 
|  113 TEST_F(AutocompleteTextFieldEditorTest, TextShouldPaste) { |  151 TEST_F(AutocompleteTextFieldEditorTest, Paste) { | 
|  114   EXPECT_TRUE(![editor_ delegate]); |  152   field_observer_.Reset(); | 
|  115   EXPECT_TRUE([editor_ shouldPaste]); |  153   EXPECT_FALSE(field_observer_.on_paste_called_); | 
|  116  |  154   [editor_.get() paste:nil]; | 
|  117   scoped_nsobject<AutocompleteTextFieldEditorTestDelegate> shouldPaste( |  155   EXPECT_TRUE(field_observer_.on_paste_called_); | 
|  118       [[AutocompleteTextFieldEditorTestDelegate alloc] |  | 
|  119         initWithTextShouldPaste:YES]); |  | 
|  120   [editor_ setDelegate:shouldPaste]; |  | 
|  121   EXPECT_FALSE([shouldPaste receivedTextShouldPaste]); |  | 
|  122   EXPECT_TRUE([editor_ shouldPaste]); |  | 
|  123   EXPECT_TRUE([shouldPaste receivedTextShouldPaste]); |  | 
|  124  |  | 
|  125   scoped_nsobject<AutocompleteTextFieldEditorTestDelegate> shouldNotPaste( |  | 
|  126       [[AutocompleteTextFieldEditorTestDelegate alloc] |  | 
|  127         initWithTextShouldPaste:NO]); |  | 
|  128   [editor_ setDelegate:shouldNotPaste]; |  | 
|  129   EXPECT_FALSE([shouldNotPaste receivedTextShouldPaste]); |  | 
|  130   EXPECT_FALSE([editor_ shouldPaste]); |  | 
|  131   EXPECT_TRUE([shouldNotPaste receivedTextShouldPaste]); |  | 
|  132 } |  156 } | 
|  133  |  157  | 
|  134 }  // namespace |  158 }  // namespace | 
|  135  |  | 
|  136 @implementation AutocompleteTextFieldEditorTestDelegate |  | 
|  137  |  | 
|  138 - initWithTextShouldPaste:(BOOL)flag { |  | 
|  139   self = [super init]; |  | 
|  140   if (self) { |  | 
|  141     textShouldPaste_ = flag; |  | 
|  142     receivedTextShouldPaste_ = NO; |  | 
|  143   } |  | 
|  144   return self; |  | 
|  145 } |  | 
|  146  |  | 
|  147 - (BOOL)receivedTextShouldPaste { |  | 
|  148   return receivedTextShouldPaste_; |  | 
|  149 } |  | 
|  150  |  | 
|  151 - (BOOL)textShouldPaste:(NSText*)fieldEditor { |  | 
|  152   receivedTextShouldPaste_ = YES; |  | 
|  153   return textShouldPaste_; |  | 
|  154 } |  | 
|  155  |  | 
|  156 @end |  | 
| OLD | NEW |