1 // Copyright 2018 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 "ash/shortcut_viewer/keyboard_shortcut_viewer_metadata.h"
6
7 #include "ash/shortcut_viewer/keyboard_shortcut_item.h"
8 #include "ash/shortcut_viewer/strings/grit/shortcut_viewer_strings.h"
9 #include "ash/shortcut_viewer/vector_icons/vector_icons.h"
10 #include "base/check.h"
11 #include "base/macros.h"
12 #include "base/no_destructor.h"
13 #include "base/notreached.h"
14 #include "base/strings/utf_string_conversions.h"
15 #include "ui/base/l10n/l10n_util.h"
16 #include "ui/chromeos/events/keyboard_layout_util.h"
17 #include "ui/events/devices/device_data_manager.h"
18 #include "ui/events/event_constants.h"
19 #include "ui/events/keycodes/dom/dom_code.h"
20 #include "ui/events/keycodes/dom/dom_codes.h"
21 #include "ui/events/keycodes/dom/dom_key.h"
22 #include "ui/events/keycodes/dom/keycode_converter.h"
23 #include "ui/events/keycodes/keyboard_code_conversion.h"
24 #include "ui/events/ozone/layout/keyboard_layout_engine.h"
25 #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
26 #include "ui/gfx/vector_icon_types.h"
27
28 namespace keyboard_shortcut_viewer {
29
30 namespace {
31
32 // Gets the keyboard codes for modifiers.
GetKeyCodeForModifier(ui::EventFlags modifier)33 ui::KeyboardCode GetKeyCodeForModifier(ui::EventFlags modifier) {
34 switch (modifier) {
35 case ui::EF_CONTROL_DOWN:
36 return ui::VKEY_CONTROL;
37 case ui::EF_ALT_DOWN:
38 return ui::VKEY_LMENU;
39 case ui::EF_SHIFT_DOWN:
40 return ui::VKEY_SHIFT;
41 case ui::EF_COMMAND_DOWN:
42 return ui::VKEY_COMMAND;
43 default:
44 NOTREACHED();
45 return ui::VKEY_UNKNOWN;
46 }
47 }
48
49 // Provides I18n string for key codes which have no mapping to a meaningful
50 // description or they require a special one we explicitly specify. For example,
51 // ui::VKEY_COMMAND could return a string "Meta", but we want to display it as
52 // "Search" or "Launcher".
GetSpecialStringForKeyboardCode(ui::KeyboardCode key_code)53 base::Optional<base::string16> GetSpecialStringForKeyboardCode(
54 ui::KeyboardCode key_code) {
55 int msg_id = 0;
56 switch (key_code) {
57 case ui::VKEY_CONTROL:
58 msg_id = IDS_KSV_MODIFIER_CONTROL;
59 break;
60 case ui::VKEY_LMENU:
61 msg_id = IDS_KSV_MODIFIER_ALT;
62 break;
63 case ui::VKEY_SHIFT:
64 msg_id = IDS_KSV_MODIFIER_SHIFT;
65 break;
66 case ui::VKEY_COMMAND:
67 // DeviceUsesKeyboardLayout2() relies on DeviceDataManager.
68 DCHECK(ui::DeviceDataManager::HasInstance());
69 DCHECK(ui::DeviceDataManager::GetInstance()->AreDeviceListsComplete());
70 msg_id = ui::DeviceUsesKeyboardLayout2() ? IDS_KSV_MODIFIER_LAUNCHER
71 : IDS_KSV_MODIFIER_SEARCH;
72 break;
73 case ui::VKEY_ESCAPE:
74 msg_id = IDS_KSV_KEY_ESCAPE;
75 break;
76 case ui::VKEY_SPACE:
77 msg_id = IDS_KSV_KEY_SPACE;
78 break;
79 case ui::VKEY_MEDIA_LAUNCH_APP1:
80 msg_id = IDS_KSV_KEY_OVERVIEW;
81 break;
82 case ui::VKEY_MEDIA_LAUNCH_APP2:
83 msg_id = IDS_KSV_KEY_FULLSCREEN;
84 break;
85 case ui::VKEY_UNKNOWN:
86 // TODO(wutao): make this reliable.
87 // If this is VKEY_UNKNOWN, it indicates to insert a "+" separator. Use
88 // one plus and one space to replace the string resourece's placeholder so
89 // that the separator will not conflict with the replacement string for
90 // "VKEY_OEM_PLUS", which is "+" and "VKEY_SPACE", which is "Space".
91 return base::ASCIIToUTF16("+ ");
92 default:
93 return base::nullopt;
94 }
95 return l10n_util::GetStringUTF16(msg_id);
96 }
97
98 } // namespace
99
GetStringForCategory(ShortcutCategory category)100 base::string16 GetStringForCategory(ShortcutCategory category) {
101 int msg_id = 0;
102 switch (category) {
103 case ShortcutCategory::kPopular:
104 msg_id = IDS_KSV_CATEGORY_POPULAR;
105 break;
106 case ShortcutCategory::kTabAndWindow:
107 msg_id = IDS_KSV_CATEGORY_TAB_WINDOW;
108 break;
109 case ShortcutCategory::kPageAndBrowser:
110 msg_id = IDS_KSV_CATEGORY_PAGE_BROWSER;
111 break;
112 case ShortcutCategory::kSystemAndDisplay:
113 msg_id = IDS_KSV_CATEGORY_SYSTEM_DISPLAY;
114 break;
115 case ShortcutCategory::kTextEditing:
116 msg_id = IDS_KSV_CATEGORY_TEXT_EDITING;
117 break;
118 case ShortcutCategory::kAccessibility:
119 msg_id = IDS_KSV_CATEGORY_ACCESSIBILITY;
120 break;
121 default:
122 NOTREACHED();
123 return base::string16();
124 }
125 return l10n_util::GetStringUTF16(msg_id);
126 }
127
GetStringForKeyboardCode(ui::KeyboardCode key_code)128 base::string16 GetStringForKeyboardCode(ui::KeyboardCode key_code) {
129 const base::Optional<base::string16> key_label =
130 GetSpecialStringForKeyboardCode(key_code);
131 if (key_label)
132 return key_label.value();
133
134 ui::DomKey dom_key;
135 ui::KeyboardCode key_code_to_compare = ui::VKEY_UNKNOWN;
136 for (const auto& dom_code : ui::dom_codes) {
137 if (!ui::KeyboardLayoutEngineManager::GetKeyboardLayoutEngine()->Lookup(
138 dom_code, /*flags=*/ui::EF_NONE, &dom_key, &key_code_to_compare)) {
139 continue;
140 }
141 if (key_code_to_compare != key_code || !dom_key.IsValid() ||
142 dom_key.IsDeadKey()) {
143 continue;
144 }
145 return base::UTF8ToUTF16(ui::KeycodeConverter::DomKeyToKeyString(dom_key));
146 }
147 return base::string16();
148 }
149
GetAccessibleNameForKeyboardCode(ui::KeyboardCode key_code)150 base::string16 GetAccessibleNameForKeyboardCode(ui::KeyboardCode key_code) {
151 int msg_id = 0;
152 switch (key_code) {
153 case ui::VKEY_OEM_PERIOD:
154 msg_id = IDS_KSV_KEY_PERIOD_ACCESSIBILITY_NAME;
155 break;
156 case ui::VKEY_OEM_COMMA:
157 msg_id = IDS_KSV_KEY_COMMA_ACCESSIBILITY_NAME;
158 break;
159 case ui::VKEY_OEM_MINUS:
160 msg_id = IDS_KSV_KEY_HYPHEN_ACCESSIBILITY_NAME;
161 break;
162 case ui::VKEY_OEM_4:
163 msg_id = IDS_KSV_KEY_BRACKET_LEFT_ACCESSIBILITY_NAME;
164 break;
165 case ui::VKEY_OEM_6:
166 msg_id = IDS_KSV_KEY_BRACKET_RIGHT_ACCESSIBILITY_NAME;
167 break;
168 default:
169 break;
170 }
171 return msg_id ? l10n_util::GetStringUTF16(msg_id) : base::string16();
172 }
173
GetVectorIconForKeyboardCode(ui::KeyboardCode key_code)174 const gfx::VectorIcon* GetVectorIconForKeyboardCode(ui::KeyboardCode key_code) {
175 switch (key_code) {
176 case ui::VKEY_BROWSER_BACK:
177 return &kKsvBrowserBackIcon;
178 case ui::VKEY_BROWSER_FORWARD:
179 return &kKsvBrowserForwardIcon;
180 case ui::VKEY_BROWSER_REFRESH:
181 return &kKsvReloadIcon;
182 case ui::VKEY_MEDIA_LAUNCH_APP2:
183 return &kKsvFullscreenIcon;
184 case ui::VKEY_MEDIA_LAUNCH_APP1:
185 return &kKsvOverviewIcon;
186 case ui::VKEY_BRIGHTNESS_DOWN:
187 return &kKsvBrightnessDownIcon;
188 case ui::VKEY_BRIGHTNESS_UP:
189 return &kKsvBrightnessUpIcon;
190 case ui::VKEY_VOLUME_MUTE:
191 return &kKsvMuteIcon;
192 case ui::VKEY_VOLUME_DOWN:
193 return &kKsvVolumeDownIcon;
194 case ui::VKEY_VOLUME_UP:
195 return &kKsvVolumeUpIcon;
196 case ui::VKEY_UP:
197 return &kKsvArrowUpIcon;
198 case ui::VKEY_DOWN:
199 return &kKsvArrowDownIcon;
200 case ui::VKEY_LEFT:
201 return &kKsvArrowLeftIcon;
202 case ui::VKEY_RIGHT:
203 return &kKsvArrowRightIcon;
204 case ui::VKEY_PRIVACY_SCREEN_TOGGLE:
205 return &kKsvPrivacyScreenToggleIcon;
206 default:
207 return nullptr;
208 }
209 }
210
GetKeyboardShortcutItemList()211 const std::vector<KeyboardShortcutItem>& GetKeyboardShortcutItemList() {
212 static base::NoDestructor<std::vector<KeyboardShortcutItem>> item_list({
213 {// |categories|
214 {ShortcutCategory::kAccessibility},
215 IDS_KSV_DESCRIPTION_TOGGLE_DOCKED_MAGNIFIER,
216 {},
217 // |accelerator_ids|
218 {{ui::VKEY_D, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN}}},
219
220 {// |categories|
221 {ShortcutCategory::kAccessibility},
222 IDS_KSV_DESCRIPTION_TOGGLE_FULLSCREEN_MAGNIFIER,
223 {},
224 // |accelerator_ids|
225 {{ui::VKEY_M, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN}}},
226
227 {// |categories|
228 {ShortcutCategory::kPopular},
229 IDS_KSV_DESCRIPTION_LOCK_SCREEN,
230 {},
231 // |accelerator_ids|
232 {{ui::VKEY_L, ui::EF_COMMAND_DOWN}}},
233
234 {// |categories|
235 {ShortcutCategory::kSystemAndDisplay},
236 IDS_KSV_DESCRIPTION_DISPLAY_ZOOM_OUT,
237 {},
238 // |accelerator_ids|
239 {{ui::VKEY_OEM_MINUS, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN}}},
240
241 {// |categories|
242 {ShortcutCategory::kSystemAndDisplay},
243 IDS_KSV_DESCRIPTION_DISPLAY_ZOOM_IN,
244 {},
245 // |accelerator_ids|
246 {{ui::VKEY_OEM_PLUS, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN}}},
247
248 {// |categories|
249 {ShortcutCategory::kTabAndWindow},
250 IDS_KSV_DESCRIPTION_DRAG_LINK_IN_SAME_TAB,
251 IDS_KSV_SHORTCUT_DRAG_LINK_IN_SAME_TAB},
252
253 {// |categories|
254 {ShortcutCategory::kTabAndWindow},
255 IDS_KSV_DESCRIPTION_DRAG_LINK_IN_NEW_TAB,
256 IDS_KSV_SHORTCUT_DRAG_LINK_IN_NEW_TAB},
257
258 {// |categories|
259 {ShortcutCategory::kAccessibility},
260 IDS_KSV_DESCRIPTION_HIGHLIGHT_NEXT_ITEM_ON_SHELF,
261 IDS_KSV_SHORTCUT_HIGHLIGHT_NEXT_ITEM_ON_SHELF,
262 // |accelerator_ids|
263 {},
264 // |shortcut_key_codes|
265 {ui::VKEY_SHIFT, ui::VKEY_UNKNOWN, ui::VKEY_LMENU, ui::VKEY_UNKNOWN,
266 ui::VKEY_L, ui::VKEY_TAB, ui::VKEY_RIGHT}},
267
268 {// |categories|
269 {ShortcutCategory::kPopular, ShortcutCategory::kTabAndWindow},
270 IDS_KSV_DESCRIPTION_CYCLE_BACKWARD_MRU,
271 IDS_KSV_SHORTCUT_CYCLE_BACKWARD_MRU,
272 // |accelerator_ids|
273 {},
274 // |shortcut_key_codes|
275 {ui::VKEY_LMENU, ui::VKEY_UNKNOWN, ui::VKEY_SHIFT, ui::VKEY_TAB}},
276
277 {// |categories|
278 {ShortcutCategory::kPopular, ShortcutCategory::kTabAndWindow},
279 IDS_KSV_DESCRIPTION_CYCLE_FORWARD_MRU,
280 IDS_KSV_SHORTCUT_CYCLE_FORWARD_MRU,
281 // |accelerator_ids|
282 {},
283 // |shortcut_key_codes|
284 {ui::VKEY_LMENU, ui::VKEY_TAB}},
285
286 {// |categories|
287 {ShortcutCategory::kAccessibility},
288 IDS_KSV_DESCRIPTION_FOCUS_SHELF,
289 {},
290 // |accelerator_ids|
291 {{ui::VKEY_L, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}},
292
293 {// |categories|
294 {ShortcutCategory::kPageAndBrowser},
295 IDS_KSV_DESCRIPTION_IDC_BOOKMARK_ALL_TABS,
296 {},
297 // |accelerator_ids|
298 {{ui::VKEY_D, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN}}},
299
300 {// |categories|
301 {ShortcutCategory::kPageAndBrowser},
302 IDS_KSV_DESCRIPTION_IDC_BOOKMARK_THIS_TAB,
303 {},
304 // |accelerator_ids|
305 {{ui::VKEY_D, ui::EF_CONTROL_DOWN}}},
306
307 {// |categories|
308 {ShortcutCategory::kTabAndWindow},
309 IDS_KSV_DESCRIPTION_IDC_CLOSE_TAB,
310 {},
311 // |accelerator_ids|
312 {{ui::VKEY_W, ui::EF_CONTROL_DOWN}}},
313
314 {// |categories|
315 {ShortcutCategory::kTabAndWindow},
316 IDS_KSV_DESCRIPTION_IDC_CLOSE_WINDOW,
317 {},
318 // |accelerator_ids|
319 {{ui::VKEY_W, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN}}},
320
321 {// |categories|
322 {ShortcutCategory::kTextEditing},
323 IDS_KSV_DESCRIPTION_IDC_CONTENT_CONTEXT_SELECTALL,
324 {},
325 // |accelerator_ids|
326 {},
327 // |shortcut_key_codes|
328 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_A}},
329
330 {// |categories|
331 {ShortcutCategory::kPageAndBrowser},
332 IDS_KSV_DESCRIPTION_IDC_DEV_TOOLS,
333 {},
334 // |accelerator_ids|
335 {{ui::VKEY_I, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN}}},
336
337 {// |categories|
338 {ShortcutCategory::kPageAndBrowser},
339 IDS_KSV_DESCRIPTION_IDC_DEV_TOOLS_CONSOLE,
340 {},
341 // |accelerator_ids|
342 {{ui::VKEY_J, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN}}},
343
344 {// |categories|
345 {ShortcutCategory::kPageAndBrowser},
346 IDS_KSV_DESCRIPTION_IDC_FIND,
347 {},
348 // |accelerator_ids|
349 {{ui::VKEY_F, ui::EF_CONTROL_DOWN}}},
350
351 {// |categories|
352 {ShortcutCategory::kPageAndBrowser},
353 IDS_KSV_DESCRIPTION_IDC_FIND_NEXT,
354 IDS_KSV_SHORTCUT_IDC_FIND_NEXT,
355 // |accelerator_ids|
356 {},
357 // |shortcut_key_codes|
358 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_G, ui::VKEY_RETURN}},
359
360 {// |categories|
361 {ShortcutCategory::kPageAndBrowser},
362 IDS_KSV_DESCRIPTION_IDC_FIND_PREVIOUS,
363 IDS_KSV_SHORTCUT_IDC_FIND_PREVIOUS,
364 // |accelerator_ids|
365 {},
366 // |shortcut_key_codes|
367 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_SHIFT, ui::VKEY_UNKNOWN,
368 ui::VKEY_G, ui::VKEY_SHIFT, ui::VKEY_UNKNOWN, ui::VKEY_RETURN}},
369
370 {// |categories|
371 {ShortcutCategory::kPageAndBrowser, ShortcutCategory::kAccessibility},
372 IDS_KSV_DESCRIPTION_IDC_FOCUS_BOOKMARKS,
373 {},
374 // |accelerator_ids|
375 {{ui::VKEY_B, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}},
376
377 {// |categories|
378 {ShortcutCategory::kPopular, ShortcutCategory::kTextEditing},
379 IDS_KSV_DESCRIPTION_IDC_FOCUS_LOCATION,
380 IDS_KSV_SHORTCUT_IDC_FOCUS_LOCATION,
381 // |accelerator_ids|
382 {},
383 // |shortcut_key_codes|
384 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_L, ui::VKEY_LMENU,
385 ui::VKEY_UNKNOWN, ui::VKEY_D}},
386
387 {// |categories|
388 {ShortcutCategory::kPopular, ShortcutCategory::kPageAndBrowser},
389 IDS_KSV_DESCRIPTION_IDC_FOCUS_SEARCH,
390 IDS_KSV_SHORTCUT_IDC_FOCUS_SEARCH,
391 // |accelerator_ids|
392 {},
393 // |shortcut_key_codes|
394 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_K, ui::VKEY_E}},
395
396 {// |categories|
397 {ShortcutCategory::kAccessibility},
398 IDS_KSV_DESCRIPTION_IDC_FOCUS_TOOLBAR,
399 {},
400 // |accelerator_ids|
401 {{ui::VKEY_T, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}},
402
403 {// |categories|
404 {ShortcutCategory::kTextEditing},
405 IDS_KSV_DESCRIPTION_KEYBOARD_BRIGHTNESS_DOWN,
406 {},
407 // |accelerator_ids|
408 {{ui::VKEY_BRIGHTNESS_DOWN, ui::EF_ALT_DOWN}}},
409
410 {// |categories|
411 {ShortcutCategory::kTextEditing},
412 IDS_KSV_DESCRIPTION_KEYBOARD_BRIGHTNESS_UP,
413 {},
414 // |accelerator_ids|
415 {{ui::VKEY_BRIGHTNESS_UP, ui::EF_ALT_DOWN}}},
416
417 {// |categories|
418 {ShortcutCategory::kSystemAndDisplay},
419 IDS_KSV_DESCRIPTION_LAUNCH_LAST_APP,
420 {},
421 // |accelerator_ids|
422 {{ui::VKEY_9, ui::EF_ALT_DOWN}}},
423
424 {// |categories|
425 {ShortcutCategory::kPopular, ShortcutCategory::kTabAndWindow},
426 IDS_KSV_DESCRIPTION_NEW_TAB,
427 {},
428 // |accelerator_ids|
429 {{ui::VKEY_T, ui::EF_CONTROL_DOWN}}},
430
431 {// |categories|
432 {ShortcutCategory::kPopular, ShortcutCategory::kTabAndWindow},
433 IDS_KSV_DESCRIPTION_NEW_WINDOW,
434 {},
435 // |accelerator_ids|
436 {{ui::VKEY_N, ui::EF_CONTROL_DOWN}}},
437
438 {// |categories|
439 {ShortcutCategory::kTabAndWindow},
440 IDS_KSV_DESCRIPTION_IDC_NEW_INCOGNITO_WINDOW,
441 {},
442 // |accelerator_ids|
443 {{ui::VKEY_N, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN}}},
444
445 {// |categories|
446 {ShortcutCategory::kTabAndWindow},
447 IDS_KSV_DESCRIPTION_IDC_OPEN_FILE,
448 {},
449 // |accelerator_ids|
450 {{ui::VKEY_O, ui::EF_CONTROL_DOWN}}},
451
452 {// |categories|
453 {ShortcutCategory::kPageAndBrowser},
454 IDS_KSV_DESCRIPTION_IDC_PRINT,
455 {},
456 // |accelerator_ids|
457 {{ui::VKEY_P, ui::EF_CONTROL_DOWN}}},
458
459 {// |categories|
460 {ShortcutCategory::kPopular, ShortcutCategory::kPageAndBrowser},
461 IDS_KSV_DESCRIPTION_IDC_RELOAD,
462 IDS_KSV_SHORTCUT_IDC_RELOAD,
463 // |accelerator_ids|
464 {},
465 // |shortcut_key_codes|
466 {ui::VKEY_BROWSER_REFRESH, ui::VKEY_CONTROL, ui::VKEY_UNKNOWN,
467 ui::VKEY_R}},
468
469 {// |categories|
470 {ShortcutCategory::kPageAndBrowser},
471 IDS_KSV_DESCRIPTION_IDC_RELOAD_BYPASSING_CACHE,
472 {},
473 // |accelerator_ids|
474 {{ui::VKEY_R, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN}}},
475
476 {// |categories|
477 {ShortcutCategory::kTabAndWindow},
478 IDS_KSV_DESCRIPTION_IDC_RESTORE_TAB,
479 {},
480 // |accelerator_ids|
481 {{ui::VKEY_T, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN}}},
482
483 {// |categories|
484 {ShortcutCategory::kPageAndBrowser},
485 IDS_KSV_DESCRIPTION_IDC_BACK,
486 {},
487 // |accelerator_ids|
488 {{ui::VKEY_LEFT, ui::EF_ALT_DOWN}}},
489
490 {// |categories|
491 {ShortcutCategory::kPageAndBrowser},
492 IDS_KSV_DESCRIPTION_IDC_FORWARD,
493 {},
494 // |accelerator_ids|
495 {{ui::VKEY_RIGHT, ui::EF_ALT_DOWN}}},
496
497 {// |categories|
498 {ShortcutCategory::kPageAndBrowser},
499 IDS_KSV_DESCRIPTION_IDC_SAVE_PAGE,
500 {},
501 // |accelerator_ids|
502 {{ui::VKEY_S, ui::EF_CONTROL_DOWN}}},
503
504 {// |categories|
505 {ShortcutCategory::kTabAndWindow},
506 IDS_KSV_DESCRIPTION_IDC_SELECT_LAST_TAB,
507 {},
508 // |accelerator_ids|
509 {{ui::VKEY_9, ui::EF_CONTROL_DOWN}}},
510
511 {// |categories|
512 {ShortcutCategory::kPopular},
513 IDS_KSV_DESCRIPTION_IDC_SELECT_NEXT_TAB,
514 {},
515 // |accelerator_ids|
516 {{ui::VKEY_TAB, ui::EF_CONTROL_DOWN}}},
517
518 {// |categories|
519 {ShortcutCategory::kPopular},
520 IDS_KSV_DESCRIPTION_IDC_SELECT_PREVIOUS_TAB,
521 {},
522 // |accelerator_ids|
523 {{ui::VKEY_TAB, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN}}},
524
525 {// |categories|
526 {ShortcutCategory::kPageAndBrowser},
527 IDS_KSV_DESCRIPTION_IDC_SHOW_BOOKMARK_BAR,
528 {},
529 // |accelerator_ids|
530 {{ui::VKEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN}}},
531
532 {// |categories|
533 {ShortcutCategory::kPageAndBrowser},
534 IDS_KSV_DESCRIPTION_IDC_SHOW_HISTORY,
535 {},
536 // |accelerator_ids|
537 {{ui::VKEY_H, ui::EF_CONTROL_DOWN}}},
538
539 {// |categories|
540 {ShortcutCategory::kPageAndBrowser},
541 IDS_KSV_DESCRIPTION_IDC_CLOSE_FIND_OR_STOP,
542 {},
543 // |accelerator_ids|
544 {},
545 // |shortcut_key_codes|
546 {ui::VKEY_ESCAPE}},
547
548 {// |categories|
549 {ShortcutCategory::kPageAndBrowser},
550 IDS_KSV_DESCRIPTION_IDC_VIEW_SOURCE,
551 {},
552 // |accelerator_ids|
553 {{ui::VKEY_U, ui::EF_CONTROL_DOWN}}},
554
555 {// |categories|
556 {ShortcutCategory::kPageAndBrowser},
557 IDS_KSV_DESCRIPTION_IDC_ZOOM_MINUS,
558 {},
559 // |accelerator_ids|
560 {{ui::VKEY_OEM_MINUS, ui::EF_CONTROL_DOWN}}},
561
562 {// |categories|
563 {ShortcutCategory::kPageAndBrowser},
564 IDS_KSV_DESCRIPTION_IDC_ZOOM_NORMAL,
565 {},
566 // |accelerator_ids|
567 {{ui::VKEY_0, ui::EF_CONTROL_DOWN}}},
568
569 {// |categories|
570 {ShortcutCategory::kPageAndBrowser},
571 IDS_KSV_DESCRIPTION_IDC_ZOOM_PLUS,
572 {},
573 // |accelerator_ids|
574 {{ui::VKEY_OEM_PLUS, ui::EF_CONTROL_DOWN}}},
575
576 {// |categories|
577 {ShortcutCategory::kSystemAndDisplay, ShortcutCategory::kTextEditing},
578 IDS_KSV_DESCRIPTION_SWITCH_TO_NEXT_IME,
579 {},
580 // |accelerator_ids|
581 {{ui::VKEY_SPACE, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN}}},
582
583 {// |categories|
584 {ShortcutCategory::kSystemAndDisplay},
585 IDS_KSV_DESCRIPTION_OPEN_FILE_MANAGER,
586 {},
587 // |accelerator_ids|
588 {{ui::VKEY_M, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}},
589
590 {// |categories|
591 {ShortcutCategory::kSystemAndDisplay, ShortcutCategory::kTextEditing},
592 IDS_KSV_DESCRIPTION_SWITCH_TO_LAST_USED_IME,
593 {},
594 // |accelerator_ids|
595 {{ui::VKEY_SPACE, ui::EF_CONTROL_DOWN}}},
596
597 {// |categories|
598 {ShortcutCategory::kSystemAndDisplay},
599 IDS_KSV_DESCRIPTION_ROTATE_SCREEN,
600 {},
601 // |accelerator_ids|
602 {{ui::VKEY_BROWSER_REFRESH, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN}}},
603
604 {// |categories|
605 {ShortcutCategory::kSystemAndDisplay},
606 IDS_KSV_DESCRIPTION_SCALE_UI_RESET,
607 {},
608 // |accelerator_ids|
609 {{ui::VKEY_0, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN}}},
610
611 {// |categories|
612 {ShortcutCategory::kSystemAndDisplay},
613 IDS_KSV_DESCRIPTION_SWITCH_TO_NEXT_USER,
614 {},
615 // |accelerator_ids|
616 {{ui::VKEY_OEM_PERIOD, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}},
617
618 {// |categories|
619 {ShortcutCategory::kSystemAndDisplay},
620 IDS_KSV_DESCRIPTION_SWITCH_TO_PREVIOUS_USER,
621 {},
622 // |accelerator_ids|
623 {{ui::VKEY_OEM_COMMA, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}},
624
625 {// |categories|
626 {ShortcutCategory::kPopular},
627 IDS_KSV_DESCRIPTION_TAKE_PARTIAL_SCREENSHOT,
628 {},
629 // |accelerator_ids|
630 {{ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN}}},
631
632 {// |categories|
633 {ShortcutCategory::kPopular},
634 IDS_KSV_DESCRIPTION_TAKE_SCREENSHOT,
635 {},
636 // |accelerator_ids|
637 {{ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_CONTROL_DOWN}}},
638
639 {// |categories|
640 {ShortcutCategory::kPopular, ShortcutCategory::kTextEditing},
641 IDS_KSV_DESCRIPTION_TOGGLE_CAPS_LOCK,
642 {},
643 // |accelerator_ids|
644 {{ui::VKEY_LWIN, ui::EF_ALT_DOWN}}},
645
646 {// |categories|
647 {ShortcutCategory::kAccessibility},
648 IDS_KSV_DESCRIPTION_TOGGLE_HIGH_CONTRAST,
649 {},
650 // |accelerator_ids|
651 {{ui::VKEY_H, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN}}},
652
653 {// |categories|
654 {ShortcutCategory::kAccessibility},
655 IDS_KSV_DESCRIPTION_CARET_BROWSING_TOGGLE,
656 {},
657 // |accelerator_ids|
658 {{ui::VKEY_7, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN}}},
659
660 {// |categories|
661 {ShortcutCategory::kSystemAndDisplay},
662 IDS_KSV_DESCRIPTION_TOGGLE_MESSAGE_CENTER_BUBBLE,
663 {},
664 // |accelerator_ids|
665 {{ui::VKEY_N, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}},
666
667 {// |categories|
668 {ShortcutCategory::kPopular},
669 IDS_KSV_DESCRIPTION_TOGGLE_OVERVIEW,
670 {},
671 // |accelerator_ids|
672 {{ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_NONE}}},
673
674 {// |categories|
675 {ShortcutCategory::kAccessibility},
676 IDS_KSV_DESCRIPTION_TOGGLE_SPOKEN_FEEDBACK,
677 {},
678 // |accelerator_ids|
679 {{ui::VKEY_Z, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}},
680
681 {// |categories|
682 {ShortcutCategory::kSystemAndDisplay},
683 IDS_KSV_DESCRIPTION_TOGGLE_SYSTEM_TRAY_BUBBLE,
684 {},
685 // |accelerator_ids|
686 {{ui::VKEY_S, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}},
687
688 {// |categories|
689 {ShortcutCategory::kTabAndWindow},
690 IDS_KSV_DESCRIPTION_WINDOW_CYCLE_SNAP_LEFT,
691 {},
692 // |accelerator_ids|
693 {{ui::VKEY_OEM_4, ui::EF_ALT_DOWN}}},
694
695 {// |categories|
696 {ShortcutCategory::kTabAndWindow},
697 IDS_KSV_DESCRIPTION_WINDOW_CYCLE_SNAP_RIGHT,
698 {},
699 // |accelerator_ids|
700 {{ui::VKEY_OEM_6, ui::EF_ALT_DOWN}}},
701 {// |categories|
702 {ShortcutCategory::kPopular, ShortcutCategory::kTextEditing},
703 IDS_KSV_DESCRIPTION_COPY,
704 {},
705 // |accelerator_ids|
706 {},
707 // |shortcut_key_codes|
708 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_C}},
709
710 {// |categories|
711 {ShortcutCategory::kPopular, ShortcutCategory::kTextEditing},
712 IDS_KSV_DESCRIPTION_PASTE,
713 {},
714 // |accelerator_ids|
715 {},
716 // |shortcut_key_codes|
717 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_V}},
718
719 {// |categories|
720 {ShortcutCategory::kPopular},
721 IDS_KSV_DESCRIPTION_SELECT_NUMBERED_TAB,
722 IDS_KSV_SHORTCUT_SELECT_NUMBERED_TAB,
723 // |accelerator_ids|
724 {},
725 // |shortcut_key_codes|
726 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN}},
727
728 {// |categories|
729 {ShortcutCategory::kPopular},
730 IDS_KSV_DESCRIPTION_KEYBOARD_SHORTCUT_HELPER,
731 {},
732 // |accelerator_ids|
733 {{ui::VKEY_OEM_2, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}},
734
735 {// |categories|
736 {ShortcutCategory::kTabAndWindow},
737 IDS_KSV_DESCRIPTION_OPEN_LINK_IN_TAB_BACKGROUND,
738 IDS_KSV_SHORTCUT_OPEN_LINK_IN_TAB_BACKGROUND,
739 // |accelerator_ids|
740 {},
741 // |shortcut_key_codes|
742 {ui::VKEY_CONTROL}},
743
744 {// |categories|
745 {ShortcutCategory::kTabAndWindow},
746 IDS_KSV_DESCRIPTION_OPEN_LINK_IN_TAB,
747 IDS_KSV_SHORTCUT_OPEN_LINK_IN_TAB,
748 // |accelerator_ids|
749 {},
750 // |shortcut_key_codes|
751 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_SHIFT}},
752
753 {// |categories|
754 {ShortcutCategory::kTabAndWindow},
755 IDS_KSV_DESCRIPTION_OPEN_LINK_IN_WINDOW,
756 IDS_KSV_SHORTCUT_OPEN_LINK_IN_WINDOW,
757 // |accelerator_ids|
758 {},
759 // |shortcut_key_codes|
760 {ui::VKEY_SHIFT}},
761
762 {// |categories|
763 {ShortcutCategory::kTabAndWindow},
764 IDS_KSV_DESCRIPTION_OPEN_PAGE_IN_NEW_TAB,
765 IDS_KSV_SHORTCUT_OPEN_PAGE_IN_NEW_TAB,
766 // |accelerator_ids|
767 {},
768 // |shortcut_key_codes|
769 {ui::VKEY_LMENU, ui::VKEY_UNKNOWN, ui::VKEY_RETURN}},
770
771 {// |categories|
772 {ShortcutCategory::kTabAndWindow},
773 IDS_KSV_DESCRIPTION_STOP_DRAG_TAB,
774 IDS_KSV_SHORTCUT_STOP_DRAG_TAB,
775 // |accelerator_ids|
776 {{ui::VKEY_ESCAPE, ui::EF_NONE}}},
777
778 {// |categories|
779 {ShortcutCategory::kPageAndBrowser},
780 IDS_KSV_DESCRIPTION_PAGE_UP,
781 {},
782 // |accelerator_ids|
783 {},
784 // |shortcut_key_codes|
785 {ui::VKEY_COMMAND, ui::VKEY_UNKNOWN, ui::VKEY_UP}},
786
787 {// |categories|
788 {ShortcutCategory::kPageAndBrowser},
789 IDS_KSV_DESCRIPTION_PAGE_DOWN,
790 {},
791 // |accelerator_ids|
792 {},
793 // |shortcut_key_codes|
794 {ui::VKEY_COMMAND, ui::VKEY_UNKNOWN, ui::VKEY_DOWN}},
795
796 {// |categories|
797 {ShortcutCategory::kPageAndBrowser},
798 IDS_KSV_DESCRIPTION_SCROLL_DOWN_PAGE,
799 {},
800 // |accelerator_ids|
801 {},
802 // |shortcut_key_codes|
803 {ui::VKEY_SPACE}},
804
805 {// |categories|
806 {ShortcutCategory::kPageAndBrowser},
807 IDS_KSV_DESCRIPTION_GO_TO_TOP,
808 {},
809 // |accelerator_ids|
810 {},
811 // |shortcut_key_codes|
812 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_LMENU, ui::VKEY_UNKNOWN,
813 ui::VKEY_UP}},
814
815 {// |categories|
816 {ShortcutCategory::kPageAndBrowser},
817 IDS_KSV_DESCRIPTION_GO_TO_BOTTOM,
818 {},
819 // |accelerator_ids|
820 {},
821 // |shortcut_key_codes|
822 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_LMENU, ui::VKEY_UNKNOWN,
823 ui::VKEY_DOWN}},
824
825 {// |categories|
826 {ShortcutCategory::kPageAndBrowser},
827 IDS_KSV_DESCRIPTION_RIGHT_CLICK,
828 IDS_KSV_SHORTCUT_RIGHT_CLICK,
829 // |accelerator_ids|
830 {},
831 // |shortcut_key_codes|
832 {ui::VKEY_LMENU}},
833
834 {// |categories|
835 {ShortcutCategory::kPageAndBrowser},
836 IDS_KSV_DESCRIPTION_SAVE_LINK_AS_BOOKMARK,
837 IDS_KSV_SHORTCUT_SAVE_LINK_AS_BOOKMARK,
838 // |accelerator_ids|
839 {}},
840
841 {// |categories|
842 {ShortcutCategory::kPageAndBrowser},
843 IDS_KSV_DESCRIPTION_AUTO_COMPLETE,
844 {},
845 // |accelerator_ids|
846 {},
847 // |shortcut_key_codes|
848 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_RETURN}},
849
850 {// |categories|
851 {ShortcutCategory::kPageAndBrowser},
852 IDS_KSV_DESCRIPTION_OPEN_DOWNLOADS_PAGE,
853 {},
854 // |accelerator_ids|
855 {{ui::VKEY_J, ui::EF_CONTROL_DOWN}}},
856
857 {// |categories|
858 {ShortcutCategory::kSystemAndDisplay},
859 IDS_KSV_DESCRIPTION_OPEN_FILE,
860 IDS_KSV_SHORTCUT_OPEN_FILE,
861 // |accelerator_ids|
862 {},
863 // |shortcut_key_codes|
864 {ui::VKEY_SPACE}},
865
866 {// |categories|
867 {ShortcutCategory::kSystemAndDisplay},
868 IDS_KSV_DESCRIPTION_DISPLAY_HIDDEN_FILES,
869 {},
870 // |accelerator_ids|
871 {},
872 // |shortcut_key_codes|
873 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_OEM_PERIOD}},
874
875 {// |categories|
876 {ShortcutCategory::kSystemAndDisplay},
877 IDS_KSV_DESCRIPTION_LAUNCH_NUMBERED_APP,
878 IDS_KSV_SHORTCUT_LAUNCH_NUMBERED_APP,
879 // |accelerator_ids|
880 {},
881 // |shortcut_key_codes|
882 {ui::VKEY_LMENU, ui::VKEY_UNKNOWN}},
883
884 {// |categories|
885 {ShortcutCategory::kSystemAndDisplay},
886 IDS_KSV_DESCRIPTION_USE_F_KEYS,
887 IDS_KSV_SHORTCUT_USE_F_KEYS,
888 // |accelerator_ids|
889 {},
890 // |shortcut_key_codes|
891 {ui::VKEY_COMMAND, ui::VKEY_UNKNOWN}},
892
893 {// |categories|
894 {ShortcutCategory::kTextEditing},
895 IDS_KSV_DESCRIPTION_SELECT_ADDRESS_BAR,
896 IDS_KSV_SHORTCUT_SELECT_ADDRESS_BAR,
897 // |accelerator_ids|
898 {},
899 // |shortcut_key_codes|
900 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_L, ui::VKEY_LMENU,
901 ui::VKEY_UNKNOWN, ui::VKEY_D}},
902
903 {// |categories|
904 {ShortcutCategory::kTextEditing},
905 IDS_KSV_DESCRIPTION_SELECT_NEXT_WORD,
906 {},
907 // |accelerator_ids|
908 {},
909 // |shortcut_key_codes|
910 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_SHIFT, ui::VKEY_UNKNOWN,
911 ui::VKEY_RIGHT}},
912
913 {// |categories|
914 {ShortcutCategory::kTextEditing},
915 IDS_KSV_DESCRIPTION_SELECT_TEXT_TO_END_OF_LINE,
916 {},
917 // |accelerator_ids|
918 {},
919 // |shortcut_key_codes|
920 {ui::VKEY_SHIFT, ui::VKEY_UNKNOWN, ui::VKEY_COMMAND, ui::VKEY_UNKNOWN,
921 ui::VKEY_RIGHT}},
922
923 {// |categories|
924 {ShortcutCategory::kTextEditing},
925 IDS_KSV_DESCRIPTION_SELECT_TEXT_TO_BEGINNING,
926 {},
927 // |accelerator_ids|
928 {},
929 // |shortcut_key_codes|
930 {ui::VKEY_SHIFT, ui::VKEY_UNKNOWN, ui::VKEY_COMMAND, ui::VKEY_UNKNOWN,
931 ui::VKEY_LEFT}},
932
933 {// |categories|
934 {ShortcutCategory::kTextEditing},
935 IDS_KSV_DESCRIPTION_SELECT_PREVIOUS_WORD,
936 {},
937 // |accelerator_ids|
938 {},
939 // |shortcut_key_codes|
940 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_SHIFT, ui::VKEY_UNKNOWN,
941 ui::VKEY_LEFT}},
942
943 {// |categories|
944 {ShortcutCategory::kTextEditing},
945 IDS_KSV_DESCRIPTION_MOVE_TO_END_OF_WORD,
946 {},
947 // |accelerator_ids|
948 {},
949 // |shortcut_key_codes|
950 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_RIGHT}},
951
952 {// |categories|
953 {ShortcutCategory::kTextEditing},
954 IDS_KSV_DESCRIPTION_MOVE_TO_START_OF_PREVIOUS_WORD,
955 {},
956 // |accelerator_ids|
957 {},
958 // |shortcut_key_codes|
959 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_LEFT}},
960
961 {// |categories|
962 {ShortcutCategory::kTextEditing},
963 IDS_KSV_DESCRIPTION_GO_TO_END_OF_DOCUMENT,
964 {},
965 // |accelerator_ids|
966 {},
967 // |shortcut_key_codes|
968 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_COMMAND, ui::VKEY_UNKNOWN,
969 ui::VKEY_RIGHT}},
970
971 {// |categories|
972 {ShortcutCategory::kTextEditing},
973 IDS_KSV_DESCRIPTION_GO_TO_END_OF_LINE,
974 {},
975 // |accelerator_ids|
976 {},
977 // |shortcut_key_codes|
978 {ui::VKEY_COMMAND, ui::VKEY_UNKNOWN, ui::VKEY_RIGHT}},
979
980 {// |categories|
981 {ShortcutCategory::kTextEditing},
982 IDS_KSV_DESCRIPTION_GO_TO_BEGINNING_OF_DOCUMENT,
983 {},
984 // |accelerator_ids|
985 {},
986 // |shortcut_key_codes|
987 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_COMMAND, ui::VKEY_UNKNOWN,
988 ui::VKEY_LEFT}},
989
990 {// |categories|
991 {ShortcutCategory::kTextEditing},
992 IDS_KSV_DESCRIPTION_GO_TO_BEGINNING_OF_LINE,
993 {},
994 // |accelerator_ids|
995 {},
996 // |shortcut_key_codes|
997 {ui::VKEY_COMMAND, ui::VKEY_UNKNOWN, ui::VKEY_LEFT}},
998
999 {// |categories|
1000 {ShortcutCategory::kTextEditing},
1001 IDS_KSV_DESCRIPTION_PASTE_CONTENT_AS_TEXT,
1002 {},
1003 // |accelerator_ids|
1004 {},
1005 // |shortcut_key_codes|
1006 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_SHIFT, ui::VKEY_UNKNOWN,
1007 ui::VKEY_V}},
1008
1009 {// |categories|
1010 {ShortcutCategory::kTextEditing},
1011 IDS_KSV_DESCRIPTION_CUT,
1012 {},
1013 // |accelerator_ids|
1014 {},
1015 // |shortcut_key_codes|
1016 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_X}},
1017
1018 {// |categories|
1019 {ShortcutCategory::kTextEditing},
1020 IDS_KSV_DESCRIPTION_DELETE_PREVIOUS_WORD,
1021 {},
1022 // |accelerator_ids|
1023 {},
1024 // |shortcut_key_codes|
1025 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_BACK}},
1026
1027 {// |categories|
1028 {ShortcutCategory::kTextEditing},
1029 IDS_KSV_DESCRIPTION_DELETE_NEXT_WORD,
1030 {},
1031 // |accelerator_ids|
1032 {},
1033 // |shortcut_key_codes|
1034 {ui::VKEY_COMMAND, ui::VKEY_UNKNOWN, ui::VKEY_BACK}},
1035
1036 {// |categories|
1037 {ShortcutCategory::kTextEditing},
1038 IDS_KSV_DESCRIPTION_UNDO,
1039 {},
1040 // |accelerator_ids|
1041 {},
1042 // |shortcut_key_codes|
1043 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_Z}},
1044
1045 {// |categories|
1046 {ShortcutCategory::kTextEditing},
1047 IDS_KSV_DESCRIPTION_REDO,
1048 {},
1049 // |accelerator_ids|
1050 {},
1051 // |shortcut_key_codes|
1052 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_SHIFT, ui::VKEY_UNKNOWN,
1053 ui::VKEY_Z}},
1054
1055 {// |categories|
1056 {ShortcutCategory::kAccessibility},
1057 IDS_KSV_DESCRIPTION_HIGHLIGHT_PREVIOUS_ITEM_ON_SHELF,
1058 IDS_KSV_SHORTCUT_HIGHLIGHT_PREVIOUS_ITEM_ON_SHELF,
1059 // |accelerator_ids|
1060 {},
1061 // |shortcut_key_codes|
1062 {ui::VKEY_SHIFT, ui::VKEY_UNKNOWN, ui::VKEY_LMENU, ui::VKEY_UNKNOWN,
1063 ui::VKEY_L, ui::VKEY_SHIFT, ui::VKEY_UNKNOWN, ui::VKEY_TAB,
1064 ui::VKEY_LEFT}},
1065
1066 {// |categories|
1067 {ShortcutCategory::kAccessibility},
1068 IDS_KSV_DESCRIPTION_OPEN_HIGHLIGHTED_ITEM_ON_SHELF,
1069 IDS_KSV_SHORTCUT_OPEN_HIGHLIGHTED_ITEM_ON_SHELF,
1070 // |accelerator_ids|
1071 {},
1072 // |shortcut_key_codes|
1073 {ui::VKEY_SHIFT, ui::VKEY_UNKNOWN, ui::VKEY_LMENU, ui::VKEY_UNKNOWN,
1074 ui::VKEY_L, ui::VKEY_SPACE, ui::VKEY_RETURN}},
1075
1076 {// |categories|
1077 {ShortcutCategory::kAccessibility},
1078 IDS_KSV_DESCRIPTION_REMOVE_HIGHLIGHT_ON_SHELF,
1079 IDS_KSV_SHORTCUT_REMOVE_HIGHLIGHT_ON_SHELF,
1080 // |accelerator_ids|
1081 {},
1082 // |shortcut_key_codes|
1083 {ui::VKEY_SHIFT, ui::VKEY_UNKNOWN, ui::VKEY_LMENU, ui::VKEY_UNKNOWN,
1084 ui::VKEY_L, ui::VKEY_ESCAPE}},
1085
1086 {// |categories|
1087 {ShortcutCategory::kAccessibility},
1088 IDS_KSV_DESCRIPTION_SWITCH_FOCUS,
1089 IDS_KSV_SHORTCUT_SWITCH_FOCUS,
1090 // |accelerator_ids|
1091 {},
1092 // |shortcut_key_codes|
1093 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_BROWSER_BACK,
1094 ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_SHIFT, ui::VKEY_UNKNOWN,
1095 ui::VKEY_BROWSER_BACK}},
1096
1097 {// |categories|
1098 {ShortcutCategory::kAccessibility},
1099 IDS_KSV_DESCRIPTION_OPEN_RIGHT_CLICK_MENU_FOR_HIGHLIGHTED_ITEM,
1100 {},
1101 // |accelerator_ids|
1102 {},
1103 // |shortcut_key_codes|
1104 {ui::VKEY_SHIFT, ui::VKEY_UNKNOWN, ui::VKEY_COMMAND, ui::VKEY_UNKNOWN,
1105 ui::VKEY_VOLUME_UP}},
1106
1107 {// |categories|
1108 {ShortcutCategory::kSystemAndDisplay},
1109 IDS_KSV_DESCRIPTION_TOGGLE_MIRROR_MODE,
1110 {},
1111 // |accelerator_ids|
1112 {{ui::VKEY_MEDIA_LAUNCH_APP2, ui::EF_CONTROL_DOWN}}},
1113
1114 {// |categories|
1115 {ShortcutCategory::kSystemAndDisplay},
1116 IDS_KSV_DESCRIPTION_SWAP_PRIMARY_DISPLAY,
1117 {},
1118 // |accelerator_ids|
1119 {{ui::VKEY_MEDIA_LAUNCH_APP2, ui::EF_ALT_DOWN}}},
1120
1121 {// |categories|
1122 {ShortcutCategory::kSystemAndDisplay},
1123 IDS_KSV_DESCRIPTION_BRIGHTNESS_DOWN,
1124 {},
1125 // |accelerator_ids|
1126 {{ui::VKEY_BRIGHTNESS_DOWN, ui::EF_NONE}}},
1127
1128 {// |categories|
1129 {ShortcutCategory::kSystemAndDisplay},
1130 IDS_KSV_DESCRIPTION_BRIGHTNESS_UP,
1131 {},
1132 // |accelerator_ids|
1133 {{ui::VKEY_BRIGHTNESS_UP, ui::EF_NONE}}},
1134
1135 {// |categories|
1136 {ShortcutCategory::kAccessibility},
1137 IDS_KSV_DESCRIPTION_MAGNIFY_SCREEN_ZOOM_OUT,
1138 {},
1139 // |accelerator_ids|
1140 {{ui::VKEY_BRIGHTNESS_DOWN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}},
1141
1142 {// |categories|
1143 {ShortcutCategory::kAccessibility},
1144 IDS_KSV_DESCRIPTION_MAGNIFY_SCREEN_ZOOM_IN,
1145 {},
1146 // |accelerator_ids|
1147 {{ui::VKEY_BRIGHTNESS_UP, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}},
1148
1149 {// |categories|
1150 {ShortcutCategory::kSystemAndDisplay},
1151 IDS_KSV_DESCRIPTION_VOLUME_MUTE,
1152 {},
1153 // |accelerator_ids|
1154 {{ui::VKEY_VOLUME_MUTE, ui::EF_NONE}}},
1155
1156 {// |categories|
1157 {ShortcutCategory::kSystemAndDisplay},
1158 IDS_KSV_DESCRIPTION_VOLUME_DOWN,
1159 {},
1160 // |accelerator_ids|
1161 {{ui::VKEY_VOLUME_DOWN, ui::EF_NONE}}},
1162
1163 {// |categories|
1164 {ShortcutCategory::kSystemAndDisplay},
1165 IDS_KSV_DESCRIPTION_VOLUME_UP,
1166 {},
1167 // |accelerator_ids|
1168 {{ui::VKEY_VOLUME_UP, ui::EF_NONE}}},
1169
1170 {// |categories|
1171 {ShortcutCategory::kSystemAndDisplay},
1172 IDS_KSV_DESCRIPTION_SHOW_TASK_MANAGER,
1173 {},
1174 // |accelerator_ids|
1175 {{ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN}}},
1176
1177 {// |categories|
1178 {ShortcutCategory::kTabAndWindow},
1179 IDS_KSV_DESCRIPTION_TOGGLE_FULLSCREEN,
1180 {},
1181 // |accelerator_ids|
1182 {{ui::VKEY_MEDIA_LAUNCH_APP2, ui::EF_NONE}}},
1183
1184 {// |categories|
1185 {ShortcutCategory::kTabAndWindow},
1186 IDS_KSV_DESCRIPTION_WINDOW_MINIMIZE,
1187 {},
1188 // |accelerator_ids|
1189 {{ui::VKEY_OEM_MINUS, ui::EF_ALT_DOWN}}},
1190
1191 {// |categories|
1192 {ShortcutCategory::kPageAndBrowser},
1193 IDS_KSV_DESCRIPTION_FOCUS_NEXT_PANE,
1194 {},
1195 // |accelerator_ids|
1196 {{ui::VKEY_BROWSER_BACK, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN}}},
1197
1198 {// |categories|
1199 {ShortcutCategory::kPageAndBrowser},
1200 IDS_KSV_DESCRIPTION_FOCUS_PREVIOUS_PANE,
1201 {},
1202 // |accelerator_ids|
1203 {{ui::VKEY_BROWSER_BACK, ui::EF_CONTROL_DOWN}}},
1204
1205 {// |categories|
1206 {ShortcutCategory::kTabAndWindow},
1207 IDS_KSV_DESCRIPTION_MOVE_ACTIVE_WINDOW_BETWEEN_DISPLAYS,
1208 {},
1209 // |accelerator_ids|
1210 {{ui::VKEY_M, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN}}},
1211
1212 {// |categories|
1213 {ShortcutCategory::kSystemAndDisplay},
1214 IDS_KSV_DESCRIPTION_TOGGLE_APP_LIST,
1215 {},
1216 // |accelerator_ids|
1217 {{ui::VKEY_LWIN}}},
1218
1219 {// |categories|
1220 {ShortcutCategory::kSystemAndDisplay},
1221 IDS_KSV_DESCRIPTION_TOGGLE_APP_LIST_FULLSCREEN,
1222 {},
1223 // |accelerator_ids|
1224 {{ui::VKEY_LWIN, ui::EF_SHIFT_DOWN}}},
1225
1226 {// |categories|
1227 {ShortcutCategory::kTabAndWindow},
1228 IDS_KSV_DESCRIPTION_TAKE_WINDOW_SCREENSHOT,
1229 {},
1230 // |accelerator_ids|
1231 {{ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}},
1232
1233 {// |categories|
1234 {ShortcutCategory::kSystemAndDisplay},
1235 IDS_KSV_DESCRIPTION_SUSPEND,
1236 {},
1237 // |accelerator_ids|
1238 {{ui::VKEY_L, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN}}},
1239
1240 {// |categories|
1241 {ShortcutCategory::kSystemAndDisplay},
1242 IDS_KSV_DESCRIPTION_OPEN_GET_HELP,
1243 {},
1244 // |accelerator_ids|
1245 {{ui::VKEY_OEM_2, ui::EF_CONTROL_DOWN}}},
1246
1247 {// |categories|
1248 {ShortcutCategory::kSystemAndDisplay},
1249 IDS_KSV_DESCRIPTION_OPEN_FEEDBACK_PAGE,
1250 {},
1251 // |accelerator_ids|
1252 {{ui::VKEY_I, ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN}}},
1253
1254 {// |categories|
1255 {ShortcutCategory::kTabAndWindow},
1256 IDS_KSV_DESCRIPTION_ROTATE_WINDOW,
1257 {},
1258 // |accelerator_ids|
1259 {{ui::VKEY_BROWSER_REFRESH,
1260 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN}}},
1261
1262 {// |categories|
1263 {ShortcutCategory::kSystemAndDisplay},
1264 IDS_KSV_DESCRIPTION_SHOW_STYLUS_TOOLS,
1265 {},
1266 // |accelerator_ids|
1267 {{ui::VKEY_P, ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN}}},
1268
1269 {// |categories|
1270 {ShortcutCategory::kTabAndWindow},
1271 IDS_KSV_DESCRIPTION_TOGGLE_MAXIMIZED,
1272 {},
1273 // |accelerator_ids|
1274 {{ui::VKEY_OEM_PLUS, ui::EF_ALT_DOWN}}},
1275
1276 {// |categories|
1277 {ShortcutCategory::kTabAndWindow},
1278 IDS_KSV_DESCRIPTION_OPEN_CROSH,
1279 {},
1280 // |accelerator_ids|
1281 {{ui::VKEY_T, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}},
1282
1283 {// |categories|
1284 {ShortcutCategory::kSystemAndDisplay},
1285 IDS_KSV_DESCRIPTION_EXIT,
1286 {},
1287 // |accelerator_ids|
1288 {{ui::VKEY_Q, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN}}},
1289
1290 {// |categories|
1291 {ShortcutCategory::kTabAndWindow},
1292 IDS_KSV_DESCRIPTION_UNPIN,
1293 {},
1294 // |accelerator_ids|
1295 {{ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN}}},
1296
1297 {// |categories|
1298 {ShortcutCategory::kSystemAndDisplay},
1299 IDS_KSV_DESCRIPTION_SHOW_IME_MENU_BUBBLE,
1300 {},
1301 // |accelerator_ids|
1302 {{ui::VKEY_K, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN}}},
1303
1304 {// |categories|
1305 {ShortcutCategory::kTabAndWindow},
1306 IDS_KSV_DESCRIPTION_DESKS_NEW_DESK,
1307 {},
1308 // |accelerator_ids|
1309 {{ui::VKEY_OEM_PLUS, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN}}},
1310 {// |categories|
1311 {ShortcutCategory::kTabAndWindow},
1312 IDS_KSV_DESCRIPTION_DESKS_REMOVE_CURRENT_DESK,
1313 {},
1314 // |accelerator_ids|
1315 {{ui::VKEY_OEM_MINUS, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN}}},
1316
1317 {// |categories|
1318 {ShortcutCategory::kTabAndWindow},
1319 IDS_KSV_DESCRIPTION_DESKS_ACTIVATE_LEFT_DESK,
1320 {},
1321 // |accelerator_ids|
1322 {{ui::VKEY_OEM_4, ui::EF_COMMAND_DOWN}}},
1323 {// |categories|
1324 {ShortcutCategory::kTabAndWindow},
1325 IDS_KSV_DESCRIPTION_DESKS_ACTIVATE_RIGHT_DESK,
1326 {},
1327 // |accelerator_ids|
1328 {{ui::VKEY_OEM_6, ui::EF_COMMAND_DOWN}}},
1329
1330 {// |categories|
1331 {ShortcutCategory::kTabAndWindow},
1332 IDS_KSV_DESCRIPTION_DESKS_MOVE_ACTIVE_ITEM_LEFT_DESK,
1333 {},
1334 // |accelerator_ids|
1335 {{ui::VKEY_OEM_4, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN}}},
1336 {// |categories|
1337 {ShortcutCategory::kTabAndWindow},
1338 IDS_KSV_DESCRIPTION_DESKS_MOVE_ACTIVE_ITEM_RIGHT_DESK,
1339 {},
1340 // |accelerator_ids|
1341 {{ui::VKEY_OEM_6, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN}}},
1342
1343 {// |categories|
1344 {ShortcutCategory::kPageAndBrowser},
1345 IDS_KSV_DESCRIPTION_SHOW_IDC_FOCUS_MENU_BAR,
1346 {},
1347 // |accelerator_ids|
1348 {{ui::VKEY_F10}}},
1349
1350 {// |categories|
1351 {ShortcutCategory::kPageAndBrowser},
1352 IDS_KSV_DESCRIPTION_SHOW_IDC_HOME,
1353 {},
1354 // |accelerator_ids|
1355 {{ui::VKEY_HOME, ui::EF_ALT_DOWN}}},
1356
1357 {// |categories|
1358 {ShortcutCategory::kPageAndBrowser},
1359 IDS_KSV_DESCRIPTION_SHOW_IDC_CLEAR_BROWSING_DATA,
1360 {},
1361 // |accelerator_ids|
1362 {{ui::VKEY_BACK, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN}}},
1363
1364 {// |categories|
1365 {ShortcutCategory::kPageAndBrowser},
1366 IDS_KSV_DESCRIPTION_SHOW_IDC_SHOW_BOOKMARK_MANAGER,
1367 {},
1368 // |accelerator_ids|
1369 {{ui::VKEY_O, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN}}},
1370
1371 {// |categories|
1372 {ShortcutCategory::kPageAndBrowser},
1373 IDS_KSV_DESCRIPTION_IDC_DEV_TOOLS_INSPECT,
1374 {},
1375 // |accelerator_ids|
1376 {{ui::VKEY_C, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN}}},
1377
1378 {// |categories|
1379 {ShortcutCategory::kAccessibility},
1380 IDS_KSV_DESCRIPTION_IDC_FOCUS_INACTIVE_POPUP_FOR_ACCESSIBILITY,
1381 {},
1382 // |accelerator_ids|
1383 {{ui::VKEY_A, ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN}}},
1384
1385 {// |categories|
1386 {ShortcutCategory::kPageAndBrowser},
1387 IDS_KSV_DESCRIPTION_IDC_SHOW_APP_MENU,
1388 IDS_KSV_SHORTCUT_IDC_SHOW_APP_MENU,
1389 // |accelerator_ids|
1390 {},
1391 // |shortcut_key_codes|
1392 {ui::VKEY_LMENU, ui::VKEY_UNKNOWN, ui::VKEY_E, ui::VKEY_F}},
1393
1394 {// |categories|
1395 {ShortcutCategory::kPopular},
1396 IDS_KSV_DESCRIPTION_OPEN_GOOGLE_ASSISTANT,
1397 {},
1398 // |accelerator_ids|
1399 {{ui::VKEY_A, ui::EF_COMMAND_DOWN}}},
1400
1401 {// |categories|
1402 {ShortcutCategory::kAccessibility},
1403 IDS_KSV_DESCRIPTION_MOVE_APPS_IN_GRID,
1404 IDS_KSV_SHORTCUT_MOVE_APPS_IN_GRID,
1405 // |accelerator_ids|
1406 {},
1407 // |shortcut_key_codes|
1408 {ui::VKEY_CONTROL, ui::VKEY_LEFT, ui::VKEY_RIGHT, ui::VKEY_UP,
1409 ui::VKEY_DOWN}},
1410
1411 {// |categories|
1412 {ShortcutCategory::kAccessibility},
1413 IDS_KSV_DESCRIPTION_MOVE_APPS_IN_OUT_FOLDER,
1414 IDS_KSV_SHORTCUT_MOVE_APPS_IN_OUT_FOLDER,
1415 // |accelerator_ids|
1416 {},
1417 // |shortcut_key_codes|
1418 {ui::VKEY_CONTROL, ui::VKEY_UNKNOWN, ui::VKEY_SHIFT, ui::VKEY_LEFT,
1419 ui::VKEY_RIGHT, ui::VKEY_UP, ui::VKEY_DOWN}},
1420
1421 {// |categories|
1422 {ShortcutCategory::kSystemAndDisplay},
1423 IDS_KSV_DESCRIPTION_PRIVACY_SCREEN_TOGGLE,
1424 {},
1425 // |accelerator_ids|
1426 {{ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::EF_NONE}}},
1427 });
1428
1429 static bool is_initialized = false;
1430 // If the item's |shortcut_key_codes| is empty, we need to dynamically
1431 // populate the keycodes with |accelerator_ids| to construct the shortcut
1432 // string.
1433 if (!is_initialized) {
1434 is_initialized = true;
1435 for (auto& item : *item_list) {
1436 if (item.shortcut_key_codes.empty() && !item.accelerator_ids.empty()) {
1437 // Only use the first |accelerator_id| because the modifiers are the
1438 // same even if it is a grouped accelerators.
1439 const AcceleratorId& accelerator_id = item.accelerator_ids[0];
1440 // Insert |shortcut_key_codes| by the order of CTRL, ALT, SHIFT, SEARCH,
1441 // and then key, to be consistent with how we describe it in the
1442 // |shortcut_message_id| associated string template.
1443 for (auto modifier : {ui::EF_CONTROL_DOWN, ui::EF_ALT_DOWN,
1444 ui::EF_SHIFT_DOWN, ui::EF_COMMAND_DOWN}) {
1445 if (accelerator_id.modifiers & modifier) {
1446 // ui::VKEY_UNKNOWN is used as a separator and will be shown as a
1447 // highlighted "+" sign between the bubble views and the rest of the
1448 // text.
1449 if (!item.shortcut_key_codes.empty())
1450 item.shortcut_key_codes.push_back(ui::VKEY_UNKNOWN);
1451 item.shortcut_key_codes.push_back(GetKeyCodeForModifier(modifier));
1452 }
1453 }
1454 // For non grouped accelerators, we need to populate the key as well.
1455 if (item.accelerator_ids.size() == 1) {
1456 if (!item.shortcut_key_codes.empty())
1457 item.shortcut_key_codes.push_back(ui::VKEY_UNKNOWN);
1458 item.shortcut_key_codes.push_back(accelerator_id.keycode);
1459 }
1460 }
1461 }
1462 }
1463
1464 return *item_list;
1465 }
1466
1467 } // namespace keyboard_shortcut_viewer
1468