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, &gtkrc);
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