1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/memory/scoped_nsobject.h" 6#import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.h" 7#import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_view.h" 8#import "chrome/browser/ui/cocoa/bookmarks/bookmark_button.h" 9#import "chrome/browser/ui/cocoa/bookmarks/bookmark_folder_target.h" 10#import "chrome/browser/ui/cocoa/cocoa_test_helper.h" 11#import "chrome/browser/ui/cocoa/url_drop_target.h" 12#include "testing/gtest/include/gtest/gtest.h" 13#include "testing/platform_test.h" 14#import "third_party/mozilla/NSPasteboard+Utils.h" 15 16namespace { 17 const CGFloat kFakeIndicatorPos = 7.0; 18}; 19 20// Fake DraggingInfo, fake BookmarkBarController, fake NSPasteboard... 21@interface FakeBookmarkDraggingInfo : NSObject { 22 @public 23 BOOL dragButtonToPong_; 24 BOOL dragURLsPong_; 25 BOOL dragBookmarkDataPong_; 26 BOOL dropIndicatorShown_; 27 BOOL draggingEnteredCalled_; 28 // Only mock one type of drag data at a time. 29 NSString* dragDataType_; 30} 31@property (nonatomic) BOOL dropIndicatorShown; 32@property (nonatomic) BOOL draggingEnteredCalled; 33@property (nonatomic, copy) NSString* dragDataType; 34@end 35 36@implementation FakeBookmarkDraggingInfo 37 38@synthesize dropIndicatorShown = dropIndicatorShown_; 39@synthesize draggingEnteredCalled = draggingEnteredCalled_; 40@synthesize dragDataType = dragDataType_; 41 42- (id)init { 43 if ((self = [super init])) { 44 dropIndicatorShown_ = YES; 45 } 46 return self; 47} 48 49- (void)dealloc { 50 [dragDataType_ release]; 51 [super dealloc]; 52} 53 54- (void)reset { 55 [dragDataType_ release]; 56 dragDataType_ = nil; 57 dragButtonToPong_ = NO; 58 dragURLsPong_ = NO; 59 dragBookmarkDataPong_ = NO; 60 dropIndicatorShown_ = YES; 61 draggingEnteredCalled_ = NO; 62} 63 64// NSDragInfo mocking functions. 65 66- (id)draggingPasteboard { 67 return self; 68} 69 70// So we can look local. 71- (id)draggingSource { 72 return self; 73} 74 75- (NSDragOperation)draggingSourceOperationMask { 76 return NSDragOperationCopy | NSDragOperationMove; 77} 78 79- (NSPoint)draggingLocation { 80 return NSMakePoint(10, 10); 81} 82 83// NSPasteboard mocking functions. 84 85- (BOOL)containsURLData { 86 NSArray* urlTypes = [URLDropTargetHandler handledDragTypes]; 87 if (dragDataType_) 88 return [urlTypes containsObject:dragDataType_]; 89 return NO; 90} 91 92- (NSData*)dataForType:(NSString*)type { 93 if (dragDataType_ && [dragDataType_ isEqualToString:type]) 94 return [NSData data]; // Return something, anything. 95 return nil; 96} 97 98// Fake a controller for callback ponging 99 100- (BOOL)dragButton:(BookmarkButton*)button to:(NSPoint)point copy:(BOOL)copy { 101 dragButtonToPong_ = YES; 102 return YES; 103} 104 105- (BOOL)addURLs:(NSArray*)urls withTitles:(NSArray*)titles at:(NSPoint)point { 106 dragURLsPong_ = YES; 107 return YES; 108} 109 110- (void)getURLs:(NSArray**)outUrls 111 andTitles:(NSArray**)outTitles 112 convertingFilenames:(BOOL)convertFilenames { 113} 114 115- (BOOL)dragBookmarkData:(id<NSDraggingInfo>)info { 116 dragBookmarkDataPong_ = YES; 117 return NO; 118} 119 120- (BOOL)canEditBookmarks { 121 return YES; 122} 123 124// Confirm the pongs. 125 126- (BOOL)dragButtonToPong { 127 return dragButtonToPong_; 128} 129 130- (BOOL)dragURLsPong { 131 return dragURLsPong_; 132} 133 134- (BOOL)dragBookmarkDataPong { 135 return dragBookmarkDataPong_; 136} 137 138- (CGFloat)indicatorPosForDragToPoint:(NSPoint)point { 139 return kFakeIndicatorPos; 140} 141 142- (BOOL)shouldShowIndicatorShownForPoint:(NSPoint)point { 143 return dropIndicatorShown_; 144} 145 146- (BOOL)draggingAllowed:(id<NSDraggingInfo>)info { 147 return YES; 148} 149 150- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)info { 151 draggingEnteredCalled_ = YES; 152 return NSDragOperationNone; 153} 154 155- (void)setDropInsertionPos:(CGFloat)where { 156} 157 158- (void)clearDropInsertionPos { 159} 160 161@end 162 163namespace { 164 165class BookmarkBarViewTest : public CocoaTest { 166 public: 167 virtual void SetUp() { 168 CocoaTest::SetUp(); 169 view_.reset([[BookmarkBarView alloc] init]); 170 } 171 172 scoped_nsobject<BookmarkBarView> view_; 173}; 174 175TEST_F(BookmarkBarViewTest, CanDragWindow) { 176 EXPECT_FALSE([view_ mouseDownCanMoveWindow]); 177} 178 179TEST_F(BookmarkBarViewTest, BookmarkButtonDragAndDrop) { 180 scoped_nsobject<FakeBookmarkDraggingInfo> 181 info([[FakeBookmarkDraggingInfo alloc] init]); 182 [view_ setController:info.get()]; 183 [info reset]; 184 185 [info setDragDataType:kBookmarkButtonDragType]; 186 EXPECT_EQ([view_ draggingEntered:(id)info.get()], NSDragOperationMove); 187 EXPECT_TRUE([view_ performDragOperation:(id)info.get()]); 188 EXPECT_TRUE([info dragButtonToPong]); 189 EXPECT_FALSE([info dragURLsPong]); 190 EXPECT_TRUE([info dragBookmarkDataPong]); 191} 192 193TEST_F(BookmarkBarViewTest, URLDragAndDrop) { 194 scoped_nsobject<FakeBookmarkDraggingInfo> 195 info([[FakeBookmarkDraggingInfo alloc] init]); 196 [view_ setController:info.get()]; 197 [info reset]; 198 199 NSArray* dragTypes = [URLDropTargetHandler handledDragTypes]; 200 for (NSString* type in dragTypes) { 201 [info setDragDataType:type]; 202 EXPECT_EQ([view_ draggingEntered:(id)info.get()], NSDragOperationMove); 203 EXPECT_TRUE([view_ performDragOperation:(id)info.get()]); 204 EXPECT_FALSE([info dragButtonToPong]); 205 EXPECT_TRUE([info dragURLsPong]); 206 EXPECT_TRUE([info dragBookmarkDataPong]); 207 [info reset]; 208 } 209} 210 211TEST_F(BookmarkBarViewTest, BookmarkButtonDropIndicator) { 212 scoped_nsobject<FakeBookmarkDraggingInfo> 213 info([[FakeBookmarkDraggingInfo alloc] init]); 214 [view_ setController:info.get()]; 215 216 [info reset]; 217 [info setDragDataType:kBookmarkButtonDragType]; 218 EXPECT_FALSE([info draggingEnteredCalled]); 219 EXPECT_EQ([view_ draggingEntered:(id)info.get()], NSDragOperationMove); 220 EXPECT_TRUE([info draggingEnteredCalled]); // Ensure controller pinged. 221 EXPECT_TRUE([view_ dropIndicatorShown]); 222 EXPECT_EQ([view_ dropIndicatorPosition], kFakeIndicatorPos); 223 224 [info setDropIndicatorShown:NO]; 225 EXPECT_EQ([view_ draggingEntered:(id)info.get()], NSDragOperationMove); 226 EXPECT_FALSE([view_ dropIndicatorShown]); 227} 228 229} // namespace 230