• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <Carbon/Carbon.h>
6
7#include "base/debug/debugger.h"
8#include "base/memory/scoped_nsobject.h"
9#include "chrome/app/chrome_command_ids.h"
10#import "chrome/browser/ui/cocoa/chrome_event_processing_window.h"
11#import "chrome/browser/ui/cocoa/browser_window_controller.h"
12#import "chrome/browser/ui/cocoa/browser_frame_view.h"
13#import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
14#import "third_party/ocmock/OCMock/OCMock.h"
15
16namespace {
17
18NSEvent* KeyEvent(const NSUInteger flags, const NSUInteger keyCode) {
19  return [NSEvent keyEventWithType:NSKeyDown
20                          location:NSZeroPoint
21                     modifierFlags:flags
22                         timestamp:0.0
23                      windowNumber:0
24                           context:nil
25                        characters:@""
26       charactersIgnoringModifiers:@""
27                         isARepeat:NO
28                          keyCode:keyCode];
29}
30
31class ChromeEventProcessingWindowTest : public CocoaTest {
32 public:
33  virtual void SetUp() {
34    CocoaTest::SetUp();
35    // Create a window.
36    const NSUInteger mask = NSTitledWindowMask | NSClosableWindowMask |
37        NSMiniaturizableWindowMask | NSResizableWindowMask;
38    window_ = [[ChromeEventProcessingWindow alloc]
39               initWithContentRect:NSMakeRect(0, 0, 800, 600)
40                         styleMask:mask
41                           backing:NSBackingStoreBuffered
42                             defer:NO];
43    if (base::debug::BeingDebugged()) {
44      [window_ orderFront:nil];
45    } else {
46      [window_ orderBack:nil];
47    }
48  }
49
50  virtual void TearDown() {
51    [window_ close];
52    CocoaTest::TearDown();
53  }
54
55  ChromeEventProcessingWindow* window_;
56};
57
58id CreateBrowserWindowControllerMock() {
59  id delegate = [OCMockObject mockForClass:[BrowserWindowController class]];
60  // Make conformsToProtocol return YES for @protocol(BrowserCommandExecutor)
61  // to satisfy the DCHECK() in handleExtraKeyboardShortcut.
62  //
63  // TODO(akalin): Figure out how to replace OCMOCK_ANY below with
64  // @protocol(BrowserCommandExecutor) and have it work.
65  BOOL yes = YES;
66  [[[delegate stub] andReturnValue:OCMOCK_VALUE(yes)]
67    conformsToProtocol:OCMOCK_ANY];
68  return delegate;
69}
70
71// Verify that the window intercepts a particular key event and
72// forwards it to [delegate executeCommand:].  Assume that other
73// CommandForKeyboardShortcut() will work the same for the rest.
74TEST_F(ChromeEventProcessingWindowTest,
75       PerformKeyEquivalentForwardToExecuteCommand) {
76  NSEvent* event = KeyEvent(NSCommandKeyMask, kVK_ANSI_1);
77
78  id delegate = CreateBrowserWindowControllerMock();
79  [[delegate expect] executeCommand:IDC_SELECT_TAB_0];
80
81  [window_ setDelegate:delegate];
82  [window_ performKeyEquivalent:event];
83
84  // Don't wish to mock all the way down...
85  [window_ setDelegate:nil];
86  [delegate verify];
87}
88
89// Verify that an unhandled shortcut does not get forwarded via
90// -executeCommand:.
91// TODO(shess) Think of a way to test that it is sent to the
92// superclass.
93TEST_F(ChromeEventProcessingWindowTest, PerformKeyEquivalentNoForward) {
94  NSEvent* event = KeyEvent(0, 0);
95
96  id delegate = CreateBrowserWindowControllerMock();
97
98  [window_ setDelegate:delegate];
99  [window_ performKeyEquivalent:event];
100
101  // Don't wish to mock all the way down...
102  [window_ setDelegate:nil];
103  [delegate verify];
104}
105
106}  // namespace
107