blob: 3865b24adf42fc7acb81f7d22b84d59462ba2f6b [file] [log] [blame]
// Copyright (c) 2012 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.
#include <Carbon/Carbon.h>
#include "base/debug/debugger.h"
#include "chrome/app/chrome_command_ids.h"
#import "chrome/browser/ui/cocoa/browser_window_controller.h"
#import "chrome/browser/ui/cocoa/chrome_event_processing_window.h"
#import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
#import "third_party/ocmock/OCMock/OCMock.h"
#include "third_party/ocmock/gtest_support.h"
#import "third_party/ocmock/ocmock_extensions.h"
namespace {
NSEvent* KeyEvent(const NSUInteger flags, const NSUInteger keyCode) {
return [NSEvent keyEventWithType:NSKeyDown
location:NSZeroPoint
modifierFlags:flags
timestamp:0.0
windowNumber:0
context:nil
characters:@""
charactersIgnoringModifiers:@""
isARepeat:NO
keyCode:keyCode];
}
class ChromeEventProcessingWindowTest : public CocoaTest {
public:
virtual void SetUp() {
CocoaTest::SetUp();
// Create a window.
const NSUInteger mask = NSTitledWindowMask | NSClosableWindowMask |
NSMiniaturizableWindowMask | NSResizableWindowMask;
window_ = [[ChromeEventProcessingWindow alloc]
initWithContentRect:NSMakeRect(0, 0, 800, 600)
styleMask:mask
backing:NSBackingStoreBuffered
defer:NO];
if (base::debug::BeingDebugged()) {
[window_ orderFront:nil];
} else {
[window_ orderBack:nil];
}
}
virtual void TearDown() {
[window_ close];
CocoaTest::TearDown();
}
ChromeEventProcessingWindow* window_;
};
id CreateBrowserWindowControllerMock() {
id delegate = [OCMockObject mockForClass:[BrowserWindowController class]];
// Make conformsToProtocol return YES for @protocol(BrowserCommandExecutor)
// to satisfy the DCHECK() in handleExtraKeyboardShortcut.
[[[delegate stub] andReturnBool:YES]
conformsToProtocol:[OCMArg conformsToProtocol:
@protocol(BrowserCommandExecutor)]];
return delegate;
}
// Verify that the window intercepts a particular key event and
// forwards it to [delegate executeCommand:]. Assume that other
// CommandForKeyboardShortcut() will work the same for the rest.
TEST_F(ChromeEventProcessingWindowTest,
PerformKeyEquivalentForwardToExecuteCommand) {
NSEvent* event = KeyEvent(NSCommandKeyMask, kVK_ANSI_1);
id delegate = CreateBrowserWindowControllerMock();
[[delegate expect] executeCommand:IDC_SELECT_TAB_0];
[window_ setDelegate:delegate];
[window_ performKeyEquivalent:event];
// Don't wish to mock all the way down...
[window_ setDelegate:nil];
EXPECT_OCMOCK_VERIFY(delegate);
}
// Verify that an unhandled shortcut does not get forwarded via
// -executeCommand:.
// TODO(shess) Think of a way to test that it is sent to the
// superclass.
TEST_F(ChromeEventProcessingWindowTest, PerformKeyEquivalentNoForward) {
NSEvent* event = KeyEvent(0, 0);
id delegate = CreateBrowserWindowControllerMock();
[window_ setDelegate:delegate];
[window_ performKeyEquivalent:event];
// Don't wish to mock all the way down...
[window_ setDelegate:nil];
EXPECT_OCMOCK_VERIFY(delegate);
}
} // namespace