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