summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/cocoa/toolbar/toolbar_button_unittest.mm
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui/cocoa/toolbar/toolbar_button_unittest.mm')
-rw-r--r--chrome/browser/ui/cocoa/toolbar/toolbar_button_unittest.mm302
1 files changed, 302 insertions, 0 deletions
diff --git a/chrome/browser/ui/cocoa/toolbar/toolbar_button_unittest.mm b/chrome/browser/ui/cocoa/toolbar/toolbar_button_unittest.mm
new file mode 100644
index 0000000..5b1a329
--- /dev/null
+++ b/chrome/browser/ui/cocoa/toolbar/toolbar_button_unittest.mm
@@ -0,0 +1,302 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import <Cocoa/Cocoa.h>
+
+#import "base/scoped_nsobject.h"
+#include "chrome/app/chrome_command_ids.h"
+#import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
+#import "chrome/browser/ui/cocoa/test_event_utils.h"
+#import "chrome/browser/ui/cocoa/toolbar/toolbar_button.h"
+#import "testing/gtest_mac.h"
+
+@interface TestableToolbarButton : ToolbarButton {
+ @private
+ NSInteger numOfClick_;
+ NSInteger lastCommand_;
+}
+
+@property(assign, nonatomic) NSInteger numOfClick;
+@property(assign, nonatomic) NSInteger lastCommand;
+
+- (id)initWithFrame:(NSRect)frame;
+- (void)doAction:(id)sender;
+@end
+
+@implementation TestableToolbarButton
+
+@synthesize numOfClick = numOfClick_;
+@synthesize lastCommand = lastCommand_;
+
+- (id)initWithFrame:(NSRect)frame {
+ if ((self = [super initWithFrame:frame])) {
+ lastCommand_ = IDC_STOP;
+ }
+ return self;
+}
+
+- (void)doAction:(id)sender {
+ lastCommand_ = [sender tag];
+ if (lastCommand_ == [self tag])
+ ++numOfClick_;
+}
+
+- (BOOL)shouldHandleEvent:(NSEvent*)theEvent {
+ return handleMiddleClick_;
+}
+
+@end
+
+namespace {
+
+class ToolbarButtonTest : public CocoaTest {
+ public:
+ ToolbarButtonTest() {
+ NSRect frame = NSMakeRect(0, 0, 20, 20);
+ scoped_nsobject<TestableToolbarButton> button(
+ [[TestableToolbarButton alloc] initWithFrame:frame]);
+ button_ = button.get();
+
+ [button_ setTag:IDC_HOME];
+ [button_ setTarget:button_];
+ [button_ setAction:@selector(doAction:)];
+ [[test_window() contentView] addSubview:button_];
+
+ NSRect bounds = [button_ bounds];
+ NSPoint mid_point = NSMakePoint(NSMidX(bounds), NSMidY(bounds));
+ NSPoint out_point = NSMakePoint(bounds.origin.x - 10,
+ bounds.origin.y - 10);
+ left_down_in_view =
+ test_event_utils::MouseEventAtPoint(mid_point, NSLeftMouseDown, 0);
+ left_up_in_view =
+ test_event_utils::MouseEventAtPoint(mid_point, NSLeftMouseUp, 0);
+ right_down_in_view =
+ test_event_utils::MouseEventAtPoint(mid_point, NSRightMouseDown, 0);
+ right_up_in_view =
+ test_event_utils::MouseEventAtPoint(mid_point, NSRightMouseUp, 0);
+ other_down_in_view =
+ test_event_utils::MouseEventAtPoint(mid_point, NSOtherMouseDown, 0);
+ other_dragged_in_view =
+ test_event_utils::MouseEventAtPoint(mid_point, NSOtherMouseDragged, 0);
+ other_up_in_view =
+ test_event_utils::MouseEventAtPoint(mid_point, NSOtherMouseUp, 0);
+ other_down_out_view =
+ test_event_utils::MouseEventAtPoint(out_point, NSOtherMouseDown, 0);
+ other_dragged_out_view =
+ test_event_utils::MouseEventAtPoint(out_point, NSOtherMouseDragged, 0);
+ other_up_out_view =
+ test_event_utils::MouseEventAtPoint(out_point, NSOtherMouseUp, 0);
+ }
+
+ TestableToolbarButton* button_;
+ NSEvent* left_down_in_view;
+ NSEvent* left_up_in_view;
+ NSEvent* right_down_in_view;
+ NSEvent* right_up_in_view;
+ NSEvent* other_down_in_view;
+ NSEvent* other_dragged_in_view;
+ NSEvent* other_up_in_view;
+ NSEvent* other_down_out_view;
+ NSEvent* other_dragged_out_view;
+ NSEvent* other_up_out_view;
+};
+
+TEST_VIEW(ToolbarButtonTest, button_)
+
+TEST_F(ToolbarButtonTest, DoesNotSwallowClicksOnNO) {
+ // Middle button being down doesn't swallow right button clicks. But
+ // ToolbarButton doesn't handle right button events.
+ [button_ otherMouseDown:other_down_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ [button_ rightMouseDown:right_down_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ [button_ rightMouseUp:right_up_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ EXPECT_EQ(0, [button_ numOfClick]);
+ EXPECT_EQ(IDC_STOP, [button_ lastCommand]);
+ [button_ otherMouseUp:other_up_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ EXPECT_EQ(0, [button_ numOfClick]);
+ EXPECT_EQ(IDC_STOP, [button_ lastCommand]);
+
+ // Middle button being down doesn't swallows left button clicks.
+ [button_ otherMouseDown:other_down_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ [NSApp postEvent:left_up_in_view atStart:YES];
+ [button_ mouseDown:left_down_in_view];
+ EXPECT_EQ(1, [button_ numOfClick]);
+ EXPECT_EQ(IDC_HOME, [button_ lastCommand]);
+ [button_ otherMouseUp:other_up_in_view];
+ EXPECT_EQ(1, [button_ numOfClick]);
+ EXPECT_EQ(IDC_HOME, [button_ lastCommand]);
+}
+
+TEST_F(ToolbarButtonTest, WithoutMouseDownOnNO) {
+ // Middle button mouse up without leading mouse down in the view.
+ [button_ otherMouseUp:other_up_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ EXPECT_EQ(0, [button_ numOfClick]);
+ EXPECT_EQ(IDC_STOP, [button_ lastCommand]);
+
+ // Middle button mouse dragged in the view and up without leading mouse down.
+ [button_ otherMouseDragged:other_dragged_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ [button_ otherMouseUp:other_up_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ EXPECT_EQ(0, [button_ numOfClick]);
+ EXPECT_EQ(IDC_STOP, [button_ lastCommand]);
+}
+
+TEST_F(ToolbarButtonTest, MouseClickOnNO) {
+ // Middle button clicking in the view.
+ [button_ otherMouseDown:other_down_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ [button_ otherMouseUp:other_up_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ EXPECT_EQ(0, [button_ numOfClick]);
+ EXPECT_EQ(IDC_STOP, [button_ lastCommand]);
+
+ // Middle button clicking outside of the view.
+ [button_ otherMouseDown:other_down_out_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ [button_ otherMouseUp:other_up_out_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ EXPECT_EQ(0, [button_ numOfClick]);
+ EXPECT_EQ(IDC_STOP, [button_ lastCommand]);
+}
+
+TEST_F(ToolbarButtonTest, MouseDraggingOnNO) {
+ // Middle button being down in the view and up outside of the view.
+ [button_ otherMouseDown:other_down_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ [button_ otherMouseDragged:other_dragged_out_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ [button_ otherMouseUp:other_up_out_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ EXPECT_EQ(0, [button_ numOfClick]);
+ EXPECT_EQ(IDC_STOP, [button_ lastCommand]);
+
+ // Middle button being down on the button, move to outside and move on it
+ // again, then up on the button.
+ [button_ otherMouseDown:other_down_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ [button_ otherMouseDragged:other_dragged_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ [button_ otherMouseUp:other_up_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ EXPECT_EQ(0, [button_ numOfClick]);
+ EXPECT_EQ(IDC_STOP, [button_ lastCommand]);
+}
+
+TEST_F(ToolbarButtonTest, WithoutMouseDownOnYES) {
+ // Enable middle button handling.
+ [button_ setHandleMiddleClick:YES];
+
+ // Middle button mouse up without leading mouse down in the view.
+ [button_ otherMouseUp:other_up_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ EXPECT_EQ(0, [button_ numOfClick]);
+ EXPECT_EQ(IDC_STOP, [button_ lastCommand]);
+
+ // Middle button mouse dragged in the view and up without leading mouse down.
+ [button_ otherMouseDragged:other_dragged_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ [button_ otherMouseUp:other_up_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ EXPECT_EQ(0, [button_ numOfClick]);
+ EXPECT_EQ(IDC_STOP, [button_ lastCommand]);
+}
+
+TEST_F(ToolbarButtonTest, MouseClickInsideOnYES) {
+ // Enable middle button handling.
+ [button_ setHandleMiddleClick:YES];
+
+ // Middle button clicking in the view.
+ [button_ otherMouseDown:other_down_in_view];
+ EXPECT_EQ(NSOnState, [button_ state]);
+ [button_ otherMouseUp:other_up_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ EXPECT_EQ(1, [button_ numOfClick]);
+ EXPECT_EQ(IDC_HOME, [button_ lastCommand]);
+}
+
+TEST_F(ToolbarButtonTest, MouseClickOutsideOnYES) {
+ // Enable middle button handling.
+ [button_ setHandleMiddleClick:YES];
+
+ // Middle button clicking outside of the view.
+ [button_ otherMouseDown:other_down_out_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ [button_ otherMouseUp:other_up_out_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ EXPECT_EQ(0, [button_ numOfClick]);
+ EXPECT_EQ(IDC_STOP, [button_ lastCommand]);
+}
+
+TEST_F(ToolbarButtonTest, MouseDraggingOnYES) {
+ // Enable middle button handling.
+ [button_ setHandleMiddleClick:YES];
+
+ // Middle button being down in the view and up outside of the view.
+ [button_ otherMouseDown:other_down_in_view];
+ EXPECT_EQ(NSOnState, [button_ state]);
+ [button_ otherMouseDragged:other_dragged_out_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ [button_ otherMouseUp:other_up_out_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ EXPECT_EQ(0, [button_ numOfClick]);
+ EXPECT_EQ(IDC_STOP, [button_ lastCommand]);
+
+ // Middle button being down on the button, move to outside and move on it
+ // again, then up on the button.
+ [button_ otherMouseDown:other_down_in_view];
+ EXPECT_EQ(NSOnState, [button_ state]);
+ [button_ otherMouseDragged:other_dragged_out_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ [button_ otherMouseDragged:other_dragged_in_view];
+ EXPECT_EQ(NSOnState, [button_ state]);
+ [button_ otherMouseUp:other_up_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ EXPECT_EQ(1, [button_ numOfClick]);
+ EXPECT_EQ(IDC_HOME, [button_ lastCommand]);
+}
+
+TEST_F(ToolbarButtonTest, DoesNotSwallowRightClickOnYES) {
+ // Enable middle button handling.
+ [button_ setHandleMiddleClick:YES];
+
+ // Middle button being down should swallow right button clicks, but
+ // ToolbarButton doesn't swallow it because it doesn't handle right button
+ // events.
+ [button_ otherMouseDown:other_down_in_view];
+ EXPECT_EQ(NSOnState, [button_ state]);
+ [button_ rightMouseDown:right_down_in_view];
+ EXPECT_EQ(NSOnState, [button_ state]);
+ [button_ rightMouseUp:right_up_in_view];
+ EXPECT_EQ(NSOnState, [button_ state]);
+ EXPECT_EQ(0, [button_ numOfClick]);
+ EXPECT_EQ(IDC_STOP, [button_ lastCommand]);
+ [button_ otherMouseUp:other_up_in_view];
+ EXPECT_EQ(NSOffState, [button_ state]);
+ EXPECT_EQ(1, [button_ numOfClick]);
+ EXPECT_EQ(IDC_HOME, [button_ lastCommand]);
+}
+
+TEST_F(ToolbarButtonTest, DoesSwallowLeftClickOnYES) {
+ // Enable middle button handling.
+ [button_ setHandleMiddleClick:YES];
+
+ // Middle button being down swallows left button clicks.
+ [button_ otherMouseDown:other_down_in_view];
+ EXPECT_EQ(NSOnState, [button_ state]);
+ [NSApp postEvent:left_up_in_view atStart:YES];
+ [button_ mouseDown:left_down_in_view];
+ EXPECT_EQ(0, [button_ numOfClick]);
+ EXPECT_EQ(IDC_STOP, [button_ lastCommand]);
+ [button_ otherMouseUp:other_up_in_view];
+ EXPECT_EQ(1, [button_ numOfClick]);
+ EXPECT_EQ(IDC_HOME, [button_ lastCommand]);
+}
+
+} // namespace