Home | History | Annotate | Download | only in bookmarks
      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 #include "base/utf_string_conversions.h"
      7 #include "chrome/browser/bookmarks/bookmark_model.h"
      8 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_button.h"
      9 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_button_cell.h"
     10 #import "chrome/browser/ui/cocoa/browser_test_helper.h"
     11 #import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
     12 #import "chrome/browser/ui/cocoa/test_event_utils.h"
     13 #include "testing/gtest/include/gtest/gtest.h"
     14 #include "testing/platform_test.h"
     15 
     16 // Fake BookmarkButton delegate to get a pong on mouse entered/exited
     17 @interface FakeButtonDelegate : NSObject<BookmarkButtonDelegate> {
     18  @public
     19   int entered_;
     20   int exited_;
     21   BOOL canDragToTrash_;
     22   int didDragToTrashCount_;
     23 }
     24 @end
     25 
     26 @implementation FakeButtonDelegate
     27 
     28 - (void)fillPasteboard:(NSPasteboard*)pboard
     29        forDragOfButton:(BookmarkButton*)button {
     30 }
     31 
     32 - (void)mouseEnteredButton:(id)buton event:(NSEvent*)event {
     33   entered_++;
     34 }
     35 
     36 - (void)mouseExitedButton:(id)buton event:(NSEvent*)event {
     37   exited_++;
     38 }
     39 
     40 - (BOOL)dragShouldLockBarVisibility {
     41   return NO;
     42 }
     43 
     44 - (NSWindow*)browserWindow {
     45   return nil;
     46 }
     47 
     48 - (BOOL)canDragBookmarkButtonToTrash:(BookmarkButton*)button {
     49   return canDragToTrash_;
     50 }
     51 
     52 - (void)didDragBookmarkToTrash:(BookmarkButton*)button {
     53   didDragToTrashCount_++;
     54 }
     55 
     56 - (void)bookmarkDragDidEnd:(BookmarkButton*)button
     57                  operation:(NSDragOperation)operation {
     58 }
     59 @end
     60 
     61 namespace {
     62 
     63 class BookmarkButtonTest : public CocoaTest {
     64 };
     65 
     66 // Make sure nothing leaks
     67 TEST_F(BookmarkButtonTest, Create) {
     68   scoped_nsobject<BookmarkButton> button;
     69   button.reset([[BookmarkButton alloc] initWithFrame:NSMakeRect(0,0,500,500)]);
     70 }
     71 
     72 // Test folder and empty node queries.
     73 TEST_F(BookmarkButtonTest, FolderAndEmptyOrNot) {
     74   BrowserTestHelper helper_;
     75   scoped_nsobject<BookmarkButton> button;
     76   scoped_nsobject<BookmarkButtonCell> cell;
     77 
     78   button.reset([[BookmarkButton alloc] initWithFrame:NSMakeRect(0,0,500,500)]);
     79   cell.reset([[BookmarkButtonCell alloc] initTextCell:@"hi mom"]);
     80   [button setCell:cell];
     81 
     82   EXPECT_TRUE([button isEmpty]);
     83   EXPECT_FALSE([button isFolder]);
     84   EXPECT_FALSE([button bookmarkNode]);
     85 
     86   NSEvent* downEvent =
     87       test_event_utils::LeftMouseDownAtPoint(NSMakePoint(10,10));
     88   // Since this returns (does not actually begin a modal drag), success!
     89   [button beginDrag:downEvent];
     90 
     91   BookmarkModel* model = helper_.profile()->GetBookmarkModel();
     92   const BookmarkNode* node = model->GetBookmarkBarNode();
     93   [cell setBookmarkNode:node];
     94   EXPECT_FALSE([button isEmpty]);
     95   EXPECT_TRUE([button isFolder]);
     96   EXPECT_EQ([button bookmarkNode], node);
     97 
     98   node = model->AddURL(node, 0, ASCIIToUTF16("hi mom"),
     99                        GURL("http://www.google.com"));
    100   [cell setBookmarkNode:node];
    101   EXPECT_FALSE([button isEmpty]);
    102   EXPECT_FALSE([button isFolder]);
    103   EXPECT_EQ([button bookmarkNode], node);
    104 }
    105 
    106 TEST_F(BookmarkButtonTest, MouseEnterExitRedirect) {
    107   NSEvent* moveEvent =
    108       test_event_utils::MouseEventAtPoint(NSMakePoint(10,10), NSMouseMoved, 0);
    109   scoped_nsobject<BookmarkButton> button;
    110   scoped_nsobject<BookmarkButtonCell> cell;
    111   scoped_nsobject<FakeButtonDelegate>
    112       delegate([[FakeButtonDelegate alloc] init]);
    113   button.reset([[BookmarkButton alloc] initWithFrame:NSMakeRect(0,0,500,500)]);
    114   cell.reset([[BookmarkButtonCell alloc] initTextCell:@"hi mom"]);
    115   [button setCell:cell];
    116   [button setDelegate:delegate];
    117 
    118   EXPECT_EQ(0, delegate.get()->entered_);
    119   EXPECT_EQ(0, delegate.get()->exited_);
    120 
    121   [button mouseEntered:moveEvent];
    122   EXPECT_EQ(1, delegate.get()->entered_);
    123   EXPECT_EQ(0, delegate.get()->exited_);
    124 
    125   [button mouseExited:moveEvent];
    126   [button mouseExited:moveEvent];
    127   EXPECT_EQ(1, delegate.get()->entered_);
    128   EXPECT_EQ(2, delegate.get()->exited_);
    129 }
    130 
    131 TEST_F(BookmarkButtonTest, DragToTrash) {
    132   BrowserTestHelper helper_;
    133 
    134   scoped_nsobject<BookmarkButton> button;
    135   scoped_nsobject<BookmarkButtonCell> cell;
    136   scoped_nsobject<FakeButtonDelegate>
    137       delegate([[FakeButtonDelegate alloc] init]);
    138   button.reset([[BookmarkButton alloc] initWithFrame:NSMakeRect(0,0,500,500)]);
    139   cell.reset([[BookmarkButtonCell alloc] initTextCell:@"hi mom"]);
    140   [button setCell:cell];
    141   [button setDelegate:delegate];
    142 
    143   // Add a deletable bookmark to the button.
    144   BookmarkModel* model = helper_.profile()->GetBookmarkModel();
    145   const BookmarkNode* barNode = model->GetBookmarkBarNode();
    146   const BookmarkNode* node = model->AddURL(barNode, 0, ASCIIToUTF16("hi mom"),
    147                                            GURL("http://www.google.com"));
    148   [cell setBookmarkNode:node];
    149 
    150   // Verify that if canDragBookmarkButtonToTrash is NO then the button can't
    151   // be dragged to the trash.
    152   delegate.get()->canDragToTrash_ = NO;
    153   NSDragOperation operation = [button draggingSourceOperationMaskForLocal:NO];
    154   EXPECT_EQ(0u, operation & NSDragOperationDelete);
    155   operation = [button draggingSourceOperationMaskForLocal:YES];
    156   EXPECT_EQ(0u, operation & NSDragOperationDelete);
    157 
    158   // Verify that if canDragBookmarkButtonToTrash is YES then the button can
    159   // be dragged to the trash.
    160   delegate.get()->canDragToTrash_ = YES;
    161   operation = [button draggingSourceOperationMaskForLocal:NO];
    162   EXPECT_EQ(NSDragOperationDelete, operation & NSDragOperationDelete);
    163   operation = [button draggingSourceOperationMaskForLocal:YES];
    164   EXPECT_EQ(NSDragOperationDelete, operation & NSDragOperationDelete);
    165 
    166   // Verify that canDragBookmarkButtonToTrash is called when expected.
    167   delegate.get()->canDragToTrash_ = YES;
    168   EXPECT_EQ(0, delegate.get()->didDragToTrashCount_);
    169   [button draggedImage:nil endedAt:NSZeroPoint operation:NSDragOperationCopy];
    170   EXPECT_EQ(0, delegate.get()->didDragToTrashCount_);
    171   [button draggedImage:nil endedAt:NSZeroPoint operation:NSDragOperationMove];
    172   EXPECT_EQ(0, delegate.get()->didDragToTrashCount_);
    173   [button draggedImage:nil endedAt:NSZeroPoint operation:NSDragOperationDelete];
    174   EXPECT_EQ(1, delegate.get()->didDragToTrashCount_);
    175 }
    176 
    177 }
    178