Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / chrome / browser / resources / chromeos / chromevox / common / command_store.js
blobd50fe47b9d869514f4945b47f7e2cec42ed7166d
1 // Copyright 2014 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.
6 /**
7  * @fileoverview This class acts as the persistent store for all static data
8  * about commands.
9  *
10  * This store can safely be used within either a content or background script
11  * context.
12  *
13  * If you are looking to add a user command, follow the below steps for best
14  * integration with existing components:
15  * 1. Add a command below in cvox.CommandStore.CMD_WHITELIST. Pick a
16  * programmatic name and fill in each of the relevant JSON keys.
17  * Be sure to add a msg id and define it in chromevox/messages/messages.js which
18  * describes the command. Please also add a category msg id so that the command
19  * will show up in the options page.
20  * 2. Add the command's logic to cvox.UserCommands inside of our switch-based
21  * dispatch method (doCommand_).
22  * 3. Add a key binding in chromevox/background/keymaps/classic_keymap.json and
23  * chromevox/background/keymaps/flat_keymap.json.
24  *
25  * Class description:
26  * This class is entirely static and holds a JSON structure that stores
27  * commands and their associated metadata.
28  *
29  * From this metadata, we compute relevant subsets of data such as all present
30  * categories.
31  */
34 goog.provide('cvox.CommandStore');
36 goog.require('cvox.PlatformFilter');
39 /**
40  * Returns all of the categories in the store as an array.
41  * @return {Array<string>} The collection of categories.
42  */
43 cvox.CommandStore.categories = function() {
44   var categorySet = {};
45   for (var cmd in cvox.CommandStore.CMD_WHITELIST) {
46     var struct = cvox.CommandStore.CMD_WHITELIST[cmd];
47     if (struct.category) {
48       categorySet[struct.category] = true;
49     }
50   }
51   var ret = [];
52   for (var category in categorySet) {
53     ret.push(category);
54   }
55   return ret;
59 /**
60  * Gets a message given a command.
61  * @param {string} command The command to query.
62  * @return {string|undefined} The message id, if any.
63  */
64 cvox.CommandStore.messageForCommand = function(command) {
65   return (cvox.CommandStore.CMD_WHITELIST[command] || {}).msgId;
69 /**
70  * Gets a category given a command.
71  * @param {string} command The command to query.
72  * @return {string|undefined} The command, if any.
73  */
74 cvox.CommandStore.categoryForCommand = function(command) {
75   return (cvox.CommandStore.CMD_WHITELIST[command] || {}).category;
79 /**
80  * Gets all commands for a category.
81  * @param {string} category The category to query.
82  * @return {Array<string>} The commands, if any.
83  */
84 cvox.CommandStore.commandsForCategory = function(category) {
85   var ret = [];
86   for (var cmd in cvox.CommandStore.CMD_WHITELIST) {
87     var struct = cvox.CommandStore.CMD_WHITELIST[cmd];
88     if (category == struct.category) {
89       ret.push(cmd);
90     }
91   }
92   return ret;
96 /**
97  * List of commands and their properties
98  * @type {Object<{forward: (undefined|boolean),
99  *                backward: (undefined|boolean),
100  *                announce: boolean,
101  *                category: (undefined|string),
102  *                findNext: (undefined|string),
103  *                doDefault: (undefined|boolean),
104  *                msgId: (undefined|string),
105  *                nodeList: (undefined|string),
106  *                platformFilter: (undefined|cvox.PlatformFilter),
107  *                skipInput: (undefined|boolean),
108  *                allowEvents: (undefined|boolean),
109  *                disallowContinuation: (undefined|boolean)}>}
110  *  forward: Whether this command points forward.
111  *  backward: Whether this command points backward. If neither forward or
112  *            backward are specified, it stays facing in the current direction.
113  *  announce: Whether to call finishNavCommand and announce the current
114  *            position after the command is done.
115  *  findNext: The id from the map above if this command is used for
116  *            finding next/previous of something.
117  *  category: The message resource describing the command's category.
118  *  doDefault: Whether to do the default action. This means that keys will be
119  *             passed through to the usual DOM capture/bubble phases.
120  *  msgId: The message resource describing the command.
121  *  nodeList: The id from the map above if this command is used for
122  *            showing a list of nodes.
123  *  platformFilter: Specifies to which platforms this command applies. If left
124  *                  undefined, the command applies to all platforms.
125  *  skipInput: Explicitly skips this command when text input has focus.
126  *             Defaults to false.
127  *  disallowOOBE: Explicitly disallows this command when on chrome://oobe/*.
128  *             Defaults to false.
129  *  allowEvents: Allows EventWatcher to continue processing events which can
130  * trump TTS.
131  *  disallowContinuation: Disallows continuous read to proceed. Defaults to
132  * false.
133  */
134 cvox.CommandStore.CMD_WHITELIST = {
135   'toggleStickyMode': {announce: false,
136                        msgId: 'toggle_sticky_mode',
137                        'disallowOOBE': true,
138                        category: 'modifier_keys'},
139   'toggleKeyPrefix': {announce: false,
140                       skipInput: true,
141                       msgId: 'prefix_key',
142                          'disallowOOBE': true,
143                       category: 'modifier_keys'},
144   'passThroughMode': {announce: false,
145                       msgId: 'pass_through_key_description',
146                       category: 'modifier_keys'},
148   'stopSpeech': {announce: false,
149                  disallowContinuation: true,
150                  doDefault: true,
151                  msgId: 'stop_speech_key',
152                  category: 'controlling_speech'},
153   'toggleChromeVox': {announce: false,
154                       platformFilter: cvox.PlatformFilter.WML,
155                       msgId: 'toggle_chromevox_active',
156                       category: 'controlling_speech'},
157   'decreaseTtsRate': {announce: false,
158                       msgId: 'decrease_tts_rate',
159                       category: 'controlling_speech'},
160   'increaseTtsRate': {announce: false,
161                       msgId: 'increase_tts_rate',
162                       category: 'controlling_speech'},
163   'decreaseTtsPitch': {announce: false,
164                       msgId: 'decrease_tts_pitch',
165                       category: 'controlling_speech'},
166   'increaseTtsPitch': {announce: false,
167                       msgId: 'increase_tts_pitch',
168                       category: 'controlling_speech'},
169   'decreaseTtsVolume': {announce: false,
170                       msgId: 'decrease_tts_volume',
171                       category: 'controlling_speech'},
172   'increaseTtsVolume': {announce: false,
173                       msgId: 'increase_tts_volume',
174                       category: 'controlling_speech'},
175   'cyclePunctuationEcho': {announce: false,
176                            msgId: 'cycle_punctuation_echo',
177                            category: 'controlling_speech'},
178   'cycleTypingEcho': {announce: false,
179                       msgId: 'cycle_typing_echo',
180                       category: 'controlling_speech'},
183   'toggleEarcons': {announce: true,
184                     msgId: 'toggle_earcons',
185                     category: 'controlling_speech'},
187   'handleTab': {
188     allowEvents: true,
189     msgId: 'handle_tab_next',
190     disallowContinuation: true,
191     category: 'navigation'},
192   'handleTabPrev': {
193     allowEvents: true,
194     msgId: 'handle_tab_prev',
195     disallowContinuation: true,
196     category: 'navigation'},
197   'forward': {forward: true,
198               announce: true,
199               msgId: 'forward',
200               category: 'navigation'},
201   'backward': {backward: true,
202                announce: true,
203                msgId: 'backward',
204                category: 'navigation'},
205   'right': {forward: true,
206             announce: true,
207             msgId: 'right',
208             category: 'navigation'},
209   'left': {backward: true,
210            announce: true,
211            msgId: 'left',
212            category: 'navigation'},
213   'previousGranularity': {announce: true,
214                           msgId: 'previous_granularity',
215                           category: 'navigation'},
216   'nextGranularity': {announce: true,
217                           msgId: 'next_granularity',
218                           category: 'navigation'},
220   'previousCharacter': {backward: true,
221                         announce: true,
222                         msgId: 'previous_character',
223                         skipInput: true,
224                         category: 'navigation'},
225   'nextCharacter': {forward: true,
226                     announce: true,
227                     msgId: 'next_character',
228                     skipInput: true,
229                     category: 'navigation'},
230   'previousWord': {backward: true,
231                         announce: true,
232                         msgId: 'previous_word',
233                         skipInput: true,
234                         category: 'navigation'},
235   'nextWord': {forward: true,
236                     announce: true,
237                     msgId: 'next_word',
238                     skipInput: true,
239                     category: 'navigation'},
240   'previousLine': {backward: true,
241                         announce: true,
242                         msgId: 'previous_line',
243                         category: 'navigation'},
244   'nextLine': {forward: true,
245                     announce: true,
246                     msgId: 'next_line',
247                     category: 'navigation'},
248   'previousSentence': {backward: true,
249                         announce: true,
250                         msgId: 'previous_sentence',
251                         skipInput: true,
252                         category: 'navigation'},
253   'nextSentence': {forward: true,
254                     announce: true,
255                     msgId: 'next_sentence',
256                     skipInput: true,
257                     category: 'navigation'},
258   'previousObject': {backward: true,
259                         announce: true,
260                         msgId: 'previous_object',
261                         skipInput: true,
262                         category: 'navigation'},
263   'nextObject': {forward: true,
264                     announce: true,
265                     msgId: 'next_object',
266                     skipInput: true,
267                     category: 'navigation'},
268   'previousGroup': {backward: true,
269                         announce: true,
270                         msgId: 'previous_group',
271                         skipInput: true,
272                         category: 'navigation'},
273   'nextGroup': {forward: true,
274                     announce: true,
275                     msgId: 'next_group',
276                     skipInput: true,
277                     category: 'navigation'},
279   'jumpToTop': {forward: true,
280                 announce: true,
281                 msgId: 'jump_to_top',
282                 category: 'navigation'
284   'jumpToBottom': {backward: true,
285                    announce: true,
286                    msgId: 'jump_to_bottom',
287                    category: 'navigation'},
288   // Intentionally uncategorized.
289   'moveToStartOfLine': {forward: true, announce: true},
290   'moveToEndOfLine': {backward: true, announce: true},
292   'readFromHere': {forward: true,
293                    announce: false,
294                    msgId: 'read_from_here',
295                    category: 'navigation'},
297   'performDefaultAction': {disallowContinuation: true,
298                            msgId: 'perform_default_action',
299                            doDefault: true,
300                            skipInput: true,
301                            category: 'navigation'},
302   'forceClickOnCurrentItem': {announce: true,
303                               disallowContinuation: true,
304                               allowEvents: true,
305                               msgId: 'force_click_on_current_item',
306                               category: 'navigation'},
307   'forceDoubleClickOnCurrentItem': {announce: true,
308                                     allowEvents: true,
309                                     disallowContinuation: true},
311   'readLinkURL': {announce: false,
312                   msgId: 'read_link_url',
313                   category: 'information'},
314   'readCurrentTitle': {announce: false,
315                        msgId: 'read_current_title',
316                        category: 'information'},
317   'readCurrentURL': {announce: false,
318                      msgId: 'read_current_url',
319                      category: 'information'},
321   'fullyDescribe': {announce: false,
322                     msgId: 'fully_describe',
323                     category: 'information'},
324   'speakTimeAndDate': {announce: false,
325                        msgId: 'speak_time_and_date',
326                        category: 'information'},
327   'toggleSelection': {announce: true,
328                       msgId: 'toggle_selection',
329                       category: 'information'},
331   'toggleSearchWidget': {announce: false,
332                          disallowContinuation: true,
333                          msgId: 'toggle_search_widget',
334                          category: 'information'},
336   'toggleKeyboardHelp': {announce: false,
337                          disallowContinuation: true,
338                          msgId: 'show_power_key',
339                          category: 'help_commands'},
340   'help': {announce: false,
341            msgId: 'help',
342            'disallowOOBE': true,
343            disallowContinuation: true,
344            category: 'help_commands'},
345   'contextMenu': {announce: false,
346                   disallowContinuation: true},
348   'showOptionsPage': {announce: false,
349                       disallowContinuation: true,
350                       msgId: 'show_options_page',
351                       'disallowOOBE': true,
352                       category: 'help_commands'},
353   'showKbExplorerPage': {announce: false,
354                          disallowContinuation: true,
355                          msgId: 'show_kb_explorer_page',
356                          'disallowOOBE': true,
357                          category: 'help_commands'},
360   'showFormsList': {announce: false,
361                     disallowContinuation: true,
362                     nodeList: 'formField',
363                     msgId: 'show_forms_list',
364                     category: 'overview'},
365   'showHeadingsList': {announce: false, nodeList: 'heading',
366                        disallowContinuation: true,
367                        msgId: 'show_headings_list',
368                        category: 'overview'},
369   'showLandmarksList': {announce: false, nodeList: 'landmark',
370                         disallowContinuation: true,
371                         msgId: 'show_landmarks_list',
372                         category: 'overview'},
373   'showLinksList': {announce: false, nodeList: 'link',
374                     disallowContinuation: true,
375                     msgId: 'show_links_list',
376                     category: 'overview'},
377   'showTablesList': {announce: false, nodeList: 'table',
378                      disallowContinuation: true,
379                      msgId: 'show_tables_list',
380                      category: 'overview'},
382   'nextArticle': {forward: true,
383                   findNext: 'article'},
385   'nextButton': {forward: true,
386                  findNext: 'button',
387                  msgId: 'next_button',
388                  category: 'jump_commands'},
389   'nextCheckbox': {forward: true,
390                    findNext: 'checkbox',
391                    msgId: 'next_checkbox',
392                    category: 'jump_commands'},
393   'nextComboBox': {forward: true,
394                    findNext: 'combobox',
395                    msgId: 'next_combo_box',
396                    category: 'jump_commands'},
397   'nextControl': {forward: true, findNext: 'control'},
398   'nextEditText': {forward: true,
399                    findNext: 'editText',
400                    msgId: 'next_edit_text',
401                    category: 'jump_commands'},
402   'nextFormField': {forward: true,
403                     findNext: 'formField',
404                     msgId: 'next_form_field',
405                     category: 'jump_commands'},
406   'nextGraphic': {forward: true,
407                   findNext: 'graphic',
408                   msgId: 'next_graphic',
409                   category: 'jump_commands'},
410   'nextHeading': {forward: true,
411                   findNext: 'heading',
412                   msgId: 'next_heading',
413                   category: 'jump_commands'},
414   'nextHeading1': {forward: true,
415                    findNext: 'heading1',
416                    msgId: 'next_heading1',
417                    category: 'jump_commands'},
418   'nextHeading2': {forward: true,
419                    findNext: 'heading2',
420                    msgId: 'next_heading2',
421                    category: 'jump_commands'},
422   'nextHeading3': {forward: true,
423                    findNext: 'heading3',
424                    msgId: 'next_heading3',
425                    category: 'jump_commands'},
426   'nextHeading4': {forward: true,
427                    findNext: 'heading4',
428                    msgId: 'next_heading4',
429                    category: 'jump_commands'},
430   'nextHeading5': {forward: true,
431                    findNext: 'heading5',
432                    msgId: 'next_heading5',
433                    category: 'jump_commands'},
434   'nextHeading6': {forward: true,
435                    findNext: 'heading6',
436                    msgId: 'next_heading6',
437                    category: 'jump_commands'},
439   'nextLandmark': {forward: true,
440                    findNext: 'landmark',
441                    msgId: 'next_landmark',
442                    category: 'jump_commands'},
443   'nextLink': {forward: true,
444                findNext: 'link',
445                msgId: 'next_link',
446                category: 'jump_commands'},
447   'nextList': {forward: true,
448                findNext: 'list',
449                msgId: 'next_list',
450                category: 'jump_commands'},
451   'nextListItem': {forward: true,
452                    findNext: 'listItem',
453                    msgId: 'next_list_item',
454                    category: 'jump_commands'},
455   'nextMath': {forward: true,
456                findNext: 'math',
457                msgId: 'next_math',
458                category: 'jump_commands'},
459   'nextMedia': {forward: true,
460                 findNext: 'media',
461                 msgId: 'next_media',
462                 category: 'jump_commands'},
463   'nextRadio': {forward: true,
464                 findNext: 'radio',
465                 msgId: 'next_radio',
466                 category: 'jump_commands'},
467   'nextSection': {forward: true, findNext: 'section'},
468   'nextSlider': {forward: true, findNext: 'slider'},
469   'nextTable': {forward: true,
470                 findNext: 'table',
471                 msgId: 'next_table',
472                 category: 'jump_commands'},
473   'nextVisitedLink': {forward: true,
474                 findNext: 'visitedLink',
475                 msgId: 'next_visited_link',
476                 category: 'jump_commands'},
479   'previousArticle': {backward: true,
480                   findNext: 'article'},
482   'previousButton': {backward: true,
483                  findNext: 'button',
484                  msgId: 'previous_button',
485                  category: 'jump_commands'},
486   'previousCheckbox': {backward: true,
487                    findNext: 'checkbox',
488                    msgId: 'previous_checkbox',
489                    category: 'jump_commands'},
490   'previousComboBox': {backward: true,
491                    findNext: 'combobox',
492                    msgId: 'previous_combo_box',
493                    category: 'jump_commands'},
494   'previousControl': {backward: true, findNext: 'control'},
495   'previousEditText': {backward: true,
496                    findNext: 'editText',
497                    msgId: 'previous_edit_text',
498                    category: 'jump_commands'},
499   'previousFormField': {backward: true,
500                     findNext: 'formField',
501                     msgId: 'previous_form_field',
502                     category: 'jump_commands'},
503   'previousGraphic': {backward: true,
504                   findNext: 'graphic',
505                   msgId: 'previous_graphic',
506                   category: 'jump_commands'},
507   'previousHeading': {backward: true,
508                   findNext: 'heading',
509                   msgId: 'previous_heading',
510                   category: 'jump_commands'},
511   'previousHeading1': {backward: true,
512                    findNext: 'heading1',
513                    msgId: 'previous_heading1',
514                    category: 'jump_commands'},
515   'previousHeading2': {backward: true,
516                    findNext: 'heading2',
517                    msgId: 'previous_heading2',
518                    category: 'jump_commands'},
519   'previousHeading3': {backward: true,
520                    findNext: 'heading3',
521                    msgId: 'previous_heading3',
522                    category: 'jump_commands'},
523   'previousHeading4': {backward: true,
524                    findNext: 'heading4',
525                    msgId: 'previous_heading4',
526                    category: 'jump_commands'},
527   'previousHeading5': {backward: true,
528                    findNext: 'heading5',
529                    msgId: 'previous_heading5',
530                    category: 'jump_commands'},
531   'previousHeading6': {backward: true,
532                    findNext: 'heading6',
533                    msgId: 'previous_heading6',
534                    category: 'jump_commands'},
536   'previousLandmark': {backward: true,
537                    findNext: 'landmark',
538                    msgId: 'previous_landmark',
539                    category: 'jump_commands'},
540   'previousLink': {backward: true,
541                    findNext: 'link',
542                    msgId: 'previous_link',
543                    category: 'jump_commands'},
544   'previousList': {backward: true,
545                findNext: 'list',
546                msgId: 'previous_list',
547                category: 'jump_commands'},
548   'previousListItem': {backward: true,
549                    findNext: 'listItem',
550                    msgId: 'previous_list_item',
551                    category: 'jump_commands'},
552   'previousMath': {backward: true,
553                    findNext: 'math',
554                    msgId: 'previous_math',
555                    category: 'jump_commands'},
556   'previousMedia': {backward: true,
557                     findNext: 'media',
558                     msgId: 'previous_media',
559                     category: 'jump_commands'},
560   'previousRadio': {backward: true,
561                 findNext: 'radio',
562                 msgId: 'previous_radio',
563                 category: 'jump_commands'},
564   'previousSection': {backward: true, findNext: 'section'},
565   'previousSlider': {backward: true, findNext: 'slider'},
566   'previousTable': {backward: true,
567                 findNext: 'table',
568                 msgId: 'previous_table',
569                 category: 'jump_commands'},
570   'previousVisitedLink': {backward: true,
571                           findNext: 'visitedLink',
572                           msgId: 'previous_visited_link',
573                           category: 'jump_commands'},
576   // Table Actions.
577   'announceHeaders': {announce: false,
578                       msgId: 'announce_headers',
579                       category: 'tables'},
580   'speakTableLocation': {announce: false,
581                          msgId: 'speak_table_location',
582                          category: 'tables'},
583   'goToFirstCell': {announce: true,
584                     msgId: 'skip_to_beginning',
585                     category: 'tables'},
586   'goToLastCell': {announce: true,
587                    msgId: 'skip_to_end',
588                    category: 'tables'},
589   'goToRowFirstCell': {announce: true,
590                        msgId: 'skip_to_row_beginning',
591                        category: 'tables'},
592   'goToRowLastCell': {announce: true,
593                       msgId: 'skip_to_row_end',
594                       category: 'tables'},
595   'goToColFirstCell': {announce: true,
596                        msgId: 'skip_to_col_beginning',
597                        category: 'tables'},
598   'goToColLastCell': {announce: true,
599                       msgId: 'skip_to_col_end',
600                       category: 'tables'},
601   // These commands are left out of the options page because they involve
602   // multiple, non-user configurable modifiers.
603   'previousRow': {backward: true, announce: true, skipInput: true},
604   'previousCol': {backward: true, announce: true, skipInput: true},
605   'nextRow': {forward: true, announce: true, skipInput: true},
606   'nextCol': {forward: true, announce: true, skipInput: true},
608   // Generic Actions.
609   'enterShifter': {announce: true,
610                    msgId: 'enter_content',
611                    category: 'navigation'},
612   'exitShifter': {announce: true,
613                   msgId: 'exit_content',
614                   category: 'navigation'},
615   'exitShifterContent': {announce: true},
617   'openLongDesc': {announce: false,
618                    msgId: 'open_long_desc',
619                    category: 'information'},
621   'pauseAllMedia': {announce: false,
622                     msgId: 'pause_all_media',
623                     category: 'information'},
625   // Math specific commands.
626   'toggleSemantics': {announce: false,
627                       msgId: 'toggle_semantics',
628                       category: 'information'},
630   // Braille specific commands.
631   'routing': {announce: false,
632               allowEvents: true,
633               msgId: 'braille_routing',
634               category: 'braille'},
635   'pan_left': {backward: true,
636                announce: true,
637                msgId: 'braille_pan_left',
638                category: 'braille'},
639   'pan_right': {forward: true,
640                 announce: true,
641                 msgId: 'braille_pan_right',
642                 category: 'braille'},
643   'line_up': {backward: true,
644               announce: true,
645               msgId: 'braille_line_up',
646               category: 'braille'},
647   'line_down': {forward: true,
648                 announce: true,
649                 msgId: 'braille_line_down',
650                 category: 'braille'},
651   'top': {forward: true,
652                 announce: true,
653                 msgId: 'braille_top',
654                 category: 'braille'},
655   'bottom': {backward: true,
656                 announce: true,
657                 msgId: 'braille_bottom',
658                 category: 'braille'},
660   // Developer commands.
661   'enableConsoleTts': {announce: false,
662                       msgId: 'enable_tts_log',
663                       category: 'developer'},
664   'toggleBrailleCaptions': {announce: false,
665                             msgId: 'braille_captions',
666                             category: 'developer'},
668   'startHistoryRecording': {announce: false},
669   'stopHistoryRecording': {announce: false},
670   'autorunner': {announce: false},
672   'debug': {announce: false},
674   'nop': {announce: false}
679  * List of find next commands and their associated data.
680  * @type {Object<{predicate: string,
681  *                forwardError: string,
682  *                backwardError: string}>}
683  *  predicate: The name of the predicate. This must be defined in DomPredicates.
684  *  forwardError: The message id of the error string when moving forward.
685  *  backwardError: The message id of the error string when moving backward.
686  */
687 cvox.CommandStore.NODE_INFO_MAP = {
688   'checkbox': {predicate: 'checkboxPredicate',
689                forwardError: 'no_next_checkbox',
690                backwardError: 'no_previous_checkbox',
691                typeMsg: 'aria_role_checkbox'},
692   'radio': {predicate: 'radioPredicate',
693             forwardError: 'no_next_radio_button',
694             backwardError: 'no_previous_radio_button',
695             typeMsg: 'aria_role_radio'},
696   'slider': {predicate: 'sliderPredicate',
697              forwardError: 'no_next_slider',
698              backwardError: 'no_previous_slider',
699              typeMsg: 'aria_role_slider'},
700   'graphic': {predicate: 'graphicPredicate',
701               forwardError: 'no_next_graphic',
702               backwardError: 'no_previous_graphic',
703               typeMsg: 'UNUSED'},
704   'article': {predicate: 'articlePredicate',
705              forwardError: 'no_next_ARTICLE',
706              backwardError: 'no_previous_ARTICLE',
707              typeMsg: 'TAG_ARTICLE'},
708   'button': {predicate: 'buttonPredicate',
709              forwardError: 'no_next_button',
710              backwardError: 'no_previous_button',
711              typeMsg: 'aria_role_button'},
712   'combobox': {predicate: 'comboBoxPredicate',
713                forwardError: 'no_next_combo_box',
714                backwardError: 'no_previous_combo_box',
715                typeMsg: 'aria_role_combobox'},
716   'editText': {predicate: 'editTextPredicate',
717                forwardError: 'no_next_edit_text',
718                backwardError: 'no_previous_edit_text',
719                typeMsg: 'input_type_text'},
720   'heading': {predicate: 'headingPredicate',
721               forwardError: 'no_next_heading',
722               backwardError: 'no_previous_heading',
723               typeMsg: 'aria_role_heading'},
724   'heading1': {predicate: 'heading1Predicate',
725                forwardError: 'no_next_heading_1',
726                backwardError: 'no_previous_heading_1'},
727   'heading2': {predicate: 'heading2Predicate',
728                forwardError: 'no_next_heading_2',
729                backwardError: 'no_previous_heading_2'},
730   'heading3': {predicate: 'heading3Predicate',
731                forwardError: 'no_next_heading_3',
732                backwardError: 'no_previous_heading_3'},
733   'heading4': {predicate: 'heading4Predicate',
734                forwardError: 'no_next_heading_4',
735                backwardError: 'no_previous_heading_4'},
736   'heading5': {predicate: 'heading5Predicate',
737                forwardError: 'no_next_heading_5',
738                backwardError: 'no_previous_heading_5'},
739   'heading6': {predicate: 'heading6Predicate',
740                forwardError: 'no_next_heading_6',
741                backwardError: 'no_previous_heading_6'},
743   'link': {predicate: 'linkPredicate',
744            forwardError: 'no_next_link',
745            backwardError: 'no_previous_link',
746            typeMsg: 'aria_role_link'},
747   'table': {predicate: 'tablePredicate',
748             forwardError: 'no_next_table',
749             backwardError: 'no_previous_table',
750             typeMsg: 'table_strategy'},
751   'visitedLink': {predicate: 'visitedLinkPredicate',
752             forwardError: 'no_next_visited_link',
753             backwardError: 'no_previous_visited_link',
754             typeMsg: 'tag_link'},
755   'list': {predicate: 'listPredicate',
756            forwardError: 'no_next_list',
757            backwardError: 'no_previous_list',
758            typeMsg: 'aria_role_list'},
759   'listItem': {predicate: 'listItemPredicate',
760                forwardError: 'no_next_list_item',
761                backwardError: 'no_previous_list_item',
762                typeMsg: 'aria_role_listitem'},
763   'formField': {predicate: 'formFieldPredicate',
764                 forwardError: 'no_next_form_field',
765                 backwardError: 'no_previous_form_field',
766                 typeMsg: 'aria_role_form'},
767   'landmark': {predicate: 'landmarkPredicate',
768                forwardError: 'no_next_landmark',
769                backwardError: 'no_previous_landmark',
770                typeMsg: 'role_landmark'},
771   'math': {predicate: 'mathPredicate',
772            forwardError: 'no_next_math',
773            backwardError: 'no_previous_math',
774            typeMsg: 'math_expr'},
775   'media': {predicate: 'mediaPredicate',
776             forwardError: 'no_next_media_widget',
777             backwardError: 'no_previous_media_widget'},
778   'section': {predicate: 'sectionPredicate',
779            forwardError: 'no_next_section',
780            backwardError: 'no_previous_section'},
781   'control': {predicate: 'controlPredicate',
782            forwardError: 'no_next_control',
783            backwardError: 'no_previous_control'}