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 "app/mac/nsimage_cache.h" 6#include "base/memory/scoped_nsobject.h" 7#include "base/utf_string_conversions.h" 8#include "chrome/browser/bookmarks/bookmark_model.h" 9#import "chrome/browser/ui/cocoa/bookmarks/bookmark_button_cell.h" 10#import "chrome/browser/ui/cocoa/bookmarks/bookmark_menu.h" 11#include "chrome/browser/ui/cocoa/browser_test_helper.h" 12#import "chrome/browser/ui/cocoa/cocoa_test_helper.h" 13#include "testing/gtest/include/gtest/gtest.h" 14#include "testing/platform_test.h" 15#include "ui/gfx/image.h" 16 17// Simple class to remember how many mouseEntered: and mouseExited: 18// calls it gets. Only used by BookmarkMouseForwarding but placed 19// at the top of the file to keep it outside the anon namespace. 20@interface ButtonRemembersMouseEnterExit : NSButton { 21 @public 22 int enters_; 23 int exits_; 24} 25@end 26 27@implementation ButtonRemembersMouseEnterExit 28- (void)mouseEntered:(NSEvent*)event { 29 enters_++; 30} 31- (void)mouseExited:(NSEvent*)event { 32 exits_++; 33} 34@end 35 36 37namespace { 38 39class BookmarkButtonCellTest : public CocoaTest { 40 public: 41 BrowserTestHelper helper_; 42}; 43 44// Make sure it's not totally bogus 45TEST_F(BookmarkButtonCellTest, SizeForBounds) { 46 NSRect frame = NSMakeRect(0, 0, 50, 30); 47 scoped_nsobject<NSButton> view([[NSButton alloc] initWithFrame:frame]); 48 scoped_nsobject<BookmarkButtonCell> cell( 49 [[BookmarkButtonCell alloc] initTextCell:@"Testing"]); 50 [view setCell:cell.get()]; 51 [[test_window() contentView] addSubview:view]; 52 53 NSRect r = NSMakeRect(0, 0, 100, 100); 54 NSSize size = [cell.get() cellSizeForBounds:r]; 55 EXPECT_TRUE(size.width > 0 && size.height > 0); 56 EXPECT_TRUE(size.width < 200 && size.height < 200); 57} 58 59// Make sure icon-only buttons are squeezed tightly. 60TEST_F(BookmarkButtonCellTest, IconOnlySqueeze) { 61 NSRect frame = NSMakeRect(0, 0, 50, 30); 62 scoped_nsobject<NSButton> view([[NSButton alloc] initWithFrame:frame]); 63 scoped_nsobject<BookmarkButtonCell> cell( 64 [[BookmarkButtonCell alloc] initTextCell:@"Testing"]); 65 [view setCell:cell.get()]; 66 [[test_window() contentView] addSubview:view]; 67 68 scoped_nsobject<NSImage> image( 69 [app::mac::GetCachedImageWithName(@"nav.pdf") retain]); 70 EXPECT_TRUE(image.get()); 71 72 NSRect r = NSMakeRect(0, 0, 100, 100); 73 [cell setBookmarkCellText:@" " image:image]; 74 CGFloat two_space_width = [cell.get() cellSizeForBounds:r].width; 75 [cell setBookmarkCellText:@" " image:image]; 76 CGFloat one_space_width = [cell.get() cellSizeForBounds:r].width; 77 [cell setBookmarkCellText:@"" image:image]; 78 CGFloat zero_space_width = [cell.get() cellSizeForBounds:r].width; 79 80 // Make sure the switch to "no title" is more significant than we 81 // would otherwise see by decreasing the length of the title. 82 CGFloat delta1 = two_space_width - one_space_width; 83 CGFloat delta2 = one_space_width - zero_space_width; 84 EXPECT_GT(delta2, delta1); 85 86} 87 88// Make sure the default from the base class is overridden. 89TEST_F(BookmarkButtonCellTest, MouseEnterStuff) { 90 scoped_nsobject<BookmarkButtonCell> cell( 91 [[BookmarkButtonCell alloc] initTextCell:@"Testing"]); 92 // Setting the menu should have no affect since we either share or 93 // dynamically compose the menu given a node. 94 [cell setMenu:[[[BookmarkMenu alloc] initWithTitle:@"foo"] autorelease]]; 95 EXPECT_FALSE([cell menu]); 96 97 BookmarkModel* model = helper_.profile()->GetBookmarkModel(); 98 const BookmarkNode* node = model->GetBookmarkBarNode(); 99 [cell setEmpty:NO]; 100 [cell setBookmarkNode:node]; 101 EXPECT_TRUE([cell showsBorderOnlyWhileMouseInside]); 102 EXPECT_TRUE([cell menu]); 103 104 [cell setEmpty:YES]; 105 EXPECT_FALSE([cell.get() showsBorderOnlyWhileMouseInside]); 106 EXPECT_FALSE([cell menu]); 107} 108 109TEST_F(BookmarkButtonCellTest, BookmarkNode) { 110 BookmarkModel& model(*(helper_.profile()->GetBookmarkModel())); 111 scoped_nsobject<BookmarkButtonCell> cell( 112 [[BookmarkButtonCell alloc] initTextCell:@"Testing"]); 113 114 const BookmarkNode* node = model.GetBookmarkBarNode(); 115 [cell setBookmarkNode:node]; 116 EXPECT_EQ(node, [cell bookmarkNode]); 117 118 node = model.other_node(); 119 [cell setBookmarkNode:node]; 120 EXPECT_EQ(node, [cell bookmarkNode]); 121} 122 123TEST_F(BookmarkButtonCellTest, BookmarkMouseForwarding) { 124 scoped_nsobject<BookmarkButtonCell> cell( 125 [[BookmarkButtonCell alloc] initTextCell:@"Testing"]); 126 scoped_nsobject<ButtonRemembersMouseEnterExit> 127 button([[ButtonRemembersMouseEnterExit alloc] 128 initWithFrame:NSMakeRect(0,0,50,50)]); 129 [button setCell:cell.get()]; 130 EXPECT_EQ(0, button.get()->enters_); 131 EXPECT_EQ(0, button.get()->exits_); 132 NSEvent* event = [NSEvent mouseEventWithType:NSMouseMoved 133 location:NSMakePoint(10,10) 134 modifierFlags:0 135 timestamp:0 136 windowNumber:0 137 context:nil 138 eventNumber:0 139 clickCount:0 140 pressure:0]; 141 [cell mouseEntered:event]; 142 EXPECT_TRUE(button.get()->enters_ && !button.get()->exits_); 143 144 for (int i = 0; i < 3; i++) 145 [cell mouseExited:event]; 146 EXPECT_EQ(button.get()->enters_, 1); 147 EXPECT_EQ(button.get()->exits_, 3); 148} 149 150// Confirms a cell created in a nib is initialized properly 151TEST_F(BookmarkButtonCellTest, Awake) { 152 scoped_nsobject<BookmarkButtonCell> cell([[BookmarkButtonCell alloc] init]); 153 [cell awakeFromNib]; 154 EXPECT_EQ(NSLeftTextAlignment, [cell alignment]); 155} 156 157// Subfolder arrow details. 158TEST_F(BookmarkButtonCellTest, FolderArrow) { 159 BookmarkModel* model = helper_.profile()->GetBookmarkModel(); 160 const BookmarkNode* bar = model->GetBookmarkBarNode(); 161 const BookmarkNode* node = model->AddURL(bar, bar->child_count(), 162 ASCIIToUTF16("title"), 163 GURL("http://www.google.com")); 164 scoped_nsobject<BookmarkButtonCell> cell( 165 [[BookmarkButtonCell alloc] initForNode:node 166 contextMenu:nil 167 cellText:@"small" 168 cellImage:nil]); 169 EXPECT_TRUE(cell.get()); 170 171 NSSize size = [cell cellSize]; 172 // sanity check 173 EXPECT_GE(size.width, 2); 174 EXPECT_GE(size.height, 2); 175 176 // Once we turn on arrow drawing make sure there is now room for it. 177 [cell setDrawFolderArrow:YES]; 178 NSSize arrowSize = [cell cellSize]; 179 EXPECT_GT(arrowSize.width, size.width); 180} 181 182} // namespace 183