1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2009 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/renderer_host/gtk_key_bindings_handler.h" 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gdk/gdkkeysyms.h> 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <utility> 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector> 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h" 1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/logging.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/path_service.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h" 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/edit_command.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/native_web_keyboard_event.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GtkKeyBindingsHandlerTest : public testing::Test { 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct EditCommand { 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* name; 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* value; 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkKeyBindingsHandlerTest() 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : window_(gtk_window_new(GTK_WINDOW_TOPLEVEL)), 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch handler_(NULL) { 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath gtkrc; 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PathService::Get(chrome::DIR_TEST_DATA, >krc); 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtkrc = gtkrc.AppendASCII("gtk_key_bindings_test_gtkrc"); 3421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_rc_parse(gtkrc.value().c_str()); 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkWidget* fixed = gtk_fixed_new(); 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch handler_ = new GtkKeyBindingsHandler(fixed); 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_container_add(GTK_CONTAINER(window_), fixed); 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_widget_show(fixed); 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_widget_show(window_); 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ~GtkKeyBindingsHandlerTest() { 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_widget_destroy(window_); 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete handler_; 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NativeWebKeyboardEvent NewNativeWebKeyboardEvent(guint keyval, guint state) { 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkKeymap* keymap = 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gdk_keymap_get_for_display(gtk_widget_get_display(window_)); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkKeymapKey *keys = NULL; 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gint n_keys = 0; 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (gdk_keymap_get_entries_for_keyval(keymap, keyval, &keys, &n_keys)) { 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkEventKey event; 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch event.type = GDK_KEY_PRESS; 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch event.window = NULL; 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch event.send_event = 0; 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch event.time = 0; 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch event.state = state; 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch event.keyval = keyval; 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch event.length = 0; 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch event.string = NULL; 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch event.hardware_keycode = keys[0].keycode; 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch event.group = keys[0].group; 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch event.is_modifier = 0; 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_free(keys); 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return NativeWebKeyboardEvent(&event); 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen LOG(ERROR) << "Failed to create key event for keyval:" << keyval; 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return NativeWebKeyboardEvent(); 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void TestKeyBinding(const NativeWebKeyboardEvent& event, 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const EditCommand expected_result[], 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t size) { 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EditCommands result; 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(handler_->Match(event, &result)); 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(size, result.size()); 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < size; ++i) { 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_STREQ(expected_result[i].name, result[i].name.c_str()); 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_STREQ(expected_result[i].value, result[i].value.c_str()); 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkWidget* window_; 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkKeyBindingsHandler* handler_; 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(GtkKeyBindingsHandlerTest, MoveCursor) { 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const EditCommand kEditCommands[] = { 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "move-cursor" (logical-positions, -2, 0) 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveBackward", "" }, 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveBackward", "" }, 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "move-cursor" (logical-positions, 2, 0) 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveForward", "" }, 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveForward", "" }, 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "move-cursor" (visual-positions, -1, 1) 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveLeftAndModifySelection", "" }, 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "move-cursor" (visual-positions, 1, 1) 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveRightAndModifySelection", "" }, 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "move-cursor" (words, -1, 0) 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveWordBackward", "" }, 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "move-cursor" (words, 1, 0) 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveWordForward", "" }, 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "move-cursor" (display-lines, -1, 0) 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveUp", "" }, 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "move-cursor" (display-lines, 1, 0) 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveDown", "" }, 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "move-cursor" (display-line-ends, -1, 0) 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveToBeginningOfLine", "" }, 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "move-cursor" (display-line-ends, 1, 0) 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveToEndOfLine", "" }, 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "move-cursor" (paragraph-ends, -1, 0) 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveToBeginningOfParagraph", "" }, 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "move-cursor" (paragraph-ends, 1, 0) 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveToEndOfParagraph", "" }, 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "move-cursor" (pages, -1, 0) 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MovePageUp", "" }, 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "move-cursor" (pages, 1, 0) 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MovePageDown", "" }, 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "move-cursor" (buffer-ends, -1, 0) 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveToBeginningOfDocument", "" }, 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "move-cursor" (buffer-ends, 1, 0) 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveToEndOfDocument", "" } 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestKeyBinding(NewNativeWebKeyboardEvent(GDK_1, GDK_CONTROL_MASK), 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kEditCommands, arraysize(kEditCommands)); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 13321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(GtkKeyBindingsHandlerTest, DeleteFromCursor) { 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const EditCommand kEditCommands[] = { 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "delete-from-cursor" (chars, -2) 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "DeleteBackward", "" }, 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "DeleteBackward", "" }, 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "delete-from-cursor" (chars, 2) 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "DeleteForward", "" }, 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "DeleteForward", "" }, 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "delete-from-cursor" (word-ends, -1) 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "DeleteWordBackward", "" }, 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "delete-from-cursor" (word-ends, 1) 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "DeleteWordForward", "" }, 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "delete-from-cursor" (words, -1) 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveWordBackward", "" }, 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "DeleteWordForward", "" }, 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "delete-from-cursor" (words, 1) 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveWordForward", "" }, 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "DeleteWordBackward", "" }, 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "delete-from-cursor" (display-lines, -1) 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveToBeginningOfLine", "" }, 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "DeleteToEndOfLine", "" }, 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "delete-from-cursor" (display-lines, 1) 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveToBeginningOfLine", "" }, 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "DeleteToEndOfLine", "" }, 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "delete-from-cursor" (display-line-ends, -1) 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "DeleteToBeginningOfLine", "" }, 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "delete-from-cursor" (display-line-ends, 1) 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "DeleteToEndOfLine", "" }, 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "delete-from-cursor" (paragraph-ends, -1) 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "DeleteToBeginningOfParagraph", "" }, 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "delete-from-cursor" (paragraph-ends, 1) 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "DeleteToEndOfParagraph", "" }, 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "delete-from-cursor" (paragraphs, -1) 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveToBeginningOfParagraph", "" }, 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "DeleteToEndOfParagraph", "" }, 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "delete-from-cursor" (paragraphs, 1) 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "MoveToBeginningOfParagraph", "" }, 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "DeleteToEndOfParagraph", "" }, 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestKeyBinding(NewNativeWebKeyboardEvent(GDK_2, GDK_CONTROL_MASK), 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kEditCommands, arraysize(kEditCommands)); 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(GtkKeyBindingsHandlerTest, OtherActions) { 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const EditCommand kBackspace[] = { 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "DeleteBackward", "" } 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestKeyBinding(NewNativeWebKeyboardEvent(GDK_3, GDK_CONTROL_MASK), 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kBackspace, arraysize(kBackspace)); 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const EditCommand kCopyClipboard[] = { 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "Copy", "" } 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestKeyBinding(NewNativeWebKeyboardEvent(GDK_4, GDK_CONTROL_MASK), 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kCopyClipboard, arraysize(kCopyClipboard)); 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const EditCommand kCutClipboard[] = { 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "Cut", "" } 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestKeyBinding(NewNativeWebKeyboardEvent(GDK_5, GDK_CONTROL_MASK), 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kCutClipboard, arraysize(kCutClipboard)); 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const EditCommand kInsertAtCursor[] = { 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "InsertText", "hello" } 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestKeyBinding(NewNativeWebKeyboardEvent(GDK_6, GDK_CONTROL_MASK), 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kInsertAtCursor, arraysize(kInsertAtCursor)); 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const EditCommand kPasteClipboard[] = { 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "Paste", "" } 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestKeyBinding(NewNativeWebKeyboardEvent(GDK_7, GDK_CONTROL_MASK), 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kPasteClipboard, arraysize(kPasteClipboard)); 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const EditCommand kSelectAll[] = { 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "Unselect", "" }, 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "SelectAll", "" } 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestKeyBinding(NewNativeWebKeyboardEvent(GDK_8, GDK_CONTROL_MASK), 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kSelectAll, arraysize(kSelectAll)); 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const EditCommand kSetAnchor[] = { 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { "SetMark", "" } 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestKeyBinding(NewNativeWebKeyboardEvent(GDK_9, GDK_CONTROL_MASK), 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kSetAnchor, arraysize(kSetAnchor)); 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 221