Bug 1438157 - part 2: Remove unnecessary second argument of EventUtils.synthesizeKey() r=smaug
authorMasayuki Nakano <masayuki@d-toybox.com>
Thu, 15 Feb 2018 04:15:39 +0900
changeset 448919 50d6fe2d0bca50837dd34eb4a79957885c55bffc
parent 448918 a9313b86c72f9ea594da0bd4ba65a53c23a299a0
child 448920 2ff1d57860b67bdd7fec1648c92e135971e44393
push id140
push userfmarier@mozilla.com
push dateTue, 20 Feb 2018 00:21:38 +0000
reviewerssmaug
bugs1438157
milestone60.0a1
Bug 1438157 - part 2: Remove unnecessary second argument of EventUtils.synthesizeKey() r=smaug Note that this patch also replaces legacy VK_* with KEY_*, and replaces synthesizeKey() for inputting some characters with sendString() because it's better and clearer what it does and it sets shiftKey state properly. MozReview-Commit-ID: De4enbjux3T
accessible/tests/browser/general/browser_test_urlbar.js
accessible/tests/mochitest/events.js
accessible/tests/mochitest/events/test_contextmenu.html
accessible/tests/mochitest/events/test_focus_autocomplete.xul
accessible/tests/mochitest/events/test_fromUserInput.html
accessible/tests/mochitest/events/test_menu.xul
accessible/tests/mochitest/events/test_text.html
accessible/tests/mochitest/states/test_inputs.html
accessible/tests/mochitest/treeupdate/test_contextmenu.xul
accessible/tests/mochitest/treeupdate/test_menubutton.xul
browser/base/content/test/forms/browser_selectpopup.js
browser/base/content/test/forms/browser_selectpopup_colors.js
browser/base/content/test/general/browser_bug432599.js
browser/base/content/test/general/browser_bug553455.js
browser/base/content/test/general/browser_bug555767.js
browser/base/content/test/general/browser_domFullscreen_fullscreenMode.js
browser/base/content/test/general/browser_focusonkeydown.js
browser/base/content/test/general/browser_keywordBookmarklets.js
browser/base/content/test/general/browser_keywordSearch.js
browser/base/content/test/general/browser_keywordSearch_postData.js
browser/base/content/test/general/browser_printpreview.js
browser/base/content/test/general/browser_tabfocus.js
browser/base/content/test/general/browser_visibleFindSelection.js
browser/base/content/test/general/browser_zbug569342.js
browser/base/content/test/general/contentSearchUI.js
browser/base/content/test/newtab/browser_newtab_focus.js
browser/base/content/test/newtab/browser_newtab_search.js
browser/base/content/test/permissions/browser_reservedkey.js
browser/base/content/test/popupNotifications/browser_popupNotification_keyboard.js
browser/base/content/test/popupNotifications/browser_popupNotification_no_anchors.js
browser/base/content/test/popupNotifications/head.js
browser/base/content/test/siteIdentity/browser_identityPopup_focus.js
browser/base/content/test/urlbar/browser_action_searchengine_alias.js
browser/base/content/test/urlbar/browser_autocomplete_autoselect.js
browser/base/content/test/urlbar/browser_autocomplete_cursor.js
browser/base/content/test/urlbar/browser_autocomplete_edit_completed.js
browser/base/content/test/urlbar/browser_autocomplete_enter_race.js
browser/base/content/test/urlbar/browser_bug1003461-switchtab-override.js
browser/base/content/test/urlbar/browser_bug1024133-switchtab-override-keynav.js
browser/base/content/test/urlbar/browser_bug1070778.js
browser/base/content/test/urlbar/browser_bug1104165-switchtab-decodeuri.js
browser/base/content/test/urlbar/browser_bug1225194-remotetab.js
browser/base/content/test/urlbar/browser_bug304198.js
browser/base/content/test/urlbar/browser_canonizeURL.js
browser/base/content/test/urlbar/browser_locationBarCommand.js
browser/base/content/test/urlbar/browser_locationBarExternalLoad.js
browser/base/content/test/urlbar/browser_urlbarAutoFillTrimURLs.js
browser/base/content/test/urlbar/browser_urlbarDelete.js
browser/base/content/test/urlbar/browser_urlbarEnter.js
browser/base/content/test/urlbar/browser_urlbarEnterAfterMouseOver.js
browser/base/content/test/urlbar/browser_urlbarOneOffs.js
browser/base/content/test/urlbar/browser_urlbarOneOffs_searchSuggestions.js
browser/base/content/test/urlbar/browser_urlbarRevert.js
browser/base/content/test/urlbar/browser_urlbarSearchSuggestions.js
browser/base/content/test/urlbar/browser_urlbarSearchSuggestions_opt-out.js
browser/base/content/test/urlbar/browser_urlbar_autoFill_backspaced.js
browser/base/content/test/urlbar/browser_urlbar_canonize_on_autofill.js
browser/base/content/test/urlbar/browser_urlbar_locationchange_urlbar_edit_dos.js
browser/base/content/test/urlbar/browser_urlbar_remove_match.js
browser/base/content/test/urlbar/browser_urlbar_searchsettings.js
browser/components/customizableui/test/browser_901207_searchbar_in_panel.js
browser/components/customizableui/test/browser_940307_panel_click_closure_handling.js
browser/components/customizableui/test/browser_984455_bookmarks_items_reparenting.js
browser/components/customizableui/test/browser_panelUINotifications_fullscreen.js
browser/components/customizableui/test/browser_panelUINotifications_fullscreen_noAutoHideToolbar.js
browser/components/customizableui/test/browser_panel_keyboard_navigation.js
browser/components/extensions/test/browser/browser_ext_omnibox.js
browser/components/places/tests/browser/browser_bookmarklet_windowOpen.js
browser/components/places/tests/browser/browser_stayopenmenu.js
browser/components/places/tests/browser/browser_toolbarbutton_menu_context.js
browser/components/places/tests/chrome/test_editBookmarkOverlay_keywords.xul
browser/components/preferences/in-content/tests/browser_bug1184989_prevent_scrolling_when_preferences_flipped.js
browser/components/preferences/in-content/tests/browser_cookies_dialog.js
browser/components/preferences/in-content/tests/browser_password_management.js
browser/components/preferences/in-content/tests/browser_site_login_exceptions.js
browser/components/search/test/browser_426329.js
browser/components/search/test/browser_google_behavior.js
browser/components/search/test/browser_healthreport.js
browser/components/search/test/browser_hiddenOneOffs_diacritics.js
browser/components/search/test/browser_oneOffContextMenu.js
browser/components/search/test/browser_oneOffContextMenu_setDefault.js
browser/components/search/test/browser_oneOffHeader.js
browser/components/search/test/browser_searchEngine_behaviors.js
browser/components/search/test/browser_searchbar_keyboard_navigation.js
browser/components/search/test/browser_searchbar_openpopup.js
browser/components/search/test/browser_searchbar_smallpanel_keyboard_navigation.js
browser/components/search/test/browser_tooManyEnginesOffered.js
browser/components/sessionstore/test/browser_522545.js
browser/extensions/formautofill/test/mochitest/formautofill_common.js
browser/extensions/formautofill/test/mochitest/test_autofocus_form.html
browser/extensions/formautofill/test/mochitest/test_basic_autocomplete_form.html
browser/extensions/formautofill/test/mochitest/test_basic_creditcard_autocomplete_form.html
browser/extensions/formautofill/test/mochitest/test_clear_form.html
browser/extensions/formautofill/test/mochitest/test_creditcard_autocomplete_off.html
browser/extensions/formautofill/test/mochitest/test_form_changes.html
browser/extensions/formautofill/test/mochitest/test_formautofill_preview_highlight.html
browser/extensions/formautofill/test/mochitest/test_multi_locale_CA_address_form.html
browser/extensions/formautofill/test/mochitest/test_multiple_forms.html
browser/extensions/formautofill/test/mochitest/test_on_address_submission.html
browser/modules/test/browser/browser_UsageTelemetry_searchbar.js
browser/modules/test/browser/browser_UsageTelemetry_urlbar.js
browser/modules/test/browser/formValidation/browser_form_validation.js
devtools/client/debugger/test/mochitest/browser_dbg_instruments-pane-collapse_keyboard.js
devtools/client/debugger/test/mochitest/browser_dbg_paused-keybindings.js
devtools/client/debugger/test/mochitest/browser_dbg_split-console-keypress.js
devtools/client/debugger/test/mochitest/browser_dbg_variables-view-accessibility.js
devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-17.js
devtools/client/framework/test/browser_menu_api.js
devtools/client/framework/test/browser_toolbox_keyboard_navigation.js
devtools/client/inspector/boxmodel/test/browser_boxmodel_navigation.js
devtools/client/inspector/computed/test/browser_computed_keybindings_02.js
devtools/client/inspector/markup/test/browser_markup_keybindings_04.js
devtools/client/inspector/markup/test/browser_markup_load_01.js
devtools/client/inspector/markup/test/browser_markup_navigation.js
devtools/client/inspector/rules/test/browser_rules_add-property-cancel_03.js
devtools/client/inspector/rules/test/browser_rules_add-rule-edit-selector.js
devtools/client/inspector/rules/test/browser_rules_add-rule-then-property-edit-selector.js
devtools/client/inspector/rules/test/browser_rules_add-rule-with-menu.js
devtools/client/inspector/rules/test/browser_rules_edit-property-computed.js
devtools/client/inspector/rules/test/browser_rules_edit-property_08.js
devtools/client/inspector/rules/test/browser_rules_edit-selector-click-on-scrollbar.js
devtools/client/inspector/rules/test/browser_rules_edit-selector_01.js
devtools/client/inspector/rules/test/browser_rules_edit-selector_02.js
devtools/client/inspector/rules/test/browser_rules_edit-selector_03.js
devtools/client/inspector/rules/test/browser_rules_edit-selector_04.js
devtools/client/inspector/rules/test/browser_rules_edit-selector_05.js
devtools/client/inspector/rules/test/browser_rules_edit-selector_06.js
devtools/client/inspector/rules/test/browser_rules_edit-selector_07.js
devtools/client/inspector/rules/test/browser_rules_edit-selector_08.js
devtools/client/inspector/rules/test/browser_rules_edit-selector_09.js
devtools/client/inspector/rules/test/browser_rules_edit-selector_10.js
devtools/client/inspector/rules/test/browser_rules_edit-selector_11.js
devtools/client/inspector/rules/test/browser_rules_edit-selector_12.js
devtools/client/inspector/rules/test/browser_rules_editable-field-focus_01.js
devtools/client/inspector/rules/test/browser_rules_livepreview.js
devtools/client/inspector/rules/test/browser_rules_mark_overridden_06.js
devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_04.js
devtools/client/inspector/rules/test/browser_rules_search-filter_07.js
devtools/client/inspector/rules/test/browser_rules_search-filter_08.js
devtools/client/inspector/rules/test/head.js
devtools/client/inspector/shared/test/browser_styleinspector_context-menu-copy-color_02.js
devtools/client/inspector/test/browser_inspector_breadcrumbs_keybinding.js
devtools/client/inspector/test/browser_inspector_delete-selected-node-02.js
devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-clipboard.js
devtools/client/inspector/test/browser_inspector_keyboard-shortcuts.js
devtools/client/inspector/test/browser_inspector_menu-05-attribute-items.js
devtools/client/netmonitor/test/browser_net_filter-autocomplete.js
devtools/client/responsive.html/test/browser/browser_device_width.js
devtools/client/responsive.html/test/browser/browser_toolbox_rule_view.js
devtools/client/shared/components/test/mochitest/test_searchbox-with-autocomplete.html
devtools/client/shared/webpack/shims/test/test_clipboard.html
devtools/client/storage/test/browser_storage_cookies_edit_keyboard.js
devtools/client/storage/test/head.js
devtools/client/styleeditor/test/browser_styleeditor_syncEditSelector.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_accessibility.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_add_edited_input_to_history.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_array_no_index.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_crossdomain_iframe.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_escape_key.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_inside_text.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_native_getters.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_nav_and_tab_key.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_return_key.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_return_key_no_selection.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_ctrl_key_nav.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_history_nav.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_history_persist.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_input_expansion.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_no_autocompletion_on_defined_variables.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_no_input_and_tab_key_pressed.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_no_input_change_and_tab_key_pressed.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_popup_close_on_tab_switch.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_selfxss.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_close_sidebar.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filter_scroll.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_history_arrow_keys.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_keyboard_accessibility.js
devtools/client/webconsole/test/browser_bug_865871_variables_view_close_on_esc_key.js
devtools/client/webconsole/test/browser_console_history_persist.js
devtools/client/webconsole/test/browser_console_keyboard_accessibility.js
devtools/client/webconsole/test/browser_webconsole_autocomplete_accessibility.js
devtools/client/webconsole/test/browser_webconsole_autocomplete_and_selfxss.js
devtools/client/webconsole/test/browser_webconsole_autocomplete_crossdomain_iframe.js
devtools/client/webconsole/test/browser_webconsole_autocomplete_popup_close_on_tab_switch.js
devtools/client/webconsole/test/browser_webconsole_bug_583816_No_input_and_Tab_key_pressed.js
devtools/client/webconsole/test/browser_webconsole_bug_585991_autocomplete_keys.js
devtools/client/webconsole/test/browser_webconsole_bug_588967_input_expansion.js
devtools/client/webconsole/test/browser_webconsole_bug_594497_history_arrow_keys.js
devtools/client/webconsole/test/browser_webconsole_bug_613642_maintain_scroll.js
devtools/client/webconsole/test/browser_webconsole_bug_651501_document_body_autocomplete.js
devtools/client/webconsole/test/browser_webconsole_bug_660806_history_nav.js
devtools/client/webconsole/test/browser_webconsole_bug_704295.js
devtools/client/webconsole/test/browser_webconsole_bug_734061_No_input_change_and_Tab_key_pressed.js
devtools/client/webconsole/test/browser_webconsole_bug_804845_ctrl_key_nav.js
devtools/client/webconsole/test/browser_webconsole_bug_817834_add_edited_input_to_history.js
devtools/client/webconsole/test/browser_webconsole_js_input_expansion.js
docshell/test/browser/browser_uriFixupIntegration.js
dom/events/test/bug299673.js
dom/events/test/test_bug1305458.html
dom/events/test/test_bug450876.html
dom/events/test/test_dom_keyboard_event.html
dom/events/test/window_bug1369072.html
dom/html/test/browser_fullscreen-api-keys.js
dom/html/test/browser_fullscreen-contextmenu-esc.js
dom/html/test/file_fullscreen-denied.html
dom/html/test/file_fullscreen-esc-exit-inner.html
dom/html/test/file_fullscreen-selector.html
dom/html/test/forms/test_bug1283915.html
dom/html/test/forms/test_bug1286509.html
dom/html/test/forms/test_change_event.html
dom/html/test/forms/test_formaction_attribute.html
dom/html/test/forms/test_formnovalidate_attribute.html
dom/html/test/forms/test_input_date_bad_input.html
dom/html/test/forms/test_input_date_key_events.html
dom/html/test/forms/test_input_datetime_focus_blur_events.html
dom/html/test/forms/test_input_datetime_input_change_events.html
dom/html/test/forms/test_input_datetime_tabindex.html
dom/html/test/forms/test_input_event.html
dom/html/test/forms/test_input_file_picker.html
dom/html/test/forms/test_input_number_key_events.html
dom/html/test/forms/test_input_number_placeholder_shown.html
dom/html/test/forms/test_input_number_rounding.html
dom/html/test/forms/test_input_range_key_events.html
dom/html/test/forms/test_input_range_mouse_and_touch_events.html
dom/html/test/forms/test_input_range_rounding.html
dom/html/test/forms/test_input_textarea_set_value_no_scroll.html
dom/html/test/forms/test_input_time_key_events.html
dom/html/test/forms/test_input_time_sec_millisec_field.html
dom/html/test/forms/test_maxlength_attribute.html
dom/html/test/forms/test_minlength_attribute.html
dom/html/test/forms/test_novalidate_attribute.html
dom/html/test/forms/test_radio_in_label.html
dom/html/test/forms/test_select_change_event.html
dom/html/test/forms/test_select_input_change_event.html
dom/html/test/test_bug1045270.html
dom/html/test/test_bug1230665.html
dom/html/test/test_bug386996.html
dom/html/test/test_bug406596.html
dom/html/test/test_bug460568.html
dom/html/test/test_bug535043.html
dom/html/test/test_bug556645.html
dom/html/test/test_bug557087-4.html
dom/html/test/test_bug558788-1.html
dom/html/test/test_bug558788-2.html
dom/html/test/test_bug561636.html
dom/html/test/test_bug566046.html
dom/html/test/test_bug582412-1.html
dom/html/test/test_bug582412-2.html
dom/html/test/test_bug605124-2.html
dom/html/test/test_bug605125-2.html
dom/html/test/test_bug613019.html
dom/html/test/test_bug613979.html
dom/html/test/test_bug615833.html
dom/html/test/test_bug618948.html
dom/html/test/test_bug619278.html
dom/html/test/test_bug622597.html
dom/html/test/test_bug633058.html
dom/html/test/test_bug651956.html
dom/html/test/test_ignoreuserfocus.html
dom/html/test/test_object_plugin_nav.html
dom/indexedDB/test/head.js
dom/plugins/test/mochitest/browser_pluginscroll.js
dom/svg/test/test_tabindex.html
dom/tests/browser/browser_cancel_keydown_keypress_event.js
dom/tests/mochitest/bugs/test_bug265203.html
dom/tests/mochitest/chrome/window_focus.xul
dom/tests/mochitest/chrome/window_focus_docnav.xul
dom/tests/mochitest/general/test_bug1012662_common.js
dom/tests/mochitest/general/test_bug1170911.html
dom/tests/mochitest/general/test_focus_scrollchildframe.html
dom/tests/mochitest/general/test_focusrings.xul
dom/tests/mochitest/pointerlock/file_escapeKey.html
editor/libeditor/tests/browser_bug527935.js
editor/libeditor/tests/test_backspace_vs.html
editor/libeditor/tests/test_bug1094000.html
editor/libeditor/tests/test_bug1100966.html
editor/libeditor/tests/test_bug1109465.html
editor/libeditor/tests/test_bug1140105.html
editor/libeditor/tests/test_bug1154791.html
editor/libeditor/tests/test_bug1162952.html
editor/libeditor/tests/test_bug1248128.html
editor/libeditor/tests/test_bug1250010.html
editor/libeditor/tests/test_bug1257363.html
editor/libeditor/tests/test_bug1258085.html
editor/libeditor/tests/test_bug1270235.html
editor/libeditor/tests/test_bug1314790.html
editor/libeditor/tests/test_bug1315065.html
editor/libeditor/tests/test_bug1316302.html
editor/libeditor/tests/test_bug1318312.html
editor/libeditor/tests/test_bug1328023.html
editor/libeditor/tests/test_bug1330796.html
editor/libeditor/tests/test_bug1352799.html
editor/libeditor/tests/test_bug1361008.html
editor/libeditor/tests/test_bug1368544.html
editor/libeditor/tests/test_bug1385905.html
editor/libeditor/tests/test_bug1390562.html
editor/libeditor/tests/test_bug1394758.html
editor/libeditor/tests/test_bug1397412.xul
editor/libeditor/tests/test_bug1399722.html
editor/libeditor/tests/test_bug318065.html
editor/libeditor/tests/test_bug332636.html
editor/libeditor/tests/test_bug414526.html
editor/libeditor/tests/test_bug430392.html
editor/libeditor/tests/test_bug439808.html
editor/libeditor/tests/test_bug449243.html
editor/libeditor/tests/test_bug483651.html
editor/libeditor/tests/test_bug484181.html
editor/libeditor/tests/test_bug514156.html
editor/libeditor/tests/test_bug537046.html
editor/libeditor/tests/test_bug550434.html
editor/libeditor/tests/test_bug551704.html
editor/libeditor/tests/test_bug567213.html
editor/libeditor/tests/test_bug570144.html
editor/libeditor/tests/test_bug586662.html
editor/libeditor/tests/test_bug590554.html
editor/libeditor/tests/test_bug592592.html
editor/libeditor/tests/test_bug596333.html
editor/libeditor/tests/test_bug596506.html
editor/libeditor/tests/test_bug597331.html
editor/libeditor/tests/test_bug600570.html
editor/libeditor/tests/test_bug604532.html
editor/libeditor/tests/test_bug607584.html
editor/libeditor/tests/test_bug611182.html
editor/libeditor/tests/test_bug612447.html
editor/libeditor/tests/test_bug625452.html
editor/libeditor/tests/test_bug638596.html
editor/libeditor/tests/test_bug641466.html
editor/libeditor/tests/test_bug668599.html
editor/libeditor/tests/test_bug674861.html
editor/libeditor/tests/test_bug686203.html
editor/libeditor/tests/test_bug740784.html
editor/libeditor/tests/test_bug772796.html
editor/libeditor/tests/test_bug790475.html
editor/libeditor/tests/test_bug795785.html
editor/libeditor/tests/test_bug850043.html
editor/libeditor/tests/test_contenteditable_text_input_handling.html
editor/libeditor/tests/test_dom_input_event_on_texteditor.html
editor/libeditor/tests/test_htmleditor_keyevent_handling.html
editor/libeditor/tests/test_inline_style_cache.html
editor/libeditor/tests/test_texteditor_keyevent_handling.html
gfx/layers/apz/test/mochitest/helper_key_scroll.html
layout/base/tests/bug1109968-1.html
layout/base/tests/bug1109968-2.html
layout/base/tests/bug1123067-1.html
layout/base/tests/bug1123067-2.html
layout/base/tests/bug1123067-3.html
layout/base/tests/bug1123067-ref.html
layout/base/tests/bug1237236-1-ref.html
layout/base/tests/bug1237236-1.html
layout/base/tests/bug1237236-2-ref.html
layout/base/tests/bug1258308-1-ref.html
layout/base/tests/bug1258308-1.html
layout/base/tests/bug1258308-2-ref.html
layout/base/tests/bug1259949-1-ref.html
layout/base/tests/bug1259949-1.html
layout/base/tests/bug1259949-2-ref.html
layout/base/tests/bug1263288.html
layout/base/tests/bug1263357-1.html
layout/base/tests/bug1263357-2.html
layout/base/tests/bug1423331-2-ref.html
layout/base/tests/bug1423331-2.html
layout/base/tests/bug1423331-4.html
layout/base/tests/bug597519-1.html
layout/base/tests/bug632215-1.html
layout/base/tests/bug632215-2.html
layout/base/tests/bug633044-1.html
layout/base/tests/bug634406-1.html
layout/base/tests/bug644428-1.html
layout/base/tests/bug646382-1.html
layout/base/tests/bug646382-2.html
layout/base/tests/bug664087-1-ref.html
layout/base/tests/bug664087-1.html
layout/base/tests/bug664087-2-ref.html
layout/base/tests/bug664087-2.html
layout/base/tests/bug682712-1.html
layout/base/tests/bug746993-1.html
layout/base/tests/bug989012-1.html
layout/base/tests/bug989012-2.html
layout/base/tests/bug989012-3.html
layout/base/tests/chrome/test_bug551434.html
layout/base/tests/input-maxlength-invalid-change.html
layout/base/tests/input-maxlength-ui-invalid-change.html
layout/base/tests/input-maxlength-ui-valid-change.html
layout/base/tests/input-maxlength-valid-change.html
layout/base/tests/input-minlength-invalid-change.html
layout/base/tests/input-minlength-ui-invalid-change.html
layout/base/tests/input-minlength-ui-valid-change.html
layout/base/tests/input-minlength-valid-change.html
layout/base/tests/test_bug332655-1.html
layout/base/tests/test_bug332655-2.html
layout/base/tests/test_bug370436.html
layout/base/tests/test_bug423523.html
layout/base/tests/test_bug499538-1.html
layout/base/tests/test_bug582181-1.html
layout/base/tests/test_bug582181-2.html
layout/base/tests/test_bug644768.html
layout/base/tests/test_bug667512.html
layout/base/tests/test_scroll_snapping.html
layout/base/tests/textarea-maxlength-invalid-change.html
layout/base/tests/textarea-maxlength-ui-invalid-change.html
layout/base/tests/textarea-maxlength-ui-valid-change.html
layout/base/tests/textarea-maxlength-valid-change.html
layout/base/tests/textarea-minlength-invalid-change.html
layout/base/tests/textarea-minlength-ui-invalid-change.html
layout/base/tests/textarea-minlength-ui-valid-change.html
layout/base/tests/textarea-minlength-valid-change.html
layout/forms/test/test_bug1305282.html
layout/forms/test/test_bug1327129.html
layout/forms/test/test_bug346043.html
layout/forms/test/test_bug411236.html
layout/forms/test/test_bug534785.html
layout/forms/test/test_bug571352.html
layout/forms/test/test_bug672810.html
layout/forms/test/test_bug903715.html
layout/forms/test/test_bug935876.html
layout/forms/test/test_listcontrol_search.html
layout/generic/test/test_bug240933.html
layout/generic/test/test_bug288789.html
layout/generic/test/test_bug404872.html
layout/generic/test/test_bug424627.html
layout/generic/test/test_bug448860.html
layout/generic/test/test_bug468167.html
layout/generic/test/test_bug597333.html
layout/generic/test/test_bug632379.xul
layout/generic/test/test_bug756984.html
layout/generic/test/test_bug784410.html
layout/generic/test/test_bug791616.html
layout/generic/test/test_bug904810.html
layout/generic/test/test_bug970363.html
layout/generic/test/test_movement_by_characters.html
layout/style/test/chrome/test_display_mode.html
layout/style/test/chrome/test_display_mode_reflow.html
layout/style/test/test_flexbox_focus_order.html
layout/xul/test/browser_bug1163304.js
testing/mochitest/tests/Harness_sanity/test_sanity.html
testing/mochitest/tests/Harness_sanity/test_sanityEventUtils.html
toolkit/components/passwordmgr/test/browser/browser_formless_submit_chrome.js
toolkit/components/passwordmgr/test/browser/browser_notifications_2.js
toolkit/components/passwordmgr/test/chrome/subtst_privbrowsing_4.html
toolkit/components/passwordmgr/test/mochitest/test_autocomplete_https_upgrade.html
toolkit/components/passwordmgr/test/mochitest/test_autofocus_js.html
toolkit/components/passwordmgr/test/mochitest/test_basic_form_autocomplete.html
toolkit/components/passwordmgr/test/mochitest/test_case_differences.html
toolkit/components/passwordmgr/test/mochitest/test_insecure_form_field_autocomplete.html
toolkit/components/passwordmgr/test/mochitest/test_insecure_form_field_no_saved_login.html
toolkit/components/passwordmgr/test/mochitest/test_password_field_autocomplete.html
toolkit/components/satchel/test/test_bug_511615.html
toolkit/components/satchel/test/test_datalist_with_caching.html
toolkit/components/satchel/test/test_form_autocomplete.html
toolkit/components/satchel/test/test_form_autocomplete_with_list.html
toolkit/components/satchel/test/test_password_autocomplete.html
toolkit/components/satchel/test/test_popup_direction.html
toolkit/components/satchel/test/test_popup_enter_event.html
toolkit/content/tests/browser/browser_bug295977_autoscroll_overflow.js
toolkit/content/tests/chrome/findbar_window.xul
toolkit/content/tests/chrome/popup_trigger.js
toolkit/content/tests/chrome/test_arrowpanel.xul
toolkit/content/tests/chrome/test_autocomplete2.xul
toolkit/content/tests/chrome/test_autocomplete3.xul
toolkit/content/tests/chrome/test_autocomplete4.xul
toolkit/content/tests/chrome/test_autocomplete5.xul
toolkit/content/tests/chrome/test_autocomplete_emphasis.xul
toolkit/content/tests/chrome/test_autocomplete_placehold_last_complete.xul
toolkit/content/tests/chrome/test_autocomplete_with_composition_on_input.html
toolkit/content/tests/chrome/test_bug418874.xul
toolkit/content/tests/chrome/test_bug792324.xul
toolkit/content/tests/chrome/test_button.xul
toolkit/content/tests/chrome/test_closemenu_attribute.xul
toolkit/content/tests/chrome/test_colorpicker_popup.xul
toolkit/content/tests/chrome/test_dialogfocus.xul
toolkit/content/tests/chrome/test_focus_anons.xul
toolkit/content/tests/chrome/test_menulist_keynav.xul
toolkit/content/tests/chrome/test_panelfrommenu.xul
toolkit/content/tests/chrome/test_popup_keys.xul
toolkit/content/tests/chrome/test_tabindex.xul
toolkit/content/tests/chrome/test_textbox_number.xul
toolkit/content/tests/chrome/test_textbox_search.xul
toolkit/content/tests/chrome/window_panel_focus.xul
toolkit/content/tests/chrome/window_tooltip.xul
toolkit/content/tests/mochitest/test_autocomplete_change_after_focus.html
toolkit/content/tests/mochitest/test_bug1407085.html
toolkit/content/tests/widgets/test_contextmenu_menugroup.xul
toolkit/content/tests/widgets/test_videocontrols.html
toolkit/content/tests/widgets/test_videocontrols_keyhandler.html
toolkit/content/tests/widgets/window_menubar.xul
toolkit/mozapps/extensions/test/browser/browser_bug562797.js
toolkit/mozapps/extensions/test/browser/browser_file_xpi_no_process_switch.js
widget/tests/test_input_events_on_deactive_window.xul
widget/tests/window_composition_text_querycontent.xul
--- a/accessible/tests/browser/general/browser_test_urlbar.js
+++ b/accessible/tests/browser/general/browser_test_urlbar.js
@@ -10,17 +10,17 @@ add_task(async function testAutocomplete
   let tab = await openNewTab("data:text/html;charset=utf-8,");
   let accService = await initAccessibilityService();
 
   info("Opening the URL bar and entering a key to show the PopupAutoCompleteRichResult panel");
   let urlbar = document.getElementById("urlbar");
   urlbar.focus();
   let urlbarPopup = document.getElementById("PopupAutoCompleteRichResult");
   let shown = BrowserTestUtils.waitForEvent(urlbarPopup, "popupshown");
-  EventUtils.synthesizeKey("a", {});
+  EventUtils.sendString("a");
   await shown;
 
   info("Waiting for accessibility to be created for the richlistbox");
   let richlistbox = document.getAnonymousElementByAttribute(urlbarPopup, "anonid", "richlistbox");
   await BrowserTestUtils.waitForCondition(() => accService.getAccessibleFor(richlistbox));
 
   info("Confirming that the special case is handled in XULListboxAccessible");
   let accessible = accService.getAccessibleFor(richlistbox);
--- a/accessible/tests/mochitest/events.js
+++ b/accessible/tests/mochitest/events.js
@@ -1400,17 +1400,17 @@ function openCombobox(aComboboxID) {
  * Close combobox, autocomplete and etc popup, check expandable states.
  */
 function closeCombobox(aComboboxID) {
   this.eventSeq = [
     new stateChangeChecker(STATE_EXPANDED, false, false, aComboboxID)
   ];
 
   this.invoke = function closeCombobox_invoke() {
-    synthesizeKey("VK_ESCAPE", { });
+    synthesizeKey("KEY_Escape");
   };
 
   this.getID = function closeCombobox_getID() {
     return "close combobox " + prettyName(aComboboxID);
   };
 }
 
 
@@ -1454,22 +1454,22 @@ function moveToLineEnd(aID, aCaretOffset
 
 /**
  * Move the caret to the end of previous line if any.
  */
 function moveToPrevLineEnd(aID, aCaretOffset) {
   this.__proto__ = new synthAction(aID, new caretMoveChecker(aCaretOffset, aID));
 
   this.invoke = function moveToPrevLineEnd_invoke() {
-    synthesizeKey("VK_UP", { });
+    synthesizeKey("KEY_ArrowUp");
 
     if (MAC)
-      synthesizeKey("VK_RIGHT", { metaKey: true });
+      synthesizeKey("Key_ArrowRight", {metaKey: true});
     else
-      synthesizeKey("VK_END", { });
+      synthesizeKey("KEY_End");
   };
 
   this.getID = function moveToPrevLineEnd_getID() {
     return "move to previous line end in " + prettyName(aID);
   };
 }
 
 /**
--- a/accessible/tests/mochitest/events/test_contextmenu.html
+++ b/accessible/tests/mochitest/events/test_contextmenu.html
@@ -41,32 +41,32 @@
     }
 
     function selectMenuItem() {
       this.eventSeq = [
         new invokerChecker(EVENT_FOCUS, getFocusedMenuItem)
       ];
 
       this.invoke = function selectMenuItem_invoke() {
-        synthesizeKey("VK_DOWN", { });
+        synthesizeKey("KEY_ArrowDown");
       };
 
       this.getID = function selectMenuItem_getID() {
         return "select first menuitem";
       };
     }
 
     function closeContextMenu(aID) {
       this.eventSeq = [
         new invokerChecker(EVENT_MENUPOPUP_END,
                            getAccessible(getContextMenuNode()))
       ];
 
       this.invoke = function closeContextMenu_invoke() {
-        synthesizeKey("VK_ESCAPE", { });
+        synthesizeKey("KEY_Escape");
       };
 
       this.getID = function closeContextMenu_getID() {
         return "close context menu";
       };
     }
 
     function getContextMenuNode() {
--- a/accessible/tests/mochitest/events/test_focus_autocomplete.xul
+++ b/accessible/tests/mochitest/events/test_focus_autocomplete.xul
@@ -122,34 +122,34 @@
     }
 
     function removeChar(aID, aCheckerOrEventSeq)
     {
       this.__proto__ = new synthAction(aID, aCheckerOrEventSeq);
 
       this.invoke = function removeChar_invoke()
       {
-        synthesizeKey("VK_LEFT", { shiftKey: true });
-        synthesizeKey("VK_DELETE", {});
+        synthesizeKey("KEY_ArrowLeft", {shiftKey: true});
+        synthesizeKey("KEY_Delete");
       }
 
       this.getID = function removeChar_getID()
       {
         return "remove char on " + prettyName(aID);
       }
     }
 
     function replaceOnChar(aID, aChar, aCheckerOrEventSeq)
     {
       this.__proto__ = new synthAction(aID, aCheckerOrEventSeq);
 
       this.invoke = function replaceOnChar_invoke()
       {
         this.DOMNode.select();
-        synthesizeKey(aChar, {});
+        sendString(aChar);
       }
 
       this.getID = function replaceOnChar_getID()
       {
         return "replace on char '" + aChar + "' for" + prettyName(aID);
       }
     }
 
--- a/accessible/tests/mochitest/events/test_fromUserInput.html
+++ b/accessible/tests/mochitest/events/test_fromUserInput.html
@@ -27,17 +27,17 @@
       this.eventSeq = [
         new textChangeChecker(aID, aStart, aEnd, aText, false, aFromUser)
       ];
 
       this.invoke = function removeTextFromInput_invoke() {
         this.DOMNode.focus();
         this.DOMNode.setSelectionRange(aStart, aEnd);
 
-        synthesizeKey("VK_DELETE", {});
+        synthesizeKey("KEY_Delete");
       };
 
       this.getID = function removeTextFromInput_getID() {
         return "Remove text from " + aStart + " to " + aEnd + " for " +
           prettyName(aID);
       };
     }
 
@@ -55,17 +55,17 @@
         this.DOMNode.focus();
         this.textNode = getNode(aID).firstChild;
         var selection = window.getSelection();
         var range = document.createRange();
         range.setStart(this.textNode, aStart);
         range.setEnd(this.textNode, aEnd);
         selection.addRange(range);
 
-        synthesizeKey("VK_DELETE", {});
+        synthesizeKey("KEY_Delete");
       };
 
       this.getID = function removeTextFromContentEditable_getID() {
         return "Remove text from " + aStart + " to " + aEnd + " for " +
           prettyName(aID);
       };
     }
 
--- a/accessible/tests/mochitest/events/test_menu.xul
+++ b/accessible/tests/mochitest/events/test_menu.xul
@@ -22,17 +22,17 @@
       this.eventSeq = [
         new invokerChecker(EVENT_MENU_START, getNode("menubar")),
         new invokerChecker(EVENT_MENUPOPUP_START, getNode("menupopup-file"))
         // new invokerChecker(EVENT_FOCUS, getNode("menuitem-newtab")) intermitent failure
       ];
 
       this.invoke = function openFileMenu_invoke()
       {
-        synthesizeKey("F", { altKey: true, shiftKey: true });
+        synthesizeKey("F", {altKey: true, shiftKey: true});
       }
 
       this.getID = function openFileMenu_getID()
       {
         return "open file menu by alt+F press";
       }
     }
 
@@ -41,17 +41,17 @@
       this.eventSeq = [
         new invokerChecker(EVENT_MENUPOPUP_END, getNode("menupopup-file")),
         new invokerChecker(EVENT_MENUPOPUP_START, getNode("menupopup-edit"))
         // new invokerChecker(EVENT_FOCUS, getNode("menuitem-undo")) intermitent failure
       ];
 
       this.invoke = function openEditMenu_invoke()
       {
-        synthesizeKey("VK_RIGHT", { });
+        synthesizeKey("KEY_ArrowRight");
       }
 
       this.getID = function openEditMenu_getID()
       {
         return "open edit menu by lef arrow press";
       }
     }
 
@@ -60,17 +60,17 @@
       this.eventSeq = [
         //new invokerChecker(EVENT_FOCUS, document), intermitent failure
         new invokerChecker(EVENT_MENUPOPUP_END, getNode("menupopup-edit")),
         new invokerChecker(EVENT_MENU_END, getNode("menubar"))
       ];
 
       this.invoke = function closeEditMenu_invoke()
       {
-        synthesizeKey("VK_ESCAPE", { });
+        synthesizeKey("KEY_Escape");
       }
 
       this.getID = function closeEditMenu_getID()
       {
         return "close edit menu, leave menubar";
       }
     }
 
@@ -78,34 +78,34 @@
     {
       this.eventSeq = [
         new invokerChecker(EVENT_MENU_START, getNode("menubar"))
         // new invokerChecker(EVENT_FOCUS, getNode("menuitem-file")) //intermitent failure
       ];
 
       this.invoke = function focusFileMenu_invoke()
       {
-        synthesizeKey("VK_ALT", { });
+        synthesizeKey("KEY_Alt");
       }
 
       this.getID = function focusFileMenu_getID()
       {
         return "activate menubar, focus file menu (atl press)";
       }
     }
 
     function focusEditMenu()
     {
       this.eventSeq = [
         new invokerChecker(EVENT_FOCUS, getNode("menuitem-edit"))
       ];
 
       this.invoke = function focusEditMenu_invoke()
       {
-        synthesizeKey("VK_RIGHT", { });
+        synthesizeKey("KEY_ArrowRight");
       }
 
       this.getID = function focusEditMenu_getID()
       {
         return "focus edit menu";
       }
     }
 
@@ -113,17 +113,17 @@
     {
       this.eventSeq = [
         //new invokerChecker(EVENT_FOCUS, document), intermitent failure
         new invokerChecker(EVENT_MENU_END, getNode("menubar"))
       ];
 
       this.invoke = function leaveMenubar_invoke()
       {
-        synthesizeKey("VK_ESCAPE", { });
+        synthesizeKey("KEY_Escape");
       }
 
       this.getID = function leaveMenubar_getID()
       {
         return "leave menubar";
       }
     }
 
--- a/accessible/tests/mochitest/events/test_text.html
+++ b/accessible/tests/mochitest/events/test_text.html
@@ -164,17 +164,17 @@
 
       this.eventSeq.push(new invokerChecker(EVENT_TEXT_VALUE_CHANGE,
                                             this.DOMNode));
 
       this.invoke = function removeTextFromInput_invoke() {
         this.DOMNode.focus();
         this.DOMNode.setSelectionRange(aStart, aEnd);
 
-        synthesizeKey("VK_DELETE", {});
+        synthesizeKey("KEY_Delete");
       };
 
       this.getID = function removeTextFromInput_getID() {
         return "Remove text from " + aStart + " to " + aEnd + " for " +
           prettyName(aID);
       };
     }
 
@@ -184,17 +184,17 @@
     function insertTextIntoInput(aID, aStart, aEnd, aText) {
       this.__proto__ = new textInsertInvoker(aID, aStart, aEnd, aText);
 
       this.eventSeq.push(new invokerChecker(EVENT_TEXT_VALUE_CHANGE,
                                             this.DOMNode));
 
       this.invoke = function insertTextIntoInput_invoke() {
         this.DOMNode.focus();
-        synthesizeKey("a", {});
+        sendString("a");
       };
 
       this.getID = function insertTextIntoInput_getID() {
         return "Insert text to " + aStart + " for " + prettyName(aID);
       };
     }
 
     /**
@@ -207,17 +207,17 @@
         this.DOMNode.focus();
 
         var selection = window.getSelection();
         var range = document.createRange();
         range.setStart(this.textNode, aStart);
         range.setEnd(this.textNode, aEnd);
         selection.addRange(range);
 
-        synthesizeKey("VK_DELETE", {});
+        synthesizeKey("KEY_Delete");
       };
 
       this.getID = function removeTextFromEditable_getID() {
         return "Remove text from " + aStart + " to " + aEnd + " for " +
           prettyName(aID);
       };
 
       this.textNode = getNode(aTextNode);
--- a/accessible/tests/mochitest/states/test_inputs.html
+++ b/accessible/tests/mochitest/states/test_inputs.html
@@ -102,17 +102,17 @@
     }
 
     // //////////////////////////////////////////////////////////////////////////
     // 'invalid' state
     // (per spec, min/maxlength validity is affected by interactive edits)
     var mininp = document.getElementById("minlength");
     mininp.focus();
     mininp.setSelectionRange(mininp.value.length, mininp.value.length);
-    synthesizeKey("VK_BACK_SPACE", {});
+    synthesizeKey("KEY_Backspace");
     ok(!mininp.validity.valid,
        "input should be invalid after interactive edits");
     testStates(mininp, STATE_INVALID);
     // inputs currently cannot be made longer than maxlength interactively,
     // so we're not testing that case.
 
     // //////////////////////////////////////////////////////////////////////////
     // autocomplete states
--- a/accessible/tests/mochitest/treeupdate/test_contextmenu.xul
+++ b/accessible/tests/mochitest/treeupdate/test_contextmenu.xul
@@ -47,34 +47,34 @@
     function selectNextMenuItem(aID)
     {
       this.eventSeq = [
         new invokerChecker(EVENT_FOCUS, getNode(aID))
       ];
 
       this.invoke = function selectMenuItem_invoke()
       {
-        synthesizeKey("VK_DOWN", { });
+        synthesizeKey("KEY_ArrowDown");
       }
 
       this.getID = function selectMenuItem_getID()
       {
         return "select menuitem " + prettyName(aID);
       }
     }
     
     function openSubMenu(aSubMenuID, aItemID, aMenuID, aTree)
     {
       this.eventSeq = [
         new invokerChecker(EVENT_FOCUS, getNode(aItemID)),
       ];
 
       this.invoke = function openSubMenu_invoke()
       {
-        synthesizeKey("VK_RETURN", { });
+        synthesizeKey("KEY_Enter");
       }
 
       this.finalCheck = function openSubMenu_finalCheck(aEvent)
       {
         testAccessibleTree(aMenuID, aTree);
       }
 
       this.getID = function openSubMenu_getID()
@@ -86,34 +86,34 @@
     function closeSubMenu(aSubMenuID, aItemID)
     {
       this.eventSeq = [
         new invokerChecker(EVENT_FOCUS, getNode(aItemID)),
       ];
 
       this.invoke = function closeSubMenu_invoke()
       {
-        synthesizeKey("VK_ESCAPE", { });
+        synthesizeKey("KEY_Escape");
       }
 
       this.getID = function closeSubMenu_getID()
       {
         return "close submenu " + prettyName(aSubMenuID) + " focusing item " + prettyName(aItemID);
       }
     }
 
     function closeMenu(aID)
     {
       this.eventSeq = [
         new invokerChecker(EVENT_MENUPOPUP_END, getNode(aID))
       ];
 
       this.invoke = function closeMenu_invoke()
       {
-        synthesizeKey("VK_ESCAPE", { });
+        synthesizeKey("KEY_Escape");
       }
 
       this.getID = function closeMenu_getID()
       {
         return "close menu " + prettyName(aID);
       }
     }
 
--- a/accessible/tests/mochitest/treeupdate/test_menubutton.xul
+++ b/accessible/tests/mochitest/treeupdate/test_menubutton.xul
@@ -50,17 +50,17 @@
           { PUSHBUTTON: [
             { MENUPOPUP: [
               { role: menuItemRole, children: [ ] },
               { role: menuItemRole, children: [ ] }
             ] }
           ] };
         testAccessibleTree(this.button, tree);
 
-        synthesizeKey("VK_ESCAPE", { });
+        synthesizeKey("KEY_Escape");
       }
 
       this.getID = function openMenu_getID()
       {
         return "open menu of the button " + prettyName(aButtonID);
       }
     }
 
--- a/browser/base/content/test/forms/browser_selectpopup.js
+++ b/browser/base/content/test/forms/browser_selectpopup.js
@@ -139,36 +139,36 @@ async function doSelectTests(contentType
   let isWindows = navigator.platform.includes("Win");
 
   is(menulist.selectedIndex, 1, "Initial selection");
   is(selectPopup.firstChild.localName, "menucaption", "optgroup is caption");
   is(selectPopup.firstChild.getAttribute("label"), "First Group", "optgroup label");
   is(selectPopup.childNodes[1].localName, "menuitem", "option is menuitem");
   is(selectPopup.childNodes[1].getAttribute("label"), "One", "option label");
 
-  EventUtils.synthesizeKey("KEY_ArrowDown", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   is(menulist.menuBoxObject.activeChild, menulist.getItemAtIndex(2), "Select item 2");
   is(menulist.selectedIndex, isWindows ? 2 : 1, "Select item 2 selectedIndex");
 
-  EventUtils.synthesizeKey("KEY_ArrowDown", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   is(menulist.menuBoxObject.activeChild, menulist.getItemAtIndex(3), "Select item 3");
   is(menulist.selectedIndex, isWindows ? 3 : 1, "Select item 3 selectedIndex");
 
-  EventUtils.synthesizeKey("KEY_ArrowDown", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
 
   // On Windows, one can navigate on disabled menuitems
   is(menulist.menuBoxObject.activeChild, menulist.getItemAtIndex(9),
      "Skip optgroup header and disabled items select item 7");
   is(menulist.selectedIndex, isWindows ? 9 : 1, "Select or skip disabled item selectedIndex");
 
   for (let i = 0; i < 10; i++) {
     is(menulist.getItemAtIndex(i).disabled, i >= 4 && i <= 7, "item " + i + " disabled");
   }
 
-  EventUtils.synthesizeKey("KEY_ArrowUp", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   is(menulist.menuBoxObject.activeChild, menulist.getItemAtIndex(3), "Select item 3 again");
   is(menulist.selectedIndex, isWindows ? 3 : 1, "Select item 3 selectedIndex");
 
   is((await getInputEvents()), 0, "Before closed - number of input events");
   is((await getChangeEvents()), 0, "Before closed - number of change events");
   is((await getClickEvents()), 0, "Before closed - number of click events");
 
   EventUtils.synthesizeKey("a", { accelKey: true });
@@ -177,46 +177,46 @@ async function doSelectTests(contentType
       "Select all while popup is open");
   });
 
   // Backspace should not go back
   let handleKeyPress = function(event) {
     ok(false, "Should not get keypress event");
   };
   window.addEventListener("keypress", handleKeyPress);
-  EventUtils.synthesizeKey("VK_BACK_SPACE", { });
+  EventUtils.synthesizeKey("KEY_Backspace");
   window.removeEventListener("keypress", handleKeyPress);
 
   await hideSelectPopup(selectPopup);
 
   is(menulist.selectedIndex, 3, "Item 3 still selected");
   is((await getInputEvents()), 1, "After closed - number of input events");
   is((await getChangeEvents()), 1, "After closed - number of change events");
   is((await getClickEvents()), 0, "After closed - number of click events");
 
   // Opening and closing the popup without changing the value should not fire a change event.
   await openSelectPopup(selectPopup, "click");
   await hideSelectPopup(selectPopup, "escape");
   is((await getInputEvents()), 1, "Open and close with no change - number of input events");
   is((await getChangeEvents()), 1, "Open and close with no change - number of change events");
   is((await getClickEvents()), 1, "Open and close with no change - number of click events");
-  EventUtils.synthesizeKey("VK_TAB", { });
-  EventUtils.synthesizeKey("VK_TAB", { shiftKey: true });
+  EventUtils.synthesizeKey("KEY_Tab");
+  EventUtils.synthesizeKey("KEY_Tab", {shiftKey: true});
   is((await getInputEvents()), 1, "Tab away from select with no change - number of input events");
   is((await getChangeEvents()), 1, "Tab away from select with no change - number of change events");
   is((await getClickEvents()), 1, "Tab away from select with no change - number of click events");
 
   await openSelectPopup(selectPopup, "click");
-  EventUtils.synthesizeKey("KEY_ArrowDown", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   await hideSelectPopup(selectPopup, "escape");
   is((await getInputEvents()), isWindows ? 2 : 1, "Open and close with change - number of input events");
   is((await getChangeEvents()), isWindows ? 2 : 1, "Open and close with change - number of change events");
   is((await getClickEvents()), 2, "Open and close with change - number of click events");
-  EventUtils.synthesizeKey("VK_TAB", { });
-  EventUtils.synthesizeKey("VK_TAB", { shiftKey: true });
+  EventUtils.synthesizeKey("KEY_Tab");
+  EventUtils.synthesizeKey("KEY_Tab", {shiftKey: true});
   is((await getInputEvents()), isWindows ? 2 : 1, "Tab away from select with change - number of input events");
   is((await getChangeEvents()), isWindows ? 2 : 1, "Tab away from select with change - number of change events");
   is((await getClickEvents()), 2, "Tab away from select with change - number of click events");
 
   is(selectPopup.lastChild.previousSibling.label, "Seven", "Spaces collapsed");
   is(selectPopup.lastChild.label, "\xA0\xA0Eight\xA0\xA0", "Non-breaking spaces not collapsed");
 
   await BrowserTestUtils.removeTab(tab);
@@ -430,17 +430,17 @@ add_task(async function test_event_order
 
           let select = content.document.getElementById(contentMode == "enter" ? "one" : "two");
           for (let event of ["input", "change", "mousedown", "mouseup", "click"]) {
             select.addEventListener(event, onEvent);
           }
         });
       });
 
-      EventUtils.synthesizeKey("KEY_ArrowDown", {});
+      EventUtils.synthesizeKey("KEY_ArrowDown");
       await hideSelectPopup(selectPopup, mode);
       await eventsPromise;
     }
   });
 });
 
 async function performLargePopupTests(win) {
   let browser = win.gBrowser.selectedBrowser;
@@ -632,32 +632,32 @@ async function performSelectSearchTests(
   is(selectPopup.childNodes[2].hidden, true, "First option should be hidden");
   is(selectPopup.childNodes[3].hidden, true, "Second option should be hidden");
   is(selectPopup.childNodes[4].hidden, false, "Third option should be visible");
 
   EventUtils.synthesizeKey("Z", {}, win);
   is(selectPopup.childNodes[4].hidden, true, "Third option should be hidden");
   is(selectPopup.childNodes[1].hidden, true, "First group header should be hidden");
 
-  EventUtils.synthesizeKey("VK_BACK_SPACE", {}, win);
+  EventUtils.synthesizeKey("KEY_Backspace", {}, win);
   is(selectPopup.childNodes[4].hidden, false, "Third option should be visible");
 
-  EventUtils.synthesizeKey("VK_BACK_SPACE", {}, win);
+  EventUtils.synthesizeKey("KEY_Backspace", {}, win);
   is(selectPopup.childNodes[5].hidden, false, "Second group header should be visible");
 
-  EventUtils.synthesizeKey("VK_BACK_SPACE", {}, win);
+  EventUtils.synthesizeKey("KEY_Backspace", {}, win);
   EventUtils.synthesizeKey("O", {}, win);
   EventUtils.synthesizeKey("5", {}, win);
   is(selectPopup.childNodes[5].hidden, false, "Second group header should be visible");
   is(selectPopup.childNodes[1].hidden, true, "First group header should be hidden");
 
-  EventUtils.synthesizeKey("VK_BACK_SPACE", {}, win);
+  EventUtils.synthesizeKey("KEY_Backspace", {}, win);
   is(selectPopup.childNodes[1].hidden, false, "First group header should be shown");
 
-  EventUtils.synthesizeKey("VK_BACK_SPACE", {}, win);
+  EventUtils.synthesizeKey("KEY_Backspace", {}, win);
   is(selectPopup.childNodes[8].hidden, true, "Option hidden by content should remain hidden");
 
   await hideSelectPopup(selectPopup, "escape", win);
 }
 
 // This test checks the functionality of search in select elements with groups
 // and a large number of options.
 add_task(async function test_select_search() {
--- a/browser/base/content/test/forms/browser_selectpopup_colors.js
+++ b/browser/base/content/test/forms/browser_selectpopup_colors.js
@@ -198,17 +198,17 @@ function testOptionColors(index, item, m
     if (color.toLowerCase().includes("color") &&
         !expected[color].startsWith("rgb")) {
       expected[color] = getSystemColor(expected[color]);
     }
   }
 
   // Press Down to move the selected item to the next item in the
   // list and check the colors of this item when it's not selected.
-  EventUtils.synthesizeKey("KEY_ArrowDown", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
 
   if (expected.end) {
     return;
   }
 
   if (expected.unstyled) {
     ok(!item.hasAttribute("customoptionstyling"),
       `Item ${index} should not have any custom option styling`);
--- a/browser/base/content/test/general/browser_bug432599.js
+++ b/browser/base/content/test/general/browser_bug432599.js
@@ -1,33 +1,33 @@
 /* eslint-disable mozilla/no-arbitrary-setTimeout */
 function invokeUsingCtrlD(phase) {
   switch (phase) {
   case 1:
-    EventUtils.synthesizeKey("d", { accelKey: true });
+    EventUtils.synthesizeKey("d", {accelKey: true});
     break;
   case 2:
   case 4:
-    EventUtils.synthesizeKey("VK_ESCAPE", {});
+    EventUtils.synthesizeKey("KEY_Escape");
     break;
   case 3:
-    EventUtils.synthesizeKey("d", { accelKey: true });
-    EventUtils.synthesizeKey("d", { accelKey: true });
+    EventUtils.synthesizeKey("d", {accelKey: true});
+    EventUtils.synthesizeKey("d", {accelKey: true});
     break;
   }
 }
 
 function invokeUsingStarButton(phase) {
   switch (phase) {
   case 1:
      EventUtils.synthesizeMouseAtCenter(BookmarkingUI.star, {});
     break;
   case 2:
   case 4:
-    EventUtils.synthesizeKey("VK_ESCAPE", {});
+    EventUtils.synthesizeKey("KEY_Escape");
     break;
   case 3:
      EventUtils.synthesizeMouseAtCenter(BookmarkingUI.star,
                                         { clickCount: 2 });
     break;
   }
 }
 
--- a/browser/base/content/test/general/browser_bug553455.js
+++ b/browser/base/content/test/general/browser_bug553455.js
@@ -689,17 +689,17 @@ async function test_tabNavigate() {
 async function test_urlBar() {
   let progressPromise = waitForProgressNotification();
   let dialogPromise = waitForInstallDialog();
 
   gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, "about:blank");
   await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
   gURLBar.value = TESTROOT + "amosigned.xpi";
   gURLBar.focus();
-  EventUtils.synthesizeKey("VK_RETURN", {});
+  EventUtils.synthesizeKey("KEY_Enter");
 
   await progressPromise;
   let installDialog = await dialogPromise;
 
   let notificationPromise = waitForNotification("addon-install-restart");
   acceptInstallDialog(installDialog);
   let panel = await notificationPromise;
 
--- a/browser/base/content/test/general/browser_bug555767.js
+++ b/browser/base/content/test/general/browser_bug555767.js
@@ -44,10 +44,10 @@
         tabSelected = true;
       }
 
       // Add the TabClose, TabSelect event listeners before we press enter
       gBrowser.tabContainer.addEventListener("TabClose", onTabClose);
       gBrowser.tabContainer.addEventListener("TabSelect", onTabSelect);
 
       // Press enter!
-      EventUtils.synthesizeKey("VK_RETURN", {});
+      EventUtils.synthesizeKey("KEY_Enter");
     });
--- a/browser/base/content/test/general/browser_domFullscreen_fullscreenMode.js
+++ b/browser/base/content/test/general/browser_domFullscreen_fullscreenMode.js
@@ -123,24 +123,24 @@ var gTests = [
     exitFunc: () => {
       gMessageManager.sendAsyncMessage("Test:ExitFullscreen");
     }
   },
   {
     desc: "escape key",
     affectsFullscreenMode: false,
     exitFunc: () => {
-      executeSoon(() => EventUtils.synthesizeKey("VK_ESCAPE", {}));
+      executeSoon(() => EventUtils.synthesizeKey("KEY_Escape"));
     }
   },
   {
     desc: "F11 key",
     affectsFullscreenMode: true,
     exitFunc() {
-      executeSoon(() => EventUtils.synthesizeKey("VK_F11", {}));
+      executeSoon(() => EventUtils.synthesizeKey("KEY_F11"));
     }
   }
 ];
 
 function checkState(expectedStates, contentStates) {
   is(contentStates.inDOMFullscreen, expectedStates.inDOMFullscreen,
      "The DOM fullscreen state of the content should match");
   // TODO window.fullScreen is not updated as soon as the fullscreen
--- a/browser/base/content/test/general/browser_focusonkeydown.js
+++ b/browser/base/content/test/general/browser_focusonkeydown.js
@@ -10,14 +10,14 @@ add_task(async function() {
       keyUps++;
     }
   }, {capture: true, once: true});
 
   gURLBar.addEventListener("keydown", function(event) {
     gBrowser.selectedBrowser.focus();
   }, {capture: true, once: true});
 
-  EventUtils.synthesizeKey("v", { });
+  EventUtils.sendString("v");
 
   is(keyUps, 1, "Key up fired at url bar");
 
   gBrowser.removeCurrentTab();
 });
--- a/browser/base/content/test/general/browser_keywordBookmarklets.js
+++ b/browser/base/content/test/general/browser_keywordBookmarklets.js
@@ -19,17 +19,17 @@ add_task(async function test_keyword_boo
   let originalPrincipal = gBrowser.contentPrincipal;
   let originalPrincipalURI = await getPrincipalURI(tab.linkedBrowser);
 
   await PlacesUtils.keywords.insert({ keyword: "bm", url: "javascript:'1';" });
 
   // Enter bookmarklet keyword in the URL bar
   gURLBar.value = "bm";
   gURLBar.focus();
-  EventUtils.synthesizeKey("VK_RETURN", {});
+  EventUtils.synthesizeKey("KEY_Enter");
 
   await BrowserTestUtils.waitForContentEvent(gBrowser.selectedBrowser, "pageshow");
 
   let newPrincipalURI = await getPrincipalURI(tab.linkedBrowser);
   is(newPrincipalURI, originalPrincipalURI, "content has the same principal");
 
   // In e10s, null principals don't round-trip so the same null principal sent
   // from the child will be a new null principal. Verify that this is the
--- a/browser/base/content/test/general/browser_keywordSearch.js
+++ b/browser/base/content/test/general/browser_keywordSearch.js
@@ -114,10 +114,10 @@ function nextTest() {
 }
 
 function doTest() {
   info("Running test: " + gCurrTest.name);
 
   // Simulate a user entering search terms
   gURLBar.value = gCurrTest.testText;
   gURLBar.focus();
-  EventUtils.synthesizeKey("VK_RETURN", {});
+  EventUtils.synthesizeKey("KEY_Enter");
 }
--- a/browser/base/content/test/general/browser_keywordSearch_postData.js
+++ b/browser/base/content/test/general/browser_keywordSearch_postData.js
@@ -73,17 +73,17 @@ function doTest() {
     let needle = "searchterms=" + gCurrTest.expectText;
     is(loadedText, needle, "The query POST data should be returned in the response");
     nextTest();
   });
 
   // Simulate a user entering search terms
   gURLBar.value = gCurrTest.testText;
   gURLBar.focus();
-  EventUtils.synthesizeKey("VK_RETURN", {});
+  EventUtils.synthesizeKey("KEY_Enter");
 }
 
 
 function waitForLoad(cb) {
   let browser = gBrowser.selectedBrowser;
   function wantLoad(url) {
     return url != "about:blank";
   }
--- a/browser/base/content/test/general/browser_printpreview.js
+++ b/browser/base/content/test/general/browser_printpreview.js
@@ -16,35 +16,35 @@ function test() {
   });
 }
 
 function tidyUp() {
   BrowserTestUtils.removeTab(ourTab).then(finish);
 }
 
 function testClosePrintPreviewWithAccessKey() {
-  EventUtils.synthesizeKey("c", { altKey: true });
+  EventUtils.synthesizeKey("c", {altKey: true});
   checkPrintPreviewClosed(function(aSucceeded) {
     ok(aSucceeded,
        "print preview mode should be finished by access key");
     openPrintPreview(testClosePrintPreviewWithEscKey);
   });
 }
 
 function testClosePrintPreviewWithEscKey() {
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   checkPrintPreviewClosed(function(aSucceeded) {
     ok(aSucceeded,
        "print preview mode should be finished by Esc key press");
     openPrintPreview(testClosePrintPreviewWithClosingWindowShortcutKey);
   });
 }
 
 function testClosePrintPreviewWithClosingWindowShortcutKey() {
-  EventUtils.synthesizeKey("w", { accelKey: true });
+  EventUtils.synthesizeKey("w", {accelKey: true});
   checkPrintPreviewClosed(function(aSucceeded) {
     ok(aSucceeded,
        "print preview mode should be finished by closing window shortcut key");
     tidyUp();
   });
 }
 
 function openPrintPreview(aCallback) {
--- a/browser/base/content/test/general/browser_tabfocus.js
+++ b/browser/base/content/test/general/browser_tabfocus.js
@@ -339,26 +339,26 @@ add_task(async function() {
 
   // Document navigation with F6 does not yet work in mutli-process browsers.
   if (!gMultiProcessBrowser) {
     gURLBar.focus();
     actualEvents = new EventStore();
     _lastfocus = "urlbar";
     _lastfocuswindow = "main-window";
 
-    await expectFocusShift(() => EventUtils.synthesizeKey("VK_F6", { }),
+    await expectFocusShift(() => EventUtils.synthesizeKey("KEY_F6"),
                            "window1", "html1",
                            true, "switch document forward with f6");
 
-    EventUtils.synthesizeKey("VK_F6", { });
+    EventUtils.synthesizeKey("KEY_F6");
     is(fm.focusedWindow, window, "switch document forward again with f6");
 
     browser1.style.MozUserFocus = "ignore";
     browser1.clientWidth;
-    EventUtils.synthesizeKey("VK_F6", { });
+    EventUtils.synthesizeKey("KEY_F6");
     is(fm.focusedWindow, window, "switch document forward again with f6 when browser non-focusable");
 
     browser1.style.MozUserFocus = "normal";
     browser1.clientWidth;
   }
 
   window.removeEventListener("focus", _browser_tabfocus_test_eventOccured, true);
   window.removeEventListener("blur", _browser_tabfocus_test_eventOccured, true);
--- a/browser/base/content/test/general/browser_visibleFindSelection.js
+++ b/browser/base/content/test/general/browser_visibleFindSelection.js
@@ -6,28 +6,26 @@ add_task(async function() {
   let tab = gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
 
   await promiseTabLoadEvent(tab, "data:text/html;charset=utf-8," + escape(childContent));
   await SimpleTest.promiseFocus(gBrowser.selectedBrowser);
 
   let remote = gBrowser.selectedBrowser.isRemoteBrowser;
 
   let findBarOpenPromise = promiseWaitForEvent(gBrowser, "findbaropen");
-  EventUtils.synthesizeKey("f", { accelKey: true });
+  EventUtils.synthesizeKey("f", {accelKey: true});
   await findBarOpenPromise;
 
   ok(gFindBarInitialized, "find bar is now initialized");
 
   // Finds the div in the green box.
   let scrollPromise = remote ?
     BrowserTestUtils.waitForContentEvent(gBrowser.selectedBrowser, "scroll") :
     BrowserTestUtils.waitForEvent(gBrowser, "scroll");
-  EventUtils.synthesizeKey("d", {});
-  EventUtils.synthesizeKey("i", {});
-  EventUtils.synthesizeKey("v", {});
+  EventUtils.sendString("div");
   await scrollPromise;
 
   // Wait for one paint to ensure we've processed the previous key events and scrolling.
   await ContentTask.spawn(gBrowser.selectedBrowser, null, async function() {
     return new Promise(
       resolve => {
         content.requestAnimationFrame(() => {
           setTimeout(resolve, 0);
@@ -35,24 +33,24 @@ add_task(async function() {
       }
     );
   });
 
   // Finds the div in the red box.
   scrollPromise = remote ?
     BrowserTestUtils.waitForContentEvent(gBrowser.selectedBrowser, "scroll") :
     BrowserTestUtils.waitForEvent(gBrowser, "scroll");
-  EventUtils.synthesizeKey("g", { accelKey: true });
+  EventUtils.synthesizeKey("g", {accelKey: true});
   await scrollPromise;
 
   await ContentTask.spawn(gBrowser.selectedBrowser, null, async function() {
     Assert.ok(content.document.getElementById("s").getBoundingClientRect().left >= 0,
       "scroll should include find result");
   });
 
   // clear the find bar
-  EventUtils.synthesizeKey("a", { accelKey: true });
-  EventUtils.synthesizeKey("VK_DELETE", { });
+  EventUtils.synthesizeKey("a", {accelKey: true});
+  EventUtils.synthesizeKey("KEY_Delete");
 
   gFindBar.close();
   gBrowser.removeCurrentTab();
 });
 
--- a/browser/base/content/test/general/browser_zbug569342.js
+++ b/browser/base/content/test/general/browser_zbug569342.js
@@ -36,29 +36,29 @@ var urls = [
 
 function nextTest() {
   let url = urls.shift();
   if (url) {
     testFindDisabled(url, nextTest);
   } else {
     // Make sure the find bar is re-enabled after disabled page is closed.
     testFindEnabled("about:blank", function() {
-      EventUtils.synthesizeKey("VK_ESCAPE", { });
+      EventUtils.synthesizeKey("KEY_Escape");
       ok(gFindBar.hidden, "Find bar should now be hidden");
       finish();
     });
   }
 }
 
 function testFindDisabled(url, cb) {
   load(url, function() {
     ok(gFindBar.hidden, "Find bar should not be visible");
     EventUtils.synthesizeKey("/", {}, gTab.linkedBrowser.contentWindow);
     ok(gFindBar.hidden, "Find bar should not be visible");
-    EventUtils.synthesizeKey("f", { accelKey: true });
+    EventUtils.synthesizeKey("f", {accelKey: true});
     ok(gFindBar.hidden, "Find bar should not be visible");
     ok(document.getElementById("cmd_find").getAttribute("disabled"),
        "Find command should be disabled");
 
     gBrowser.removeTab(gTab);
     cb();
   });
 }
@@ -66,15 +66,15 @@ function testFindDisabled(url, cb) {
 function testFindEnabled(url, cb) {
   load(url, function() {
     ok(!document.getElementById("cmd_find").getAttribute("disabled"),
        "Find command should not be disabled");
 
     // Open Find bar and then close it.
     EventUtils.synthesizeKey("f", { accelKey: true });
     ok(!gFindBar.hidden, "Find bar should be visible again");
-    EventUtils.synthesizeKey("VK_ESCAPE", { });
+    EventUtils.synthesizeKey("KEY_Escape");
     ok(gFindBar.hidden, "Find bar should now be hidden");
 
     gBrowser.removeTab(gTab);
     cb();
   });
 }
--- a/browser/base/content/test/general/contentSearchUI.js
+++ b/browser/base/content/test/general/contentSearchUI.js
@@ -28,17 +28,17 @@ var messageHandlers = {
         content.removeEventListener("ContentSearchService", listener);
         ack("init");
       }
     });
   },
 
   key(arg) {
     let keyName = typeof(arg) == "string" ? arg : arg.key;
-    content.synthesizeKey(keyName, arg.modifiers || {});
+    content.synthesizeKey(keyName, arg.modifiers);
     let wait = arg.waitForSuggestions ? waitForSuggestions : cb => cb();
     wait(ack.bind(null, "key"));
   },
 
   startComposition(arg) {
     content.synthesizeComposition({ type: "compositionstart", data: "" });
     ack("startComposition");
   },
@@ -138,19 +138,19 @@ var messageHandlers = {
     ack("removeLastOneOff");
   },
 
   reset() {
     // Reset both the input and suggestions by select all + delete. If there was
     // no text entered, this won't have any effect, so also escape to ensure the
     // suggestions table is closed.
     gController.input.focus();
-    content.synthesizeKey("a", { accelKey: true });
-    content.synthesizeKey("VK_DELETE", {});
-    content.synthesizeKey("VK_ESCAPE", {});
+    content.synthesizeKey("a", {accelKey: true});
+    content.synthesizeKey("KEY_Delete");
+    content.synthesizeKey("KEY_Escape");
     ack("reset");
   },
 };
 
 function ack(aType, aData) {
   sendAsyncMessage(TEST_MSG, { type: aType, data: aData || currentState() });
 }
 
--- a/browser/base/content/test/newtab/browser_newtab_focus.js
+++ b/browser/base/content/test/newtab/browser_newtab_focus.js
@@ -45,17 +45,17 @@ add_task(async function() {
 });
 
 /**
  * Focus the urlbar and count how many focus stops to return again to the urlbar.
  */
 function countFocus(aExpectedCount) {
   let focusCount = 0;
   do {
-    EventUtils.synthesizeKey("VK_TAB", {});
+    EventUtils.synthesizeKey("KEY_Tab");
     if (document.activeElement == gBrowser.selectedBrowser) {
       focusCount++;
     }
   } while (document.activeElement != gURLBar.inputField);
   ok(focusCount == aExpectedCount || focusCount == (aExpectedCount + 1),
      "Validate focus count in the new tab page.");
 }
 
--- a/browser/base/content/test/newtab/browser_newtab_search.js
+++ b/browser/base/content/test/newtab/browser_newtab_search.js
@@ -151,26 +151,26 @@ add_task(async function() {
     observer.observe(input, {
       attributes: true,
       attributeFilter: ["aria-expanded"],
     });
   });
 
   let suggestionsPromise = promiseSearchEvents(["Suggestions"]);
 
-  EventUtils.synthesizeKey("x", {});
+  EventUtils.sendString("x");
 
   // Wait for the search suggestions to become visible and for the Suggestions
   // message.
   await suggestionsOpenPromise;
   await suggestionsPromise;
 
   // Empty the search input, causing the suggestions to be hidden.
-  EventUtils.synthesizeKey("a", { accelKey: true });
-  EventUtils.synthesizeKey("VK_DELETE", {});
+  EventUtils.synthesizeKey("a", {accelKey: true});
+  EventUtils.synthesizeKey("KEY_Delete");
 
   await ContentTask.spawn(gBrowser.selectedBrowser, {}, async function() {
     Assert.ok(content.document.getElementById("searchSuggestionTable").hidden,
       "Search suggestion table hidden");
   });
 
   // Done.  Revert the current engine and remove the new engines.
   searchEventsPromise = promiseSearchEvents(["CurrentEngine"]);
--- a/browser/base/content/test/permissions/browser_reservedkey.js
+++ b/browser/base/content/test/permissions/browser_reservedkey.js
@@ -12,32 +12,28 @@ add_task(async function test_reserved_sh
   let container = document.createElement("box");
   container.unsafeSetInnerHTML(keyset);
   document.documentElement.appendChild(container);
   /* eslint-enable no-unsanitized/property */
 
   const pageUrl = "data:text/html,<body onload='document.body.firstChild.focus();'><div onkeydown='event.preventDefault();' tabindex=0>Test</div></body>";
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, pageUrl);
 
-  EventUtils.synthesizeKey("O", { shiftKey: true });
-  EventUtils.synthesizeKey("P", { shiftKey: true });
-  EventUtils.synthesizeKey("Q", { shiftKey: true });
+  EventUtils.sendString("OPQ");
 
   is(document.getElementById("kt_reserved").getAttribute("count"), "1", "reserved='true' with preference off");
   is(document.getElementById("kt_notreserved").getAttribute("count"), "0", "reserved='false' with preference off");
   is(document.getElementById("kt_reserveddefault").getAttribute("count"), "0", "default reserved with preference off");
 
   // Now try with reserved shortcut key handling enabled.
   await new Promise(resolve => {
     SpecialPowers.pushPrefEnv({"set": [["permissions.default.shortcuts", 2]]}, resolve);
   });
 
-  EventUtils.synthesizeKey("O", { shiftKey: true });
-  EventUtils.synthesizeKey("P", { shiftKey: true });
-  EventUtils.synthesizeKey("Q", { shiftKey: true });
+  EventUtils.sendString("OPQ");
 
   is(document.getElementById("kt_reserved").getAttribute("count"), "2", "reserved='true' with preference on");
   is(document.getElementById("kt_notreserved").getAttribute("count"), "0", "reserved='false' with preference on");
   is(document.getElementById("kt_reserveddefault").getAttribute("count"), "1", "default reserved with preference on");
 
   document.documentElement.removeChild(container);
 
   await BrowserTestUtils.removeTab(tab);
@@ -51,38 +47,38 @@ if (!navigator.platform.includes("Mac"))
     });
 
     const uri = "data:text/html,<body onkeydown='if (event.key == \"H\" || event.key == \"F10\") event.preventDefault();'>";
     let tab1 = await BrowserTestUtils.openNewForegroundTab(gBrowser, uri);
 
     // Pressing Alt+H should open the Help menu.
     let helpPopup = document.getElementById("menu_HelpPopup");
     let popupShown = BrowserTestUtils.waitForEvent(helpPopup, "popupshown");
-    EventUtils.synthesizeKey("VK_ALT", { type: "keydown" });
-    EventUtils.synthesizeKey("H", { altKey: true });
-    EventUtils.synthesizeKey("VK_ALT", { type: "keyup" });
+    EventUtils.synthesizeKey("KEY_Alt", {type: "keydown"});
+    EventUtils.synthesizeKey("h", {altKey: true});
+    EventUtils.synthesizeKey("KEY_Alt", {type: "keyup"});
     await popupShown;
 
     ok(true, "Help menu opened");
 
     let popupHidden = BrowserTestUtils.waitForEvent(helpPopup, "popuphidden");
     helpPopup.hidePopup();
     await popupHidden;
 
     // Pressing F10 should focus the menubar. On Linux, the file menu should open, but on Windows,
     // pressing Down will open the file menu.
     let menubar = document.getElementById("main-menubar");
     let menubarActive = BrowserTestUtils.waitForEvent(menubar, "DOMMenuBarActive");
-    EventUtils.sendKey("F10");
+    EventUtils.synthesizeKey("KEY_F10");
     await menubarActive;
 
     let filePopup = document.getElementById("menu_FilePopup");
     popupShown = BrowserTestUtils.waitForEvent(filePopup, "popupshown");
     if (navigator.platform.includes("Win")) {
-      EventUtils.synthesizeKey("KEY_ArrowDown", {});
+      EventUtils.synthesizeKey("KEY_ArrowDown");
     }
     await popupShown;
 
     ok(true, "File menu opened");
 
     popupHidden = BrowserTestUtils.waitForEvent(filePopup, "popuphidden");
     filePopup.hidePopup();
     await popupHidden;
--- a/browser/base/content/test/popupNotifications/browser_popupNotification_keyboard.js
+++ b/browser/base/content/test/popupNotifications/browser_popupNotification_keyboard.js
@@ -18,17 +18,17 @@ var tests = [
   { id: "Test#1",
     run() {
       this.notifyObj = new BasicNotification(this.id);
       this.notifyObj.options.persistent = true;
       showNotification(this.notifyObj);
     },
     onShown(popup) {
       checkPopup(popup, this.notifyObj);
-      EventUtils.synthesizeKey("VK_ESCAPE", {});
+      EventUtils.synthesizeKey("KEY_Escape");
     },
     onHidden(popup) {
       ok(!this.notifyObj.mainActionClicked, "mainAction was not clicked");
       ok(this.notifyObj.secondaryActionClicked, "secondaryAction was clicked");
       ok(!this.notifyObj.dismissalCallbackTriggered, "dismissal callback wasn't triggered");
       ok(this.notifyObj.removedCallbackTriggered, "removed callback triggered");
     }
   },
@@ -36,17 +36,17 @@ var tests = [
   { id: "Test#2",
     async run() {
       await waitForWindowReadyForPopupNotifications(window);
       this.notifyObj = new BasicNotification(this.id);
       this.notification = showNotification(this.notifyObj);
     },
     onShown(popup) {
       checkPopup(popup, this.notifyObj);
-      EventUtils.synthesizeKey("VK_ESCAPE", {});
+      EventUtils.synthesizeKey("KEY_Escape");
     },
     onHidden(popup) {
       ok(!this.notifyObj.mainActionClicked, "mainAction was not clicked");
       ok(!this.notifyObj.secondaryActionClicked, "secondaryAction was not clicked");
       ok(this.notifyObj.dismissalCallbackTriggered, "dismissal callback triggered");
       ok(!this.notifyObj.removedCallbackTriggered, "removed callback was not triggered");
       this.notification.remove();
     }
@@ -61,17 +61,17 @@ var tests = [
       });
       this.notification = showNotification(this.notifyObj);
     },
     onShown(popup) {
       checkPopup(popup, this.notifyObj);
       let anchor = document.getElementById(this.notifyObj.anchorID);
       anchor.focus();
       is(document.activeElement, anchor);
-      EventUtils.synthesizeKey(" ", {});
+      EventUtils.sendString(" ");
       is(document.activeElement, popup.childNodes[0].closebutton);
       this.notification.remove();
     },
     onHidden(popup) { }
   },
   // Test that you can switch between active notifications with the space key
   // and that the notification is focused on selection.
   { id: "Test#4",
@@ -103,28 +103,28 @@ var tests = [
       // Make sure notification 2 is visible
       checkPopup(popup, notifyObj2);
 
       // Activate the anchor for notification 1 and wait until it's shown.
       let anchor = document.getElementById(notifyObj1.anchorID);
       anchor.focus();
       is(document.activeElement, anchor);
       opened = waitForNotificationPanel();
-      EventUtils.synthesizeKey(" ", {});
+      EventUtils.sendString(" ");
       popup = await opened;
       checkPopup(popup, notifyObj1);
 
       is(document.activeElement, popup.childNodes[0].checkbox);
 
       // Activate the anchor for notification 2 and wait until it's shown.
       anchor = document.getElementById(notifyObj2.anchorID);
       anchor.focus();
       is(document.activeElement, anchor);
       opened = waitForNotificationPanel();
-      EventUtils.synthesizeKey(" ", {});
+      EventUtils.sendString(" ");
       popup = await opened;
       checkPopup(popup, notifyObj2);
 
       is(document.activeElement, popup.childNodes[0].closebutton);
 
       notification1.remove();
       notification2.remove();
       goNext();
@@ -142,17 +142,17 @@ var tests = [
     },
     onShown(popup) {
       checkPopup(popup, this.notifyObj);
 
       // Initial focus on open is null because a panel itself
       // can not be focused, next tab focus will be inside the panel.
       is(Services.focus.focusedElement, null);
 
-      EventUtils.synthesizeKey("VK_TAB", {});
+      EventUtils.synthesizeKey("KEY_Tab");
       is(Services.focus.focusedElement, popup.childNodes[0].closebutton);
       dismissNotification(popup);
     },
     async onHidden() {
       // Focus the urlbar to check that it stays focused.
       gURLBar.focus();
 
       // Show another notification and make sure it's not autofocused.
--- a/browser/base/content/test/popupNotifications/browser_popupNotification_no_anchors.js
+++ b/browser/base/content/test/popupNotifications/browser_popupNotification_no_anchors.js
@@ -115,41 +115,41 @@ var tests = [
         this.notification = showNotification(this.notifyObj);
         await shown;
 
         checkPopup(PopupNotifications.panel, this.notifyObj);
 
         // Typing in the location bar should hide the notification.
         let hidden = waitForNotificationPanelHidden();
         gURLBar.select();
-        EventUtils.synthesizeKey("*", {});
+        EventUtils.sendString("*");
         await hidden;
 
         is(document.getElementById("geo-notification-icon").boxObject.width, 0,
            "geo anchor shouldn't be visible");
 
         // Moving focus to the next control should show the notifications again,
         // anchored to the identity icon. We clear the URL bar before moving the
         // focus so that the awesomebar popup doesn't get in the way.
         shown = waitForNotificationPanel();
-        EventUtils.synthesizeKey("VK_BACK_SPACE", {});
-        EventUtils.synthesizeKey("VK_TAB", {});
+        EventUtils.synthesizeKey("KEY_Backspace");
+        EventUtils.synthesizeKey("KEY_Tab");
         await shown;
 
         is(PopupNotifications.panel.anchorNode.id, "identity-icon",
            "notification anchored to identity icon");
 
         // Moving focus to the location bar should hide the notification again.
         hidden = waitForNotificationPanelHidden();
-        EventUtils.synthesizeKey("VK_TAB", { shiftKey: true });
+        EventUtils.synthesizeKey("KEY_Tab", {shiftKey: true});
         await hidden;
 
         // Reverting the URL should show the notification again.
         shown = waitForNotificationPanel();
-        EventUtils.synthesizeKey("VK_ESCAPE", {});
+        EventUtils.synthesizeKey("KEY_Escape");
         await shown;
 
         checkPopup(PopupNotifications.panel, this.notifyObj);
 
         hidden = waitForNotificationPanelHidden();
         this.notification.remove();
         await hidden;
       }
@@ -158,30 +158,30 @@ var tests = [
   },
   // Test that popupnotifications triggered while editing the URL in the
   // location bar are only shown later when the URL is reverted.
   { id: "Test#5",
     async run() {
       for (let persistent of [false, true]) {
         // Start editing the URL, ensuring that the awesomebar popup is hidden.
         gURLBar.select();
-        EventUtils.synthesizeKey("*", {});
-        EventUtils.synthesizeKey("VK_BACK_SPACE", {});
+        EventUtils.sendString("*");
+        EventUtils.synthesizeKey("KEY_Backspace");
 
         // Trying to show a notification should display nothing.
         let notShowing = promiseTopicObserved("PopupNotifications-updateNotShowing");
         this.notifyObj = new BasicNotification(this.id);
         this.notifyObj.anchorID = "geo-notification-icon";
         this.notifyObj.addOptions({ persistent });
         this.notification = showNotification(this.notifyObj);
         await notShowing;
 
         // Reverting the URL should show the notification.
         let shown = waitForNotificationPanel();
-        EventUtils.synthesizeKey("VK_ESCAPE", {});
+        EventUtils.synthesizeKey("KEY_Escape");
         await shown;
 
         checkPopup(PopupNotifications.panel, this.notifyObj);
 
         let hidden = waitForNotificationPanelHidden();
         this.notification.remove();
         await hidden;
       }
@@ -205,17 +205,17 @@ var tests = [
       // Switching to a new tab should hide the notification.
       let hidden = waitForNotificationPanelHidden();
       this.oldSelectedTab = gBrowser.selectedTab;
       await BrowserTestUtils.openNewForegroundTab(gBrowser, "http://example.com/");
       await hidden;
 
       // Start editing the URL.
       gURLBar.select();
-      EventUtils.synthesizeKey("*", {});
+      EventUtils.sendString("*");
 
       // Switching to the old tab should show the notification again.
       shown = waitForNotificationPanel();
       gBrowser.removeTab(gBrowser.selectedTab);
       gBrowser.selectedTab = this.oldSelectedTab;
       await shown;
 
       checkPopup(PopupNotifications.panel, this.notifyObj);
--- a/browser/base/content/test/popupNotifications/head.js
+++ b/browser/base/content/test/popupNotifications/head.js
@@ -118,17 +118,17 @@ function showNotification(notifyObj) {
                                  notifyObj.anchorID,
                                  notifyObj.mainAction,
                                  notifyObj.secondaryActions,
                                  notifyObj.options);
 }
 
 function dismissNotification(popup) {
   info("Dismissing notification " + popup.childNodes[0].id);
-  executeSoon(() => EventUtils.synthesizeKey("VK_ESCAPE", {}));
+  executeSoon(() => EventUtils.synthesizeKey("KEY_Escape"));
 }
 
 function BasicNotification(testId) {
   this.browser = gBrowser.selectedBrowser;
   this.id = "test-notification-" + testId;
   this.message = "This is popup notification for " + testId;
   this.anchorID = null;
   this.mainAction = {
@@ -304,18 +304,18 @@ function triggerSecondaryCommand(popup, 
   // Extra secondary actions appear in a menu.
   notification.secondaryButton.nextSibling.nextSibling.focus();
 
   popup.addEventListener("popupshown", function() {
     info("Command popup open for notification " + notification.id);
     // Press down until the desired command is selected. Decrease index by one
     // since the secondary action was handled above.
     for (let i = 0; i <= index - 1; i++) {
-      EventUtils.synthesizeKey("VK_DOWN", {});
+      EventUtils.synthesizeKey("KEY_ArrowDown");
     }
     // Activate
-    EventUtils.synthesizeKey("VK_RETURN", {});
+    EventUtils.synthesizeKey("KEY_Enter");
   }, {once: true});
 
   // One down event to open the popup
   info("Open the popup to trigger secondary command for notification " + notification.id);
-  EventUtils.synthesizeKey("VK_DOWN", { altKey: !navigator.platform.includes("Mac") });
+  EventUtils.synthesizeKey("KEY_ArrowDown", {altKey: !navigator.platform.includes("Mac")});
 }
--- a/browser/base/content/test/siteIdentity/browser_identityPopup_focus.js
+++ b/browser/base/content/test/siteIdentity/browser_identityPopup_focus.js
@@ -14,14 +14,14 @@ add_task(async function testIdentityPopu
 // Access the identity popup via keyboard. Focus should be moved inside.
 add_task(async function testIdentityPopupFocusKeyboard() {
   await SpecialPowers.pushPrefEnv({"set": [["accessibility.tabfocus", 7]]});
   await BrowserTestUtils.withNewTab("https://example.com", async function() {
     let focused = BrowserTestUtils.waitForEvent(gIdentityHandler._identityBox, "focus");
     gIdentityHandler._identityBox.focus();
     await focused;
     let shown = BrowserTestUtils.waitForEvent(gIdentityHandler._identityPopup, "popupshown");
-    EventUtils.synthesizeKey(" ", {});
+    EventUtils.sendString(" ");
     await shown;
     is(Services.focus.focusedElement, document.getElementById("identity-popup-security-expander"));
   });
 });
 
--- a/browser/base/content/test/urlbar/browser_action_searchengine_alias.js
+++ b/browser/base/content/test/urlbar/browser_action_searchengine_alias.js
@@ -22,16 +22,16 @@ add_task(async function() {
 
   await promiseAutocompleteResultPopup("moz open a search");
   let result = await waitForAutocompleteResultAt(0);
   ok(result.hasAttribute("image"), "Result should have an image attribute");
   ok(result.getAttribute("image") === engine.iconURI.spec,
      "Image attribute should have the search engine's icon");
 
   let tabPromise = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
-  EventUtils.synthesizeKey("VK_RETURN", { });
+  EventUtils.synthesizeKey("KEY_Enter");
   await tabPromise;
 
   is(gBrowser.selectedBrowser.currentURI.spec, "http://example.com/?q=open+a+search");
 
   gURLBar.popup.hidePopup();
   await promisePopupHidden(gURLBar.popup);
 });
--- a/browser/base/content/test/urlbar/browser_autocomplete_autoselect.js
+++ b/browser/base/content/test/urlbar/browser_autocomplete_autoselect.js
@@ -51,45 +51,45 @@ add_task(async function() {
 
   let popup = gURLBar.popup;
   let results = popup.richlistbox.children;
   is(results.length, maxResults,
      "Should get maxResults=" + maxResults + " results");
   is_selected(0);
 
   info("Key Down to select the next item");
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   is_selected(1);
 
   info("Key Down maxResults-1 times should select the first one-off");
-  repeat(maxResults - 1, () => EventUtils.synthesizeKey("VK_DOWN", {}));
+  repeat(maxResults - 1, () => EventUtils.synthesizeKey("KEY_ArrowDown"));
   is_selected_one_off(0);
 
   info("Key Down numButtons-1 should select the last one-off");
   let numButtons =
     gURLBar.popup.oneOffSearchButtons.getSelectableButtons(true).length;
-  repeat(numButtons - 1, () => EventUtils.synthesizeKey("VK_DOWN", {}));
+  repeat(numButtons - 1, () => EventUtils.synthesizeKey("KEY_ArrowDown"));
   is_selected_one_off(numButtons - 1);
 
   info("Key Down twice more should select the second result");
-  repeat(2, () => EventUtils.synthesizeKey("VK_DOWN", {}));
+  repeat(2, () => EventUtils.synthesizeKey("KEY_ArrowDown"));
   is_selected(1);
 
   info("Key Down maxResults + numButtons times should wrap around");
   repeat(maxResults + numButtons,
-         () => EventUtils.synthesizeKey("VK_DOWN", {}));
+         () => EventUtils.synthesizeKey("KEY_ArrowDown"));
   is_selected(1);
 
   info("Key Up maxResults + numButtons times should wrap around the other way");
-  repeat(maxResults + numButtons, () => EventUtils.synthesizeKey("VK_UP", {}));
+  repeat(maxResults + numButtons, () => EventUtils.synthesizeKey("KEY_ArrowUp"));
   is_selected(1);
 
   info("Page Up will go up the list, but not wrap");
-  EventUtils.synthesizeKey("VK_PAGE_UP", {});
+  EventUtils.synthesizeKey("KEY_PageUp");
   is_selected(0);
 
   info("Page Up again will wrap around to the end of the list");
-  EventUtils.synthesizeKey("VK_PAGE_UP", {});
+  EventUtils.synthesizeKey("KEY_PageUp");
   is_selected(maxResults - 1);
 
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await promisePopupHidden(gURLBar.popup);
 });
--- a/browser/base/content/test/urlbar/browser_autocomplete_cursor.js
+++ b/browser/base/content/test/urlbar/browser_autocomplete_cursor.js
@@ -5,16 +5,16 @@ add_task(async function() {
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:mozilla");
   await promiseAutocompleteResultPopup("www.mozilla.org");
 
   gURLBar.selectTextRange(4, 4);
 
   is(gURLBar.popup.state, "open", "Popup should be open");
   is(gURLBar.popup.richlistbox.selectedIndex, 0, "Should have selected something");
 
-  EventUtils.synthesizeKey("VK_RIGHT", {});
+  EventUtils.synthesizeKey("KEY_ArrowRight");
   await promisePopupHidden(gURLBar.popup);
 
   is(gURLBar.selectionStart, 5, "Should have moved the cursor");
   is(gURLBar.selectionEnd, 5, "And not selected anything");
 
   await BrowserTestUtils.removeTab(tab);
 });
--- a/browser/base/content/test/urlbar/browser_autocomplete_edit_completed.js
+++ b/browser/base/content/test/urlbar/browser_autocomplete_edit_completed.js
@@ -15,33 +15,33 @@ add_task(async function() {
   await promiseAutocompleteResultPopup("http://example.com");
   await waitForAutocompleteResultAt(1);
 
   let popup = gURLBar.popup;
   let list = popup.richlistbox;
   let initialIndex = list.selectedIndex;
 
   info("Key Down to select the next item.");
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
 
   let nextIndex = initialIndex + 1;
   let nextValue = gURLBar.controller.getFinalCompleteValueAt(nextIndex);
   is(list.selectedIndex, nextIndex, "The next item is selected.");
   is(gURLBar.value, nextValue, "The selected URL is completed.");
 
   info("Press backspace");
-  EventUtils.synthesizeKey("VK_BACK_SPACE", {});
+  EventUtils.synthesizeKey("KEY_Backspace");
   await promiseSearchComplete();
 
   let editedValue = gURLBar.textValue;
   is(list.selectedIndex, initialIndex, "The initial index is selected again.");
   isnot(editedValue, nextValue, "The URL has changed.");
 
   let docLoad = waitForDocLoadAndStopIt("http://" + editedValue);
 
   info("Press return to load edited URL.");
-  EventUtils.synthesizeKey("VK_RETURN", {});
+  EventUtils.synthesizeKey("KEY_Enter");
   await Promise.all([
     promisePopupHidden(gURLBar.popup),
     docLoad,
   ]);
 
 });
--- a/browser/base/content/test/urlbar/browser_autocomplete_enter_race.js
+++ b/browser/base/content/test/urlbar/browser_autocomplete_enter_race.js
@@ -15,47 +15,47 @@ add_task(async function setup() {
                                       url: "http://example.com/?q=%s" });
   // Needs at least one success.
   ok(true, "Setup complete");
 });
 
 add_task(async function test_keyword() {
   await promiseAutocompleteResultPopup("keyword bear");
   gURLBar.focus();
-  EventUtils.synthesizeKey("d", {});
-  EventUtils.synthesizeKey("VK_RETURN", {});
+  EventUtils.sendString("d");
+  EventUtils.synthesizeKey("KEY_Enter");
   info("wait for the page to load");
   await BrowserTestUtils.browserLoaded(gBrowser.selectedTab.linkedBrowser,
                                       false, "http://example.com/?q=beard");
 });
 
 add_task(async function test_sametext() {
   await promiseAutocompleteResultPopup("example.com", window, true);
 
   // Simulate re-entering the same text searched the last time. This may happen
   // through a copy paste, but clipboard handling is not much reliable, so just
   // fire an input event.
   info("synthesize input event");
   let event = document.createEvent("Events");
   event.initEvent("input", true, true);
   gURLBar.dispatchEvent(event);
-  EventUtils.synthesizeKey("VK_RETURN", {});
+  EventUtils.synthesizeKey("KEY_Enter");
 
   info("wait for the page to load");
   await BrowserTestUtils.browserLoaded(gBrowser.selectedTab.linkedBrowser,
                                        false, "http://example.com/");
 });
 
 add_task(async function test_after_empty_search() {
   await promiseAutocompleteResultPopup("");
   gURLBar.focus();
   // Add www. to avoid a switch-to-tab.
   gURLBar.value = "www.e";
-  EventUtils.synthesizeKey("x", {});
-  EventUtils.synthesizeKey("VK_RETURN", {});
+  EventUtils.synthesizeKey("x");
+  EventUtils.synthesizeKey("KEY_Enter");
 
   info("wait for the page to load");
   await BrowserTestUtils.browserLoaded(gBrowser.selectedTab.linkedBrowser,
                                        false, "http://www.example.com/");
 });
 
 add_task(async function test_disabled_ac() {
   // Disable autocomplete.
@@ -82,18 +82,18 @@ add_task(async function test_disabled_ac
     if (mozSearchEngine) {
       Services.search.removeEngine(mozSearchEngine);
     }
   }
   registerCleanupFunction(cleanup);
 
   gURLBar.focus();
   gURLBar.value = "e";
-  EventUtils.synthesizeKey("x", {});
-  EventUtils.synthesizeKey("VK_RETURN", {});
+  EventUtils.sendString("x");
+  EventUtils.synthesizeKey("KEY_Enter");
 
   info("wait for the page to load");
   await BrowserTestUtils.browserLoaded(gBrowser.selectedTab.linkedBrowser,
                                        false, "http://example.com/?q=ex");
   await cleanup();
 });
 
 add_task(async function test_delay() {
@@ -110,15 +110,15 @@ add_task(async function test_delay() {
   let start = Date.now();
   await promiseAutocompleteResultPopup("");
   Assert.ok((Date.now() - start) < TIMEOUT);
 
   start = Date.now();
   gURLBar.closePopup();
   gURLBar.focus();
   gURLBar.value = "e";
-  EventUtils.synthesizeKey("x", {});
-  EventUtils.synthesizeKey("VK_RETURN", {});
+  EventUtils.sendString("x");
+  EventUtils.synthesizeKey("KEY_Enter");
   info("wait for the page to load");
   await BrowserTestUtils.browserLoaded(gBrowser.selectedTab.linkedBrowser,
                                        false, "http://example.com/");
   Assert.ok((Date.now() - start) < TIMEOUT);
 });
--- a/browser/base/content/test/urlbar/browser_bug1003461-switchtab-override.js
+++ b/browser/base/content/test/urlbar/browser_bug1003461-switchtab-override.js
@@ -26,36 +26,36 @@ add_task(async function test_switchtab_o
   gURLBar.onSearchComplete = function() {
     ok(gURLBar.popupOpen, "The autocomplete popup is correctly open");
     onSearchComplete.apply(gURLBar);
     deferred.resolve();
   };
 
   gURLBar.focus();
   gURLBar.value = "dummy_pag";
-  EventUtils.synthesizeKey("e", {});
+  EventUtils.sendString("e");
   await deferred.promise;
 
   info("Select second autocomplete popup entry");
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   ok(/moz-action:switchtab/.test(gURLBar.value), "switch to tab entry found");
 
   info("Override switch-to-tab");
   deferred = PromiseUtils.defer();
   // In case of failure this would switch tab.
   let onTabSelect = event => {
     deferred.reject(new Error("Should have overridden switch to tab"));
   };
   gBrowser.tabContainer.addEventListener("TabSelect", onTabSelect);
   registerCleanupFunction(() => {
     gBrowser.tabContainer.removeEventListener("TabSelect", onTabSelect);
   });
   // Otherwise it would load the page.
   BrowserTestUtils.browserLoaded(secondTab.linkedBrowser).then(deferred.resolve);
 
-  EventUtils.synthesizeKey("VK_SHIFT", { type: "keydown" });
-  EventUtils.synthesizeKey("VK_RETURN", { });
+  EventUtils.synthesizeKey("KEY_Shift", {type: "keydown"});
+  EventUtils.synthesizeKey("KEY_Enter");
   info(`gURLBar.value = ${gURLBar.value}`);
-  EventUtils.synthesizeKey("VK_SHIFT", { type: "keyup" });
+  EventUtils.synthesizeKey("KEY_Shift", {type: "keyup"});
   await deferred.promise;
 
   await PlacesUtils.history.clear();
 });
--- a/browser/base/content/test/urlbar/browser_bug1024133-switchtab-override-keynav.js
+++ b/browser/base/content/test/urlbar/browser_bug1024133-switchtab-override-keynav.js
@@ -15,23 +15,23 @@ add_task(async function test_switchtab_o
       gBrowser.removeTab(tab);
       gBrowser.removeTab(secondTab);
     } catch (ex) { /* tabs may have already been closed in case of failure */ }
     return PlacesUtils.history.clear();
   });
 
   gURLBar.focus();
   gURLBar.value = "dummy_pag";
-  EventUtils.synthesizeKey("e", {});
+  EventUtils.sendString("e");
   await promiseSearchComplete();
 
   info("Select second autocomplete popup entry");
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   ok(/moz-action:switchtab/.test(gURLBar.value), "switch to tab entry found");
 
   info("Shift+left on switch-to-tab entry");
 
-  EventUtils.synthesizeKey("VK_SHIFT", { type: "keydown" });
-  EventUtils.synthesizeKey("VK_LEFT", { shiftKey: true });
-  EventUtils.synthesizeKey("VK_SHIFT", { type: "keyup" });
+  EventUtils.synthesizeKey("KEY_Shift", {type: "keydown"});
+  EventUtils.synthesizeKey("KEY_ArrowLeft", {shiftKey: true});
+  EventUtils.synthesizeKey("KEY_Shift", {type: "keyup"});
 
   ok(!/moz-action:switchtab/.test(gURLBar.inputField.value), "switch to tab should be hidden");
 });
--- a/browser/base/content/test/urlbar/browser_bug1070778.js
+++ b/browser/base/content/test/urlbar/browser_bug1070778.js
@@ -29,27 +29,27 @@ add_task(async function() {
 
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:mozilla");
   await promiseAutocompleteResultPopup("keyword a");
   await waitForAutocompleteResultAt(1);
 
   // First item should already be selected
   is_selected(0);
   // Select next one (important!)
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   is_selected(1);
   // Re-select keyword item
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   is_selected(0);
 
-  EventUtils.synthesizeKey("b", {});
+  EventUtils.sendString("b");
   await promiseSearchComplete();
 
   is(gURLBar.textValue, "keyword ab", "urlbar should have expected input");
   let result = await waitForAutocompleteResultAt(0);
   isnot(result, null, "Should have first item");
   let uri = NetUtil.newURI(result.getAttribute("url"));
   is(uri.spec, PlacesUtils.mozActionURI("keyword", {url: "http://example.com/?q=ab", input: "keyword ab"}), "Expect correct url");
 
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await promisePopupHidden(gURLBar.popup);
   gBrowser.removeTab(tab);
 });
--- a/browser/base/content/test/urlbar/browser_bug1104165-switchtab-decodeuri.js
+++ b/browser/base/content/test/urlbar/browser_bug1104165-switchtab-decodeuri.js
@@ -5,24 +5,24 @@ add_task(async function test_switchtab_d
 
   info("Opening and selecting second tab");
   gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
 
   info("Wait for autocomplete");
   await promiseAutocompleteResultPopup("dummy_page");
 
   info("Select autocomplete popup entry");
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   ok(gURLBar.value.startsWith("moz-action:switchtab"), "switch to tab entry found");
 
   info("switch-to-tab");
   await new Promise((resolve, reject) => {
     // In case of success it should switch tab.
     gBrowser.tabContainer.addEventListener("TabSelect", function() {
       is(gBrowser.selectedTab, tab, "Should have switched to the right tab");
       resolve();
     }, {once: true});
-    EventUtils.synthesizeKey("VK_RETURN", { });
+    EventUtils.synthesizeKey("KEY_Enter");
   });
 
   gBrowser.removeCurrentTab();
   await PlacesUtils.history.clear();
 });
--- a/browser/base/content/test/urlbar/browser_bug1225194-remotetab.js
+++ b/browser/base/content/test/urlbar/browser_bug1225194-remotetab.js
@@ -3,14 +3,14 @@ add_task(async function test_remotetab_o
   await BrowserTestUtils.withNewTab({url: "about:robots", gBrowser}, async function() {
     // Set the urlbar to include the moz-action
     gURLBar.value = "moz-action:remotetab," + JSON.stringify({ url });
     // Focus the urlbar so we can press enter
     gURLBar.focus();
 
     // The URL is going to open in the current tab as it is currently about:blank
     let promiseTabLoaded = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
-    EventUtils.synthesizeKey("VK_RETURN", {});
+    EventUtils.synthesizeKey("KEY_Enter");
     await promiseTabLoaded;
 
     Assert.equal(gBrowser.selectedTab.linkedBrowser.currentURI.spec, url, "correct URL loaded");
   });
 });
--- a/browser/base/content/test/urlbar/browser_bug304198.js
+++ b/browser/base/content/test/urlbar/browser_bug304198.js
@@ -46,17 +46,17 @@ add_task(async function() {
       gBrowser.selectedBrowser.focus();
       gURLBar.addEventListener("input", function() {
         resolve();
       }, {once: true});
       gURLBar.focus();
       if (gURLBar.selectionStart == gURLBar.selectionEnd) {
         gURLBar.selectionStart = gURLBar.selectionEnd = gURLBar.textValue.length;
       }
-      EventUtils.synthesizeKey("VK_BACK_SPACE", {});
+      EventUtils.synthesizeKey("KEY_Backspace");
     });
   }
 
   async function prepareDeletedURLTab() {
     await BrowserTestUtils.switchTab(gBrowser, deletedURLTab);
     is(gURLBar.textValue, testURL, "gURLBar.textValue should be testURL after initial switch to deletedURLTab");
 
     // simulate the user removing the whole url from the location bar
--- a/browser/base/content/test/urlbar/browser_canonizeURL.js
+++ b/browser/base/content/test/urlbar/browser_canonizeURL.js
@@ -27,16 +27,16 @@ add_task(async function() {
 
   for (let [inputValue, expectedURL, options] of testcases) {
     let promiseLoad = waitForDocLoadAndStopIt(expectedURL);
     gURLBar.focus();
     if (Object.keys(options).length > 0) {
       gURLBar.selectionStart = gURLBar.selectionEnd =
         gURLBar.inputField.value.length;
       gURLBar.inputField.value = inputValue.slice(0, -1);
-      EventUtils.synthesizeKey(inputValue.slice(-1), {});
+      EventUtils.sendString(inputValue.slice(-1));
     } else {
       gURLBar.textValue = inputValue;
     }
-    EventUtils.synthesizeKey("VK_RETURN", options);
+    EventUtils.synthesizeKey("KEY_Enter", options);
     await promiseLoad;
   }
 });
--- a/browser/base/content/test/urlbar/browser_locationBarCommand.js
+++ b/browser/base/content/test/urlbar/browser_locationBarCommand.js
@@ -154,27 +154,25 @@ add_task(async function load_in_new_tab_
     gBrowser.removeCurrentTab();
     gBrowser.removeCurrentTab();
   }
 });
 
 function triggerCommand(shouldClick, event) {
   gURLBar.focus();
   gURLBar.value = "";
-  for (let c of TEST_VALUE) {
-    EventUtils.synthesizeKey(c, {});
-  }
+  EventUtils.sendString(TEST_VALUE);
 
   if (shouldClick) {
     ok(gURLBar.hasAttribute("usertyping"),
        "usertyping attribute must be set for the go button to be visible");
 
     EventUtils.synthesizeMouseAtCenter(gURLBar.goButton, event);
   } else {
-    EventUtils.synthesizeKey("VK_RETURN", event);
+    EventUtils.synthesizeKey("KEY_Enter", event);
   }
 }
 
 function promiseLoadStarted() {
   return new Promise(resolve => {
     gBrowser.addTabsProgressListener({
       onStateChange(browser, webProgress, req, flags, status) {
         if (flags & Ci.nsIWebProgressListener.STATE_START) {
--- a/browser/base/content/test/urlbar/browser_locationBarExternalLoad.js
+++ b/browser/base/content/test/urlbar/browser_locationBarExternalLoad.js
@@ -8,26 +8,23 @@ add_task(async function() {
   const url = "data:text/html,<body>hi";
   await testURL(url, urlEnter);
   await testURL(url, urlClick);
 });
 
 function urlEnter(url) {
   gURLBar.value = url;
   gURLBar.focus();
-  EventUtils.synthesizeKey("VK_RETURN", {});
+  EventUtils.synthesizeKey("KEY_Enter");
 }
 
 function urlClick(url) {
   gURLBar.focus();
   gURLBar.value = "";
-  for (let c of url) {
-    EventUtils.synthesizeKey(c, {});
-  }
-
+  EventUtils.sendString(url);
   EventUtils.synthesizeMouseAtCenter(gURLBar.goButton, {});
 }
 
 function promiseNewTabSwitched() {
   return new Promise(resolve => {
     gBrowser.addEventListener("TabSwitchDone", function() {
       executeSoon(resolve);
     }, {once: true});
--- a/browser/base/content/test/urlbar/browser_urlbarAutoFillTrimURLs.js
+++ b/browser/base/content/test/urlbar/browser_urlbarAutoFillTrimURLs.js
@@ -22,17 +22,17 @@ add_task(async function setup() {
     uri: "https://www.secureautofillurl.com/whatever",
     transition: Ci.nsINavHistoryService.TRANSITION_TYPED,
   }]);
 });
 
 async function promiseSearch(searchtext) {
   gURLBar.focus();
   gURLBar.inputField.value = searchtext.substr(0, searchtext.length - 1);
-  EventUtils.synthesizeKey(searchtext.substr(-1, 1), {});
+  EventUtils.sendString(searchtext.substr(-1, 1));
   await promiseSearchComplete();
 }
 
 async function promiseTestResult(test) {
   info("Searching for '${test.search}'");
 
   await promiseSearch(test.search);
 
@@ -106,11 +106,11 @@ add_task(async function autofill_tests()
 });
 
 add_task(async function autofill_complete_domain() {
   await promiseSearch("http://www.autofilltrimurl.com");
   is(gURLBar.inputField.value, "http://www.autofilltrimurl.com/", "Autofilled value is as expected");
 
   // Now ensure selecting from the popup correctly trims.
   is(gURLBar.controller.matchCount, 2, "Found the expected number of matches");
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   is(gURLBar.inputField.value, "www.autofilltrimurl.com/whatever", "trim was applied correctly");
 });
--- a/browser/base/content/test/urlbar/browser_urlbarDelete.js
+++ b/browser/base/content/test/urlbar/browser_urlbarDelete.js
@@ -8,24 +8,24 @@ add_task(async function() {
   });
 
   await BrowserTestUtils.withNewTab({ gBrowser, url: "about:blank" }, testDelete);
 });
 
 function sendHome() {
   // unclear why VK_HOME doesn't work on Mac, but it doesn't...
   if (Services.appinfo.OS == "Darwin") {
-    EventUtils.synthesizeKey("VK_LEFT", { altKey: true });
+    EventUtils.synthesizeKey("KEY_ArrowLeft", {altKey: true});
   } else {
-    EventUtils.synthesizeKey("VK_HOME", {});
+    EventUtils.synthesizeKey("KEY_Home");
   }
 }
 
 function sendDelete() {
-  EventUtils.synthesizeKey("VK_DELETE", {});
+  EventUtils.synthesizeKey("KEY_Delete");
 }
 
 async function testDelete() {
   await promiseAutocompleteResultPopup("bug1105244");
 
   // move to the start.
   sendHome();
   // delete the first few chars - each delete should operate on the input field.
--- a/browser/base/content/test/urlbar/browser_urlbarEnter.js
+++ b/browser/base/content/test/urlbar/browser_urlbarEnter.js
@@ -6,17 +6,17 @@
 const TEST_VALUE = "example.com/\xF7?\xF7";
 const START_VALUE = "example.com/%C3%B7?%C3%B7";
 
 add_task(async function() {
   info("Simple return keypress");
   let tab = gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, START_VALUE);
 
   gURLBar.focus();
-  EventUtils.synthesizeKey("VK_RETURN", {});
+  EventUtils.synthesizeKey("KEY_Enter");
   await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
 
   // Check url bar and selected tab.
   is(gURLBar.textValue, TEST_VALUE, "Urlbar should preserve the value on return keypress");
   is(gBrowser.selectedTab, tab, "New URL was loaded in the current tab");
 
   // Cleanup.
   await BrowserTestUtils.removeTab(gBrowser.selectedTab);
@@ -25,17 +25,17 @@ add_task(async function() {
 add_task(async function() {
   info("Alt+Return keypress");
   // due to bug 691608, we must wait for the load event, else isTabEmpty() will
   // return true on e10s for this tab, so it will be reused even with altKey.
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, START_VALUE);
 
   let tabOpenPromise = BrowserTestUtils.waitForEvent(gBrowser.tabContainer, "TabOpen");
   gURLBar.focus();
-  EventUtils.synthesizeKey("VK_RETURN", {altKey: true});
+  EventUtils.synthesizeKey("KEY_Enter", {altKey: true});
 
   // wait for the new tab to appear.
   await tabOpenPromise;
 
   // Check url bar and selected tab.
   is(gURLBar.textValue, TEST_VALUE, "Urlbar should preserve the value on return keypress");
   isnot(gBrowser.selectedTab, tab, "New URL was loaded in a new tab");
 
--- a/browser/base/content/test/urlbar/browser_urlbarEnterAfterMouseOver.js
+++ b/browser/base/content/test/urlbar/browser_urlbarEnterAfterMouseOver.js
@@ -2,17 +2,17 @@ function repeat(limit, func) {
   for (let i = 0; i < limit; i++) {
     func(i);
   }
 }
 
 async function promiseAutoComplete(inputText) {
   gURLBar.focus();
   gURLBar.value = inputText.slice(0, -1);
-  EventUtils.synthesizeKey(inputText.slice(-1), {});
+  EventUtils.sendString(inputText.slice(-1));
   await promiseSearchComplete();
 }
 
 function is_selected(index) {
   is(gURLBar.popup.richlistbox.selectedIndex, index, `Item ${index + 1} should be selected`);
 }
 
 let gMaxResults;
@@ -40,30 +40,30 @@ add_task(async function() {
   let popup = gURLBar.popup;
   let results = popup.richlistbox.children;
   is(results.length, gMaxResults,
      "Should get gMaxResults=" + gMaxResults + " results");
 
   let initiallySelected = gURLBar.popup.richlistbox.selectedIndex;
 
   info("Key Down to select the next item");
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   is_selected(initiallySelected + 1);
   let expectedURL = gURLBar.controller.getFinalCompleteValueAt(initiallySelected + 1);
 
   is(gURLBar.value, gURLBar.controller.getValueAt(initiallySelected + 1),
      "Value in the URL bar should be updated by keyboard selection");
 
   // Verify that what we're about to do changes the selectedIndex:
   isnot(initiallySelected + 1, 3, "Shouldn't be changing the selectedIndex to the same index we keyboard-selected.");
 
   // Would love to use a synthetic mousemove event here, but that doesn't seem to do anything.
   // EventUtils.synthesizeMouseAtCenter(results[3], {type: "mousemove"});
   gURLBar.popup.richlistbox.selectedIndex = 3;
   is_selected(3);
 
   let autocompletePopupHidden = promisePopupHidden(gURLBar.popup);
   let openedExpectedPage = waitForDocLoadAndStopIt(expectedURL);
-  EventUtils.synthesizeKey("VK_RETURN", {});
+  EventUtils.synthesizeKey("KEY_Enter");
   await Promise.all([autocompletePopupHidden, openedExpectedPage]);
 
   gBrowser.removeCurrentTab();
 });
--- a/browser/base/content/test/urlbar/browser_urlbarOneOffs.js
+++ b/browser/base/content/test/urlbar/browser_urlbarOneOffs.js
@@ -29,77 +29,77 @@ add_task(async function init() {
   }
   await PlacesTestUtils.addVisits(visits);
 });
 
 // Keys up and down through the history panel, i.e., the panel that's shown when
 // there's no text in the textbox.
 add_task(async function history() {
   gURLBar.focus();
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   await promisePopupShown(gURLBar.popup);
   await waitForAutocompleteResultAt(gMaxResults - 1);
 
   assertState(-1, -1, "");
 
   // Key down through each result.
   for (let i = 0; i < gMaxResults; i++) {
-    EventUtils.synthesizeKey("VK_DOWN", {});
+    EventUtils.synthesizeKey("KEY_ArrowDown");
     assertState(i, -1,
       "example.com/browser_urlbarOneOffs.js/?" + (gMaxResults - i - 1));
   }
 
   // Key down through each one-off.
   let numButtons =
     gURLBar.popup.oneOffSearchButtons.getSelectableButtons(true).length;
   for (let i = 0; i < numButtons; i++) {
-    EventUtils.synthesizeKey("VK_DOWN", {});
+    EventUtils.synthesizeKey("KEY_ArrowDown");
     assertState(-1, i, "");
   }
 
   // Key down once more.  Nothing should be selected.
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   assertState(-1, -1, "");
 
   // Once more.  The first result should be selected.
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   assertState(0, -1,
     "example.com/browser_urlbarOneOffs.js/?" + (gMaxResults - 1));
 
   // Now key up.  Nothing should be selected again.
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   assertState(-1, -1, "");
 
   // Key up through each one-off.
   for (let i = numButtons - 1; i >= 0; i--) {
-    EventUtils.synthesizeKey("VK_UP", {});
+    EventUtils.synthesizeKey("KEY_ArrowUp");
     assertState(-1, i, "");
   }
 
   // Key right through each one-off.
   for (let i = 1; i < numButtons; i++) {
-    EventUtils.synthesizeKey("VK_RIGHT", {});
+    EventUtils.synthesizeKey("KEY_ArrowRight");
     assertState(-1, i, "");
   }
 
   // Key left through each one-off.
   for (let i = numButtons - 2; i >= 0; i--) {
-    EventUtils.synthesizeKey("VK_LEFT", {});
+    EventUtils.synthesizeKey("KEY_ArrowLeft");
     assertState(-1, i, "");
   }
 
   // Key up through each result.
   for (let i = gMaxResults - 1; i >= 0; i--) {
-    EventUtils.synthesizeKey("VK_UP", {});
+    EventUtils.synthesizeKey("KEY_ArrowUp");
     assertState(i, -1,
       "example.com/browser_urlbarOneOffs.js/?" + (gMaxResults - i - 1));
   }
 
   // Key up once more.  Nothing should be selected.
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   assertState(-1, -1, "");
 
   await hidePopup();
 });
 
 // Keys up and down through the non-history panel, i.e., the panel that's shown
 // when you type something in the textbox.
 add_task(async function() {
@@ -108,52 +108,52 @@ add_task(async function() {
   let typedValue = "browser_urlbarOneOffs";
   await promiseAutocompleteResultPopup(typedValue, window, true);
   await waitForAutocompleteResultAt(gMaxResults - 1);
   assertState(0, -1, typedValue);
 
   // Key down through each result.  The first result is already selected, which
   // is why gMaxResults - 1 is the correct number of times to do this.
   for (let i = 0; i < gMaxResults - 1; i++) {
-    EventUtils.synthesizeKey("VK_DOWN", {});
+    EventUtils.synthesizeKey("KEY_ArrowDown");
     // i starts at zero so that the textValue passed to assertState is correct.
     // But that means that i + 1 is the expected selected index, since initially
     // (when this loop starts) the first result is selected.
     assertState(i + 1, -1,
       "example.com/browser_urlbarOneOffs.js/?" + (gMaxResults - i - 1));
   }
 
   // Key down through each one-off.
   let numButtons =
     gURLBar.popup.oneOffSearchButtons.getSelectableButtons(true).length;
   for (let i = 0; i < numButtons; i++) {
-    EventUtils.synthesizeKey("VK_DOWN", {});
+    EventUtils.synthesizeKey("KEY_ArrowDown");
     assertState(-1, i, typedValue);
   }
 
   // Key down once more.  The selection should wrap around to the first result.
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   assertState(0, -1, typedValue);
 
   // Now key up.  The selection should wrap back around to the one-offs.  Key
   // up through all the one-offs.
   for (let i = numButtons - 1; i >= 0; i--) {
-    EventUtils.synthesizeKey("VK_UP", {});
+    EventUtils.synthesizeKey("KEY_ArrowUp");
     assertState(-1, i, typedValue);
   }
 
   // Key up through each non-heuristic result.
   for (let i = gMaxResults - 2; i >= 0; i--) {
-    EventUtils.synthesizeKey("VK_UP", {});
+    EventUtils.synthesizeKey("KEY_ArrowUp");
     assertState(i + 1, -1,
       "example.com/browser_urlbarOneOffs.js/?" + (gMaxResults - i - 1));
   }
 
   // Key up once more.  The heuristic result should be selected.
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   assertState(0, -1, typedValue);
 
   await hidePopup();
 });
 
 // Checks that "Search with Current Search Engine" items are updated to "Search
 // with One-Off Engine" when a one-off is selected.
 add_task(async function searchWith() {
@@ -164,17 +164,17 @@ add_task(async function searchWith() {
 
   let item = gURLBar.popup.richlistbox.firstChild;
   Assert.equal(item._actionText.textContent,
                "Search with " + Services.search.currentEngine.name,
                "Sanity check: first result's action text");
 
   // Alt+Down to the first one-off.  Now the first result and the first one-off
   // should both be selected.
-  EventUtils.synthesizeKey("VK_DOWN", { altKey: true });
+  EventUtils.synthesizeKey("KEY_ArrowDown", { altKey: true });
   assertState(0, 0, typedValue);
 
   let engineName = gURLBar.popup.oneOffSearchButtons.selectedButton.engine.name;
   Assert.notEqual(engineName, Services.search.currentEngine.name,
                   "Sanity check: First one-off engine should not be " +
                   "the current engine");
   Assert.equal(item._actionText.textContent,
                "Search with " + engineName,
@@ -211,23 +211,23 @@ add_task(async function oneOffReturn() {
   // We are explicitly using something that looks like a url, to make the test
   // stricter. Even if it looks like a url, we should search.
   let typedValue = "foo.bar";
   await promiseAutocompleteResultPopup(typedValue, window, true);
   await waitForAutocompleteResultAt(1);
   assertState(0, -1, typedValue);
 
   // Alt+Down to select the first one-off.
-  EventUtils.synthesizeKey("VK_DOWN", { altKey: true });
+  EventUtils.synthesizeKey("KEY_ArrowDown", { altKey: true });
   assertState(0, 0, typedValue);
 
   let resultsPromise =
     BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser, false,
                                    "http://mochi.test:8888/?terms=foo.bar");
-  EventUtils.synthesizeKey("VK_RETURN", {});
+  EventUtils.synthesizeKey("KEY_Enter");
   await resultsPromise;
 
   gBrowser.removeTab(gBrowser.selectedTab);
 });
 
 add_task(async function collapsedOneOffs() {
   // Disable all the engines but the current one, check the oneoffs are
   // collapsed and that moving up selects the last match.
@@ -238,27 +238,27 @@ add_task(async function collapsedOneOffs
   ]});
 
   let typedValue = "foo";
   await promiseAutocompleteResultPopup(typedValue, window, true);
   await waitForAutocompleteResultAt(0);
   assertState(0, -1);
   Assert.ok(gURLBar.popup.oneOffSearchButtons.buttons.collapsed,
     "The one-off buttons should be collapsed");
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   assertState(1, -1);
   await hidePopup();
 });
 
 function assertState(result, oneOff, textValue = undefined) {
   Assert.equal(gURLBar.popup.selectedIndex, result,
                "Expected result should be selected");
   Assert.equal(gURLBar.popup.oneOffSearchButtons.selectedButtonIndex, oneOff,
                "Expected one-off should be selected");
   if (textValue !== undefined) {
     Assert.equal(gURLBar.textValue, textValue, "Expected textValue");
   }
 }
 
 async function hidePopup() {
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await promisePopupHidden(gURLBar.popup);
 }
--- a/browser/base/content/test/urlbar/browser_urlbarOneOffs_searchSuggestions.js
+++ b/browser/base/content/test/urlbar/browser_urlbarOneOffs_searchSuggestions.js
@@ -26,52 +26,52 @@ add_task(async function oneOffReturnAfte
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
 
   let typedValue = "foo";
   await promiseAutocompleteResultPopup(typedValue, window, true);
   await promiseSuggestionsPresent();
   assertState(0, -1, typedValue);
 
   // Down to select the first search suggestion.
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   assertState(1, -1, "foofoo");
 
   // Down to select the next search suggestion.
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   assertState(2, -1, "foobar");
 
   // Alt+Down to select the first one-off.
-  EventUtils.synthesizeKey("VK_DOWN", { altKey: true });
+  EventUtils.synthesizeKey("KEY_ArrowDown", {altKey: true});
   assertState(2, 0, "foobar");
 
   let resultsPromise =
     BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser, false,
                                    `http://mochi.test:8888/?terms=foobar`);
-  EventUtils.synthesizeKey("VK_RETURN", {});
+  EventUtils.synthesizeKey("KEY_Enter");
   await resultsPromise;
 
   await PlacesUtils.history.clear();
   await BrowserTestUtils.removeTab(tab);
 });
 
 // Clicks a one-off engine after selecting a search suggestion.
 add_task(async function oneOffClickAfterSuggestion() {
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
 
   let typedValue = "foo";
   await promiseAutocompleteResultPopup(typedValue, window, true);
   await promiseSuggestionsPresent();
   assertState(0, -1, typedValue);
 
   // Down to select the first search suggestion.
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   assertState(1, -1, "foofoo");
 
   // Down to select the next search suggestion.
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   assertState(2, -1, "foobar");
 
   let oneOffs = gURLBar.popup.oneOffSearchButtons.getSelectableButtons(true);
   let resultsPromise =
     BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser, false,
                                    `http://mochi.test:8888/?terms=foobar`);
   EventUtils.synthesizeMouseAtCenter(oneOffs[0], {});
   await resultsPromise;
@@ -82,21 +82,21 @@ add_task(async function oneOffClickAfter
 
 add_task(async function overridden_engine_not_reused() {
   info("An overridden search suggestion item should not be reused by a search with another engine");
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
     let typedValue = "foo";
     await promiseAutocompleteResultPopup(typedValue, window, true);
     await promiseSuggestionsPresent();
     // Down to select the first search suggestion.
-    EventUtils.synthesizeKey("VK_DOWN", {});
+    EventUtils.synthesizeKey("KEY_ArrowDown");
     assertState(1, -1, "foofoo");
     // ALT+Down to select the second search engine.
-    EventUtils.synthesizeKey("VK_DOWN", { altKey: true });
-    EventUtils.synthesizeKey("VK_DOWN", { altKey: true });
+    EventUtils.synthesizeKey("KEY_ArrowDown", {altKey: true});
+    EventUtils.synthesizeKey("KEY_ArrowDown", {altKey: true});
     assertState(1, 1, "foofoo");
 
     let label = gURLBar.popup.richlistbox.children[gURLBar.popup.richlistbox.selectedIndex].label;
     // Run again the query, check the label has been replaced.
     await promiseAutocompleteResultPopup(typedValue, window, true);
     await promiseSuggestionsPresent();
     assertState(0, -1, "foo");
     let newLabel = gURLBar.popup.richlistbox.children[1].label;
@@ -111,11 +111,11 @@ function assertState(result, oneOff, tex
   Assert.equal(gURLBar.popup.oneOffSearchButtons.selectedButtonIndex, oneOff,
                "Expected one-off should be selected");
   if (textValue !== undefined) {
     Assert.equal(gURLBar.textValue, textValue, "Expected textValue");
   }
 }
 
 async function hidePopup() {
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await promisePopupHidden(gURLBar.popup);
 }
--- a/browser/base/content/test/urlbar/browser_urlbarRevert.js
+++ b/browser/base/content/test/urlbar/browser_urlbarRevert.js
@@ -23,15 +23,15 @@ function checkURLBarRevert() {
 
   gBrowser.userTypedValue = "foobar";
   gBrowser.selectedTab = gBrowser.tabs[0];
   gBrowser.selectedTab = tab;
   is(gURLBar.value, "foobar", "location bar displays typed value");
 
   gURLBar.focus();
 
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
 
   is(gURLBar.value, originalValue, "ESC reverted the location bar value");
 
   gBrowser.removeTab(tab);
   finish();
 }
--- a/browser/base/content/test/urlbar/browser_urlbarSearchSuggestions.js
+++ b/browser/base/content/test/urlbar/browser_urlbarSearchSuggestions.js
@@ -51,19 +51,19 @@ async function testPressEnterOnSuggestio
 
   if (!expectedUrl) {
     expectedUrl = Services.search.currentEngine.getSubmission(suggestion).uri.spec;
   }
 
   let promiseLoad = waitForDocLoadAndStopIt(expectedUrl);
 
   for (let i = 0; i < idx; ++i) {
-    EventUtils.synthesizeKey("VK_DOWN", {});
+    EventUtils.synthesizeKey("KEY_ArrowDown");
   }
-  EventUtils.synthesizeKey("VK_RETURN", keyModifiers);
+  EventUtils.synthesizeKey("KEY_Enter", keyModifiers);
 
   await promiseLoad;
   await BrowserTestUtils.removeTab(tab);
 }
 
 add_task(async function plainEnterOnSuggestion() {
   await testPressEnterOnSuggestion();
 });
@@ -75,23 +75,23 @@ add_task(async function ctrlEnterOnSugge
                                      { ctrlKey: true });
 });
 
 add_task(async function copySuggestionText() {
   gURLBar.focus();
   await promiseAutocompleteResultPopup("foo");
   let [idx, suggestion] = await promiseFirstSuggestion();
   for (let i = 0; i < idx; ++i) {
-    EventUtils.synthesizeKey("VK_DOWN", {});
+    EventUtils.synthesizeKey("KEY_ArrowDown");
   }
   gURLBar.select();
   await new Promise((resolve, reject) => waitForClipboard(suggestion, function() {
     goDoCommand("cmd_copy");
   }, resolve, reject));
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await promisePopupHidden(gURLBar.popup);
 });
 
 function getFirstSuggestion() {
   let controller = gURLBar.popup.input.controller;
   let matchCount = controller.matchCount;
   for (let i = 0; i < matchCount; i++) {
     let url = controller.getValueAt(i);
--- a/browser/base/content/test/urlbar/browser_urlbarSearchSuggestions_opt-out.js
+++ b/browser/base/content/test/urlbar/browser_urlbarSearchSuggestions_opt-out.js
@@ -42,19 +42,17 @@ add_task(async function focus() {
   focusAndSelectUrlBar(true);
   await popupPromise;
   Assert.ok(gURLBar.popup.popupOpen, "popup should be open");
   assertVisible(true);
   assertFooterVisible(false);
   Assert.equal(gURLBar.popup.matchCount, 0, "popup should have no results");
 
   // Start searching.
-  EventUtils.synthesizeKey("r", {});
-  EventUtils.synthesizeKey("n", {});
-  EventUtils.synthesizeKey("d", {});
+  EventUtils.sendString("rnd");
   await promiseSearchComplete();
   Assert.ok(suggestionsPresent());
   assertVisible(true);
   assertFooterVisible(true);
 
   // Check the Change Options link.
   let changeOptionsLink = document.getElementById("search-suggestions-change-settings");
   let prefsPromise = BrowserTestUtils.waitForLocationChange(gBrowser, "about:preferences#search");
--- a/browser/base/content/test/urlbar/browser_urlbar_autoFill_backspaced.js
+++ b/browser/base/content/test/urlbar/browser_urlbar_autoFill_backspaced.js
@@ -6,17 +6,17 @@ async function test_autocomplete(data) {
   let {desc, typed, autofilled, modified, keys, action, onAutoFill} = data;
   info(desc);
 
   await promiseAutocompleteResultPopup(typed);
   is(gURLBar.textValue, autofilled, "autofilled value is as expected");
   if (onAutoFill)
     onAutoFill();
 
-  keys.forEach(key => EventUtils.synthesizeKey(key, {}));
+  keys.forEach(key => EventUtils.synthesizeKey(key));
 
   is(gURLBar.textValue, modified, "backspaced value is as expected");
 
   await promiseSearchComplete();
 
   ok(gURLBar.popup.richlistbox.children.length > 0, "Should get at least 1 result");
   let result = gURLBar.popup.richlistbox.children[0];
   let type = result.getAttribute("type");
@@ -41,103 +41,103 @@ add_task(async function() {
     uri: NetUtil.newURI("http://example.com/"),
     transition: Ci.nsINavHistoryService.TRANSITION_TYPED
   });
 
   await test_autocomplete({ desc: "DELETE the autofilled part should search",
                             typed: "exam",
                             autofilled: "example.com/",
                             modified: "exam",
-                            keys: ["VK_DELETE"],
+                            keys: ["KEY_Delete"],
                             action: "searchengine"
                           });
   await test_autocomplete({ desc: "DELETE the final slash should visit",
                             typed: "example.com",
                             autofilled: "example.com/",
                             modified: "example.com",
-                            keys: ["VK_DELETE"],
+                            keys: ["KEY_Delete"],
                             action: "visiturl"
                           });
 
   await test_autocomplete({ desc: "BACK_SPACE the autofilled part should search",
                             typed: "exam",
                             autofilled: "example.com/",
                             modified: "exam",
-                            keys: ["VK_BACK_SPACE"],
+                            keys: ["KEY_Backspace"],
                             action: "searchengine"
                           });
   await test_autocomplete({ desc: "BACK_SPACE the final slash should visit",
                             typed: "example.com",
                             autofilled: "example.com/",
                             modified: "example.com",
-                            keys: ["VK_BACK_SPACE"],
+                            keys: ["KEY_Backspace"],
                             action: "visiturl"
                           });
 
   await test_autocomplete({ desc: "DELETE the autofilled part, then BACK_SPACE, should search",
                             typed: "exam",
                             autofilled: "example.com/",
                             modified: "exa",
-                            keys: ["VK_DELETE", "VK_BACK_SPACE"],
+                            keys: ["KEY_Delete", "KEY_Backspace"],
                             action: "searchengine"
                           });
   await test_autocomplete({ desc: "DELETE the final slash, then BACK_SPACE, should search",
                             typed: "example.com",
                             autofilled: "example.com/",
                             modified: "example.co",
-                            keys: ["VK_DELETE", "VK_BACK_SPACE"],
+                            keys: ["KEY_Delete", "KEY_Backspace"],
                             action: "visiturl"
                           });
 
   await test_autocomplete({ desc: "BACK_SPACE the autofilled part, then BACK_SPACE, should search",
                             typed: "exam",
                             autofilled: "example.com/",
                             modified: "exa",
-                            keys: ["VK_BACK_SPACE", "VK_BACK_SPACE"],
+                            keys: ["KEY_Backspace", "KEY_Backspace"],
                             action: "searchengine"
                           });
   await test_autocomplete({ desc: "BACK_SPACE the final slash, then BACK_SPACE, should search",
                             typed: "example.com",
                             autofilled: "example.com/",
                             modified: "example.co",
-                            keys: ["VK_BACK_SPACE", "VK_BACK_SPACE"],
+                            keys: ["KEY_Backspace", "KEY_Backspace"],
                             action: "visiturl"
                           });
 
   await test_autocomplete({ desc: "BACK_SPACE after blur should search",
                             typed: "ex",
                             autofilled: "example.com/",
                             modified: "e",
-                            keys: ["VK_BACK_SPACE"],
+                            keys: ["KEY_Backspace"],
                             action: "searchengine",
                             onAutoFill: () => {
                               gURLBar.blur();
                               gURLBar.focus();
                               gURLBar.selectionStart = 1;
                               gURLBar.selectionEnd = 12;
                             }
                          });
   await test_autocomplete({ desc: "DELETE after blur should search",
                             typed: "ex",
                             autofilled: "example.com/",
                             modified: "e",
-                            keys: ["VK_DELETE"],
+                            keys: ["KEY_Delete"],
                             action: "searchengine",
                             onAutoFill: () => {
                               gURLBar.blur();
                               gURLBar.focus();
                               gURLBar.selectionStart = 1;
                               gURLBar.selectionEnd = 12;
                             }
                           });
   await test_autocomplete({ desc: "double BACK_SPACE after blur should search",
                             typed: "ex",
                             autofilled: "example.com/",
                             modified: "e",
-                            keys: ["VK_BACK_SPACE", "VK_BACK_SPACE"],
+                            keys: ["KEY_Backspace", "KEY_Backspace"],
                             action: "searchengine",
                             onAutoFill: () => {
                               gURLBar.blur();
                               gURLBar.focus();
                               gURLBar.selectionStart = 2;
                               gURLBar.selectionEnd = 12;
                             }
                          });
--- a/browser/base/content/test/urlbar/browser_urlbar_canonize_on_autofill.js
+++ b/browser/base/content/test/urlbar/browser_urlbar_canonize_on_autofill.js
@@ -9,17 +9,17 @@ async function test_autocomplete(data) {
   let {desc, typed, autofilled, modified, waitForUrl, keys} = data;
   info(desc);
 
   await promiseAutocompleteResultPopup(typed);
   is(gURLBar.textValue, autofilled, "autofilled value is as expected");
 
   let promiseLoad = waitForDocLoadAndStopIt(waitForUrl);
 
-  keys.forEach(([key, mods]) => EventUtils.synthesizeKey(key, mods || {}));
+  keys.forEach(([key, mods]) => EventUtils.synthesizeKey(key, mods));
 
   is(gURLBar.textValue, modified, "value is as expected");
 
   await promiseLoad;
   gURLBar.blur();
 }
 
 add_task(async function() {
@@ -36,29 +36,29 @@ add_task(async function() {
     transition: Ci.nsINavHistoryService.TRANSITION_TYPED
   });
 
   await test_autocomplete({ desc: "CTRL+ENTER on the autofilled part should use autofill",
                             typed: "exam",
                             autofilled: "example.com/",
                             modified: "example.com/",
                             waitForUrl: "http://example.com/",
-                            keys: [["VK_RETURN", {}]]
+                            keys: [["KEY_Enter"]]
                           });
 
   await test_autocomplete({ desc: "CTRL+ENTER on the autofilled part should bypass autofill",
                             typed: "exam",
                             autofilled: "example.com/",
                             modified: "www.exam.com",
                             waitForUrl: "http://www.exam.com/",
-                            keys: [["VK_RETURN", AppConstants.platform === "macosx" ?
-                                                 { metaKey: true } :
-                                                 { ctrlKey: true }]]
+                            keys: [["KEY_Enter", AppConstants.platform === "macosx" ?
+                                                   {metaKey: true} :
+                                                   {ctrlKey: true}]]
                           });
 
   await test_autocomplete({ desc: "SHIFT+ENTER on the autofilled part should bypass autofill",
                             typed: "exam",
                             autofilled: "example.com/",
                             modified: "www.exam.net",
                             waitForUrl: "http://www.exam.net/",
-                            keys: [["VK_RETURN", { shiftKey: true }]]
+                            keys: [["KEY_Enter", {shiftKey: true}]]
                           });
 });
--- a/browser/base/content/test/urlbar/browser_urlbar_locationchange_urlbar_edit_dos.js
+++ b/browser/base/content/test/urlbar/browser_urlbar_locationchange_urlbar_edit_dos.js
@@ -1,13 +1,13 @@
 "use strict";
 
 async function checkURLBarValueStays(browser) {
   gURLBar.select();
-  EventUtils.synthesizeKey("a", {});
+  EventUtils.sendString("a");
   is(gURLBar.value, "a", "URL bar value should match after sending a key");
   await new Promise(resolve => {
     let listener = {
       onLocationChange(aWebProgress, aRequest, aLocation, aFlags) {
         ok(aFlags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT,
            "Should only get a same document location change");
         gBrowser.selectedBrowser.removeProgressListener(filter);
         filter = null;
--- a/browser/base/content/test/urlbar/browser_urlbar_remove_match.js
+++ b/browser/base/content/test/urlbar/browser_urlbar_remove_match.js
@@ -12,20 +12,20 @@ add_task(async function test_remove_hist
 
   let promiseVisitRemoved = PlacesTestUtils.waitForNotification(
     "onDeleteURI", uri => uri.spec == TEST_URL, "history");
 
   await promiseAutocompleteResultPopup("from_urlbar");
   let result = await waitForAutocompleteResultAt(1);
   Assert.equal(result.getAttribute("ac-value"), TEST_URL, "Found the expected result");
 
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   Assert.equal(gURLBar.popup.richlistbox.selectedIndex, 1);
   let options = AppConstants.platform == "macosx" ? { shiftKey: true } : {};
-  EventUtils.synthesizeKey("VK_DELETE", options);
+  EventUtils.synthesizeKey("KEY_Delete", options);
   await promiseVisitRemoved;
   await BrowserTestUtils.waitForCondition(
     () => !gURLBar.popup.richlistbox.children.some(c => !c.collapsed && c.getAttribute("ac-value") == TEST_URL),
     "Waiting for the result to disappear");
 
   gURLBar.popup.hidePopup();
   await promisePopupHidden(gURLBar.popup);
 });
--- a/browser/base/content/test/urlbar/browser_urlbar_searchsettings.js
+++ b/browser/base/content/test/urlbar/browser_urlbar_searchsettings.js
@@ -9,17 +9,17 @@ add_task(async function() {
     ok("Skipping test");
     return;
   }
 
   await BrowserTestUtils.withNewTab({ gBrowser, url: "about:blank" }, async function() {
     let popupopened = BrowserTestUtils.waitForEvent(gURLBar.popup, "popupshown");
 
     gURLBar.focus();
-    EventUtils.synthesizeKey("a", {});
+    EventUtils.sendString("a");
     await popupopened;
 
     // Since the current tab is blank the preferences pane will load there
     let loaded = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
     let popupclosed = BrowserTestUtils.waitForEvent(gURLBar.popup, "popuphidden");
     EventUtils.synthesizeMouseAtCenter(button, {});
     await loaded;
     await popupclosed;
--- a/browser/components/customizableui/test/browser_901207_searchbar_in_panel.js
+++ b/browser/components/customizableui/test/browser_901207_searchbar_in_panel.js
@@ -21,34 +21,34 @@ add_task(async function() {
 
   let shownPanelPromise = promiseOverflowShown(window);
   sendWebSearchKeyCommand();
   await shownPanelPromise;
 
   await waitForSearchBarFocus();
 
   let hiddenPanelPromise = promiseOverflowHidden(window);
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await hiddenPanelPromise;
   CustomizableUI.reset();
 });
 
 // Ctrl+K should give focus to the searchbar when the searchbar is in the menupanel and the panel is already opened.
 add_task(async function() {
   CustomizableUI.addWidgetToArea("search-container",
                                  CustomizableUI.AREA_FIXED_OVERFLOW_PANEL);
 
   await document.getElementById("nav-bar").overflowable.show();
 
   sendWebSearchKeyCommand();
 
   await waitForSearchBarFocus();
 
   let hiddenPanelPromise = promiseOverflowHidden(window);
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await hiddenPanelPromise;
   CustomizableUI.reset();
 });
 
 // Ctrl+K should open the overflow panel and focus the search bar if the search bar is overflowed.
 add_task(async function() {
   this.originalWindowWidth = window.outerWidth;
   let navbar = document.getElementById(CustomizableUI.AREA_NAVBAR);
@@ -66,17 +66,17 @@ add_task(async function() {
   await shownPanelPromise;
 
   let chevron = document.getElementById("nav-bar-overflow-button");
   await waitForCondition(() => chevron.open);
 
   await waitForSearchBarFocus();
 
   let hiddenPanelPromise = promiseOverflowHidden(window);
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await hiddenPanelPromise;
 
   Services.prefs.setBoolPref("browser.search.widget.inNavBar", false);
 
   navbar = document.getElementById(CustomizableUI.AREA_NAVBAR);
   window.resizeTo(this.originalWindowWidth, window.outerHeight);
   await waitForCondition(() => !navbar.hasAttribute("overflowing"));
   ok(!navbar.hasAttribute("overflowing"), "Should not have an overflowing toolbar.");
@@ -93,19 +93,19 @@ add_task(async function() {
   await waitForSearchBarFocus();
 
   Services.prefs.setBoolPref("browser.search.widget.inNavBar", false);
 });
 
 
 function sendWebSearchKeyCommand() {
   if (Services.appinfo.OS === "Darwin")
-    EventUtils.synthesizeKey("k", { accelKey: true });
+    EventUtils.synthesizeKey("k", {accelKey: true});
   else
-    EventUtils.synthesizeKey("k", { ctrlKey: true });
+    EventUtils.synthesizeKey("k", {ctrlKey: true});
 }
 
 function logActiveElement() {
   let element = document.activeElement;
   let str = "";
   while (element && element.parentNode) {
     str = " (" + element.localName + "#" + element.id + "." + [...element.classList].join(".") + ") >" + str;
     element = element.parentNode;
--- a/browser/components/customizableui/test/browser_940307_panel_click_closure_handling.js
+++ b/browser/components/customizableui/test/browser_940307_panel_click_closure_handling.js
@@ -56,17 +56,17 @@ add_task(async function searchbar_in_pan
   let selectAll = contextmenu.querySelector("[cmd='cmd_selectAll']");
   let contextMenuHidden = promisePanelElementHidden(window, contextmenu);
   EventUtils.synthesizeMouseAtCenter(selectAll, {});
   await contextMenuHidden;
 
   ok(isOverflowOpen(), "Panel should still be open");
 
   let hiddenPanelPromise = promiseOverflowHidden(window);
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await hiddenPanelPromise;
   ok(!isOverflowOpen(), "Panel should no longer be open");
 
   // Allow search bar popup to show again.
   searchbarPopup.removeEventListener("popupshowing", dontShowPopup);
 
   // We focused the search bar earlier - ensure we don't keep doing that.
   gURLBar.select();
--- a/browser/components/customizableui/test/browser_984455_bookmarks_items_reparenting.js
+++ b/browser/components/customizableui/test/browser_984455_bookmarks_items_reparenting.js
@@ -98,17 +98,17 @@ function checkSpecialContextMenus() {
 /**
  * Closes a focused popup by simulating pressing the Escape key,
  * and returns a Promise that resolves as soon as the popup is closed.
  *
  * @param aPopup the popup node to close.
  */
 function closePopup(aPopup) {
   let hiddenPromise = popupHidden(aPopup);
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   return hiddenPromise;
 }
 
 /**
  * Helper function that checks that the context menu of the
  * bookmark toolbar items chevron popup is correctly hooked up
  * to the controller of a view.
  */
--- a/browser/components/customizableui/test/browser_panelUINotifications_fullscreen.js
+++ b/browser/components/customizableui/test/browser_panelUINotifications_fullscreen.js
@@ -14,26 +14,26 @@ add_task(async function testFullscreen()
 
   isnot(PanelUI.notificationPanel.state, "closed", "update-manual doorhanger is showing.");
   let notifications = [...PanelUI.notificationPanel.children].filter(n => !n.hidden);
   is(notifications.length, 1, "PanelUI doorhanger is only displaying one notification.");
   let doorhanger = notifications[0];
   is(doorhanger.id, "appMenu-update-manual-notification", "PanelUI is displaying the update-manual notification.");
 
   let popuphiddenPromise = BrowserTestUtils.waitForEvent(PanelUI.notificationPanel, "popuphidden");
-  EventUtils.synthesizeKey("VK_F11", {});
+  EventUtils.synthesizeKey("KEY_F11");
   await popuphiddenPromise;
   await new Promise(executeSoon);
   is(PanelUI.notificationPanel.state, "closed", "update-manual doorhanger is closed.");
 
   FullScreen.showNavToolbox();
   is(PanelUI.menuButton.getAttribute("badge-status"), "update-manual", "Badge is displaying on PanelUI button.");
 
   let popupshownPromise = BrowserTestUtils.waitForEvent(PanelUI.notificationPanel, "popupshown");
-  EventUtils.synthesizeKey("VK_F11", {});
+  EventUtils.synthesizeKey("KEY_F11");
   await popupshownPromise;
   await new Promise(executeSoon);
   isnot(PanelUI.notificationPanel.state, "closed", "update-manual doorhanger is showing.");
   isnot(PanelUI.menuButton.getAttribute("badge-status"), "update-manual", "Badge is not displaying on PanelUI button.");
 
   let mainActionButton = doc.getAnonymousElementByAttribute(doorhanger, "anonid", "button");
   mainActionButton.click();
   ok(mainActionCalled, "Main action callback was called");
--- a/browser/components/customizableui/test/browser_panelUINotifications_fullscreen_noAutoHideToolbar.js
+++ b/browser/components/customizableui/test/browser_panelUINotifications_fullscreen_noAutoHideToolbar.js
@@ -45,17 +45,17 @@ add_task(async function testFullscreen()
 
   isnot(PanelUI.notificationPanel.state, "closed", "update-manual doorhanger is showing.");
   let notifications = [...PanelUI.notificationPanel.children].filter(n => !n.hidden);
   is(notifications.length, 1, "PanelUI doorhanger is only displaying one notification.");
   let doorhanger = notifications[0];
   is(doorhanger.id, "appMenu-update-manual-notification", "PanelUI is displaying the update-manual notification.");
 
   let fullscreenPromise = waitForFullscreen();
-  EventUtils.synthesizeKey("VK_F11", {});
+  EventUtils.synthesizeKey("KEY_F11");
   await fullscreenPromise;
   isnot(PanelUI.notificationPanel.state, "closed", "update-manual doorhanger is still showing after entering fullscreen.");
 
   let popuphiddenPromise = BrowserTestUtils.waitForEvent(PanelUI.notificationPanel, "popuphidden");
   await ContentTask.spawn(gBrowser.selectedBrowser, {}, async () => {
     content.document.documentElement.requestFullscreen();
   });
   await popuphiddenPromise;
@@ -73,11 +73,11 @@ add_task(async function testFullscreen()
 
   let mainActionButton = document.getAnonymousElementByAttribute(doorhanger, "anonid", "button");
   mainActionButton.click();
   ok(mainActionCalled, "Main action callback was called");
   is(PanelUI.notificationPanel.state, "closed", "update-manual doorhanger is closed.");
   is(PanelUI.menuButton.hasAttribute("badge-status"), false, "Should not have a badge status");
 
   fullscreenPromise = BrowserTestUtils.waitForEvent(window, "fullscreen");
-  EventUtils.synthesizeKey("VK_F11", {});
+  EventUtils.synthesizeKey("KEY_F11");
   await fullscreenPromise;
 });
--- a/browser/components/customizableui/test/browser_panel_keyboard_navigation.js
+++ b/browser/components/customizableui/test/browser_panel_keyboard_navigation.js
@@ -12,30 +12,30 @@ add_task(async function testUpDownKeys()
   PanelUI.show();
   await promise;
 
   let buttons = PanelView.forNode(PanelUI.mainView).getNavigableElements();
 
   for (let button of buttons) {
     if (button.disabled)
       continue;
-    EventUtils.synthesizeKey("KEY_ArrowDown", {});
+    EventUtils.synthesizeKey("KEY_ArrowDown");
     Assert.equal(document.commandDispatcher.focusedElement, button,
       "The correct button should be focused after navigating downward");
   }
 
-  EventUtils.synthesizeKey("KEY_ArrowDown", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   Assert.equal(document.commandDispatcher.focusedElement, buttons[0],
     "Pressing upwards should cycle around and select the first button again");
 
   for (let i = buttons.length - 1; i >= 0; --i) {
     let button = buttons[i];
     if (button.disabled)
       continue;
-    EventUtils.synthesizeKey("KEY_ArrowUp", {});
+    EventUtils.synthesizeKey("KEY_ArrowUp");
     Assert.equal(document.commandDispatcher.focusedElement, button,
       "The first button should be focused after navigating upward");
   }
 
   promise = promisePanelHidden(window);
   PanelUI.hide();
   await promise;
 });
@@ -43,94 +43,94 @@ add_task(async function testUpDownKeys()
 add_task(async function testEnterKeyBehaviors() {
   let promise = promisePanelShown(window);
   PanelUI.show();
   await promise;
 
   let buttons = PanelView.forNode(PanelUI.mainView).getNavigableElements();
 
   // Navigate to the 'Help' button, which points to a subview.
-  EventUtils.synthesizeKey("KEY_ArrowUp", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   let focusedElement = document.commandDispatcher.focusedElement;
   Assert.equal(focusedElement, buttons[buttons.length - 1],
     "The last button should be focused after navigating upward");
 
   promise = BrowserTestUtils.waitForEvent(PanelUI.helpView, "ViewShown");
   // Make sure the Help button is in focus.
   while (!focusedElement || !focusedElement.id || focusedElement.id != kHelpButtonId) {
-    EventUtils.synthesizeKey("KEY_ArrowUp", {});
+    EventUtils.synthesizeKey("KEY_ArrowUp");
     focusedElement = document.commandDispatcher.focusedElement;
   }
-  EventUtils.synthesizeKey("KEY_Enter", {});
+  EventUtils.synthesizeKey("KEY_Enter");
   await promise;
 
   let helpButtons = PanelView.forNode(PanelUI.helpView).getNavigableElements();
   Assert.ok(helpButtons[0].classList.contains("subviewbutton-back"),
     "First button in help view should be a back button");
 
   // For posterity, check navigating the subview using up/ down arrow keys as well.
   for (let i = helpButtons.length - 1; i >= 0; --i) {
     let button = helpButtons[i];
     if (button.disabled)
       continue;
-    EventUtils.synthesizeKey("KEY_ArrowUp", {});
+    EventUtils.synthesizeKey("KEY_ArrowUp");
     focusedElement = document.commandDispatcher.focusedElement;
     Assert.equal(focusedElement, button, "The first button should be focused after navigating upward");
   }
 
   // Make sure the back button is in focus again.
   while (focusedElement != helpButtons[0]) {
-    EventUtils.synthesizeKey("KEY_ArrowDown", {});
+    EventUtils.synthesizeKey("KEY_ArrowDown");
     focusedElement = document.commandDispatcher.focusedElement;
   }
 
   // The first button is the back button. Hittin Enter should navigate us back.
   promise = BrowserTestUtils.waitForEvent(PanelUI.mainView, "ViewShown");
-  EventUtils.synthesizeKey("KEY_Enter", {});
+  EventUtils.synthesizeKey("KEY_Enter");
   await promise;
 
   // Let's test a 'normal' command button.
   focusedElement = document.commandDispatcher.focusedElement;
   const kFindButtonId = "appMenu-find-button";
   while (!focusedElement || !focusedElement.id || focusedElement.id != kFindButtonId) {
-    EventUtils.synthesizeKey("KEY_ArrowUp", {});
+    EventUtils.synthesizeKey("KEY_ArrowUp");
     focusedElement = document.commandDispatcher.focusedElement;
   }
   Assert.equal(focusedElement.id, kFindButtonId, "Find button should be selected");
 
   promise = promisePanelHidden(window);
-  EventUtils.synthesizeKey("KEY_Enter", {});
+  EventUtils.synthesizeKey("KEY_Enter");
   await promise;
 
   Assert.ok(!gFindBar.hidden, "Findbar should have opened");
   gFindBar.close();
 });
 
 add_task(async function testLeftRightKeys() {
   let promise = promisePanelShown(window);
   PanelUI.show();
   await promise;
 
   // Navigate to the 'Help' button, which points to a subview.
   let focusedElement = document.commandDispatcher.focusedElement;
   while (!focusedElement || !focusedElement.id || focusedElement.id != kHelpButtonId) {
-    EventUtils.synthesizeKey("KEY_ArrowUp", {});
+    EventUtils.synthesizeKey("KEY_ArrowUp");
     focusedElement = document.commandDispatcher.focusedElement;
   }
   Assert.equal(focusedElement.id, kHelpButtonId, "The last button should be focused after navigating upward");
 
   // Hitting ArrowRight on a button that points to a subview should navigate us
   // there.
   promise = BrowserTestUtils.waitForEvent(PanelUI.helpView, "ViewShown");
-  EventUtils.synthesizeKey("KEY_ArrowRight", {});
+  EventUtils.synthesizeKey("KEY_ArrowRight");
   await promise;
 
   // Hitting ArrowLeft should navigate us back.
   promise = BrowserTestUtils.waitForEvent(PanelUI.mainView, "ViewShown");
-  EventUtils.synthesizeKey("KEY_ArrowLeft", {});
+  EventUtils.synthesizeKey("KEY_ArrowLeft");
   await promise;
 
   focusedElement = document.commandDispatcher.focusedElement;
   Assert.equal(focusedElement.id, kHelpButtonId,
                "Help button should be focused again now that we're back in the main view");
 
   promise = promisePanelHidden(window);
   PanelUI.hide();
@@ -142,22 +142,22 @@ add_task(async function testTabKey() {
   PanelUI.show();
   await promise;
 
   let buttons = PanelView.forNode(PanelUI.mainView).getNavigableElements();
 
   for (let button of buttons) {
     if (button.disabled)
       continue;
-    EventUtils.synthesizeKey("KEY_Tab", {});
+    EventUtils.synthesizeKey("KEY_Tab");
     Assert.equal(document.commandDispatcher.focusedElement, button,
       "The correct button should be focused after tabbing");
   }
 
-  EventUtils.synthesizeKey("KEY_Tab", {});
+  EventUtils.synthesizeKey("KEY_Tab");
   Assert.equal(document.commandDispatcher.focusedElement, buttons[0],
     "Pressing tab should cycle around and select the first button again");
 
   for (let i = buttons.length - 1; i >= 0; --i) {
     let button = buttons[i];
     if (button.disabled)
       continue;
     EventUtils.synthesizeKey("Tab", {shiftKey: true});
@@ -181,19 +181,19 @@ add_task(async function testInterleavedT
 
   let buttons = PanelView.forNode(PanelUI.mainView).getNavigableElements();
   let tab = false;
 
   for (let button of buttons) {
     if (button.disabled)
       continue;
     if (tab) {
-      EventUtils.synthesizeKey("KEY_Tab", {});
+      EventUtils.synthesizeKey("KEY_Tab");
     } else {
-      EventUtils.synthesizeKey("KEY_ArrowDown", {});
+      EventUtils.synthesizeKey("KEY_ArrowDown");
     }
     tab = !tab;
   }
 
   Assert.equal(document.commandDispatcher.focusedElement, buttons[buttons.length - 1],
     "The last button should be focused after a mix of Tab and ArrowDown");
 
   promise = promisePanelHidden(window);
@@ -207,17 +207,17 @@ add_task(async function testSpaceDownAft
   await promise;
 
   let buttons = PanelView.forNode(PanelUI.mainView).getNavigableElements();
   let button;
 
   for (button of buttons) {
     if (button.disabled)
       continue;
-    EventUtils.synthesizeKey("KEY_Tab", {});
+    EventUtils.synthesizeKey("KEY_Tab");
     if (button.id == kHelpButtonId) {
       break;
     }
   }
 
   Assert.equal(document.commandDispatcher.focusedElement, button,
                "Help button should be focused after tabbing to it.");
 
--- a/browser/components/extensions/test/browser/browser_ext_omnibox.js
+++ b/browser/components/extensions/test/browser/browser_ext_omnibox.js
@@ -106,88 +106,82 @@ add_task(async function() {
       await new Promise(r => window.requestIdleCallback(r, {timeout: 1000}));
     }
   }
 
   let inputSessionSerial = 0;
   async function startInputSession(indexToWaitFor) {
     gURLBar.focus();
     gURLBar.value = keyword;
-    EventUtils.synthesizeKey(" ", {});
+    EventUtils.sendString(" ");
     await expectEvent("on-input-started-fired");
     // Always use a different input at every invokation, so that
     // waitForAutocompleteResultAt can distinguish different cases.
     let char = ((inputSessionSerial++) % 10).toString();
-    EventUtils.synthesizeKey(char, {});
+    EventUtils.sendString(char);
 
     await expectEvent("on-input-changed-fired", {text: char});
     // Wait for the autocomplete search. Note that we cannot wait for the search
     // to be complete, since the add-on doesn't communicate when it's done, so
     // just check matches count.
     await waitForAutocompleteResultAt(indexToWaitFor);
 
     return char;
   }
 
   async function testInputEvents() {
     gURLBar.focus();
 
     // Start an input session by typing in <keyword><space>.
-    for (let letter of keyword) {
-      EventUtils.synthesizeKey(letter, {});
-    }
-    EventUtils.synthesizeKey(" ", {});
+    EventUtils.sendString(keyword + " ");
     await expectEvent("on-input-started-fired");
 
     // Test canceling the input before any changed events fire.
-    EventUtils.synthesizeKey("VK_BACK_SPACE", {});
+    EventUtils.synthesizeKey("KEY_Backspace");
     await expectEvent("on-input-cancelled-fired");
 
-    EventUtils.synthesizeKey(" ", {});
+    EventUtils.sendString(" ");
     await expectEvent("on-input-started-fired");
 
     // Test submitting the input before any changed events fire.
-    EventUtils.synthesizeKey("VK_RETURN", {});
+    EventUtils.synthesizeKey("KEY_Enter");
     await expectEvent("on-input-entered-fired");
 
     gURLBar.focus();
 
     // Start an input session by typing in <keyword><space>.
-    for (let letter of keyword) {
-      EventUtils.synthesizeKey(letter, {});
-    }
-    EventUtils.synthesizeKey(" ", {});
+    EventUtils.sendString(keyword + " ");
     await expectEvent("on-input-started-fired");
 
     // We should expect input changed events now that the keyword is active.
-    EventUtils.synthesizeKey("b", {});
+    EventUtils.sendString("b");
     await expectEvent("on-input-changed-fired", {text: "b"});
 
-    EventUtils.synthesizeKey("c", {});
+    EventUtils.sendString("c");
     await expectEvent("on-input-changed-fired", {text: "bc"});
 
-    EventUtils.synthesizeKey("VK_BACK_SPACE", {});
+    EventUtils.synthesizeKey("KEY_Backspace");
     await expectEvent("on-input-changed-fired", {text: "b"});
 
     // Even though the input is <keyword><space> We should not expect an
     // input started event to fire since the keyword is active.
-    EventUtils.synthesizeKey("VK_BACK_SPACE", {});
+    EventUtils.synthesizeKey("KEY_Backspace");
     await expectEvent("on-input-changed-fired", {text: ""});
 
     // Make the keyword inactive by hitting backspace.
-    EventUtils.synthesizeKey("VK_BACK_SPACE", {});
+    EventUtils.synthesizeKey("KEY_Backspace");
     await expectEvent("on-input-cancelled-fired");
 
     // Activate the keyword by typing a space.
     // Expect onInputStarted to fire.
-    EventUtils.synthesizeKey(" ", {});
+    EventUtils.sendString(" ");
     await expectEvent("on-input-started-fired");
 
     // onInputChanged should fire even if a space is entered.
-    EventUtils.synthesizeKey(" ", {});
+    EventUtils.sendString(" ");
     await expectEvent("on-input-changed-fired", {text: " "});
 
     // The active session should cancel if the input blurs.
     gURLBar.blur();
     await expectEvent("on-input-cancelled-fired");
   }
 
   async function testHeuristicResult(expectedText, setDefaultSuggestion) {
@@ -217,19 +211,17 @@ add_task(async function() {
     await promiseClickOnItem(item, {});
     await promiseEvent;
   }
 
   async function testDisposition(suggestionIndex, expectedDisposition, expectedText) {
     await startInputSession(suggestionIndex);
 
     // Select the suggestion.
-    for (let i = 0; i < suggestionIndex; i++) {
-      EventUtils.synthesizeKey("VK_DOWN", {});
-    }
+    EventUtils.synthesizeKey("KEY_ArrowDown", {repeat: suggestionIndex});
 
     let promiseEvent = expectEvent("on-input-entered-fired", {
       text: expectedText,
       disposition: expectedDisposition,
     });
 
     let item = gURLBar.popup.richlistbox.children[suggestionIndex];
     if (expectedDisposition == "currentTab") {
--- a/browser/components/places/tests/browser/browser_bookmarklet_windowOpen.js
+++ b/browser/components/places/tests/browser/browser_bookmarklet_windowOpen.js
@@ -41,17 +41,17 @@ add_task(async function openKeywordBookm
       PlacesUtils.bookmarks.remove(bookmarkInfo),
       PlacesUtils.keywords.remove(keywordForBM)
     ]);
   });
   gURLBar.value = keywordForBM;
   gURLBar.focus();
 
   let tabCreatedPromise = BrowserTestUtils.waitForEvent(gBrowser.tabContainer, "TabOpen");
-  EventUtils.synthesizeKey("VK_RETURN", {});
+  EventUtils.synthesizeKey("KEY_Enter");
 
   info("Waiting for tab being created");
   let {target: tab} = await tabCreatedPromise;
   info("Got tab");
   let browser = tab.linkedBrowser;
   if (!browser.currentURI || browser.currentURI.spec != TEST_URL) {
     info("Waiting for browser load");
     await BrowserTestUtils.browserLoaded(browser, false, TEST_URL);
--- a/browser/components/places/tests/browser/browser_stayopenmenu.js
+++ b/browser/components/places/tests/browser/browser_stayopenmenu.js
@@ -17,19 +17,19 @@ async function locateBookmarkAndTestCtrl
 
 async function testContextmenu(menuitem) {
   let doc = menuitem.ownerDocument;
   let cm = doc.getElementById("placesContext");
   let promiseEvent = BrowserTestUtils.waitForEvent(cm, "popupshown");
   EventUtils.synthesizeMouseAtCenter(menuitem, {type: "contextmenu", button: 2});
   await promiseEvent;
   let promiseTabOpened = BrowserTestUtils.waitForNewTab(gBrowser, null);
-  EventUtils.synthesizeKey("KEY_ArrowDown", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   BrowserTestUtils.waitForEvent(menuitem, "DOMMenuItemActive");
-  EventUtils.synthesizeKey("KEY_ArrowDown", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   BrowserTestUtils.waitForEvent(menuitem, "DOMMenuItemActive");
   EventUtils.sendKey("return");
   let newTab = await promiseTabOpened;
   return newTab;
 }
 
 add_task(async function test_setup() {
   // Ensure BMB is available in UI.
--- a/browser/components/places/tests/browser/browser_toolbarbutton_menu_context.js
+++ b/browser/components/places/tests/browser/browser_toolbarbutton_menu_context.js
@@ -32,17 +32,17 @@ async function checkPopupContextMenu() {
   ok(!newBookmarkItem.hasAttribute("disabled"), "New bookmark item shouldn't be disabled");
   let contextMenuHiddenPromise = onPopupEvent(contextMenu, "hidden");
   contextMenu.hidePopup();
   BMB_menuPopup.removeAttribute("style");
   info("Waiting for context menu on bookmarks menu to be hidden.");
   await contextMenuHiddenPromise;
   let popupHiddenPromise = onPopupEvent(BMB_menuPopup, "hidden");
   // Can't use synthesizeMouseAtCenter because the dropdown panel is in the way
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   info("Waiting for bookmarks menu to be hidden.");
   await popupHiddenPromise;
 }
 
 function onPopupEvent(popup, evt) {
   let fullEvent = "popup" + evt;
   return new Promise(resolve => {
     let onPopupHandler = (e) => {
--- a/browser/components/places/tests/chrome/test_editBookmarkOverlay_keywords.xul
+++ b/browser/components/places/tests/chrome/test_editBookmarkOverlay_keywords.xul
@@ -75,18 +75,18 @@
         let node = await PlacesUIUtils.promiseNodeLikeFromFetchInfo(bm);
         gEditItemOverlay.initPanel({ node });
         is(document.getElementById("editBMPanel_keywordField").value, "",
           "The keyword field should be empty");
         info("Add a keyword to the bookmark");
         let promise = promiseOnItemChanged();
         keywordField.focus();
         keywordField.value = "kw";
-        synthesizeKey(i.toString(), {});
-        synthesizeKey("VK_RETURN", {});
+        sendString(i.toString());
+        synthesizeKey("KEY_Enter");
         keywordField.blur();
         let {property, value} = await promise;
         is(property, "keyword", "The keyword should have been changed");
         is(value, `kw${i}`, "The new keyword value is correct");
       }
 
       for (let i = 0; i < 2; ++i) {
         let entry = await PlacesUtils.keywords.fetch({ url: `http://www.test${i}.me/` });
--- a/browser/components/preferences/in-content/tests/browser_bug1184989_prevent_scrolling_when_preferences_flipped.js
+++ b/browser/components/preferences/in-content/tests/browser_bug1184989_prevent_scrolling_when_preferences_flipped.js
@@ -11,52 +11,52 @@ add_task(async function() {
   await BrowserTestUtils.withNewTab({ gBrowser, url: tabURL }, async function(browser) {
     // eslint-disable-next-line mozilla/no-cpows-in-tests
     let doc = browser.contentDocument;
     let container = doc.getElementById("container");
 
     // Test button
     let button = doc.getElementById("button");
     button.focus();
-    EventUtils.synthesizeKey(" ", {});
+    EventUtils.sendString(" ");
     await checkPageScrolling(container, "button");
 
     // Test checkbox
     let checkbox = doc.getElementById("checkbox");
     checkbox.focus();
-    EventUtils.synthesizeKey(" ", {});
+    EventUtils.sendString(" ");
     ok(checkbox.checked, "Checkbox is checked");
     await checkPageScrolling(container, "checkbox");
 
     // Test listbox
     let listbox = doc.getElementById("listbox");
     let listitem = doc.getElementById("listitem");
     listbox.focus();
-    EventUtils.synthesizeKey(" ", {});
+    EventUtils.sendString(" ");
     ok(listitem.selected, "Listitem is selected");
     await checkPageScrolling(container, "listbox");
 
     // Test radio
     let radiogroup = doc.getElementById("radiogroup");
     radiogroup.focus();
-    EventUtils.synthesizeKey(" ", {});
+    EventUtils.sendString(" ");
     await checkPageScrolling(container, "radio");
   });
 
   await BrowserTestUtils.withNewTab({ gBrowser, url: "about:preferences#search" }, async function(browser) {
     // eslint-disable-next-line mozilla/no-cpows-in-tests
     let doc = browser.contentDocument;
     let container = doc.getElementsByClassName("main-content")[0];
 
     // Test search
     let engineList = doc.getElementById("engineList");
     engineList.focus();
-    EventUtils.synthesizeKey(" ", {});
+    EventUtils.sendString(" ");
     is(engineList.view.selection.currentIndex, 0, "Search engineList is selected");
-    EventUtils.synthesizeKey(" ", {});
+    EventUtils.sendString(" ");
     await checkPageScrolling(container, "search engineList");
   });
 
   // Test session restore
   const CRASH_URL = "about:mozilla";
   const CRASH_FAVICON = "chrome://branding/content/icon32.png";
   const CRASH_SHENTRY = {url: CRASH_URL};
   const CRASH_TAB = {entries: [CRASH_SHENTRY], image: CRASH_FAVICON};
@@ -75,17 +75,17 @@ add_task(async function() {
   await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
   let doc = tab.linkedBrowser.contentDocument;
 
   // Make body scrollable
   doc.body.style.height = (doc.body.clientHeight + 100) + "px";
 
   let tabsToggle = doc.getElementById("tabsToggle");
   tabsToggle.focus();
-  EventUtils.synthesizeKey(" ", {});
+  EventUtils.sendString(" ");
   await checkPageScrolling(doc.documentElement, "session restore");
 
   gBrowser.removeCurrentTab();
   finish();
 });
 
 function checkPageScrolling(container, type) {
   return new Promise(resolve => {
--- a/browser/components/preferences/in-content/tests/browser_cookies_dialog.js
+++ b/browser/components/preferences/in-content/tests/browser_cookies_dialog.js
@@ -28,19 +28,19 @@ add_task(async function testDeleteCookie
   Services.cookies.add(URI.host, URI.pathQueryRef, "", "", false, false, true, Date.now());
 
   let tree = doc.getElementById("cookiesList");
   Assert.equal(tree.view.rowCount, 1, "Row count should initially be 1");
   tree.focus();
   tree.view.selection.select(0);
 
   if (AppConstants.platform == "macosx") {
-    EventUtils.synthesizeKey("VK_BACK_SPACE", {});
+    EventUtils.synthesizeKey("KEY_Backspace");
   } else {
-    EventUtils.synthesizeKey("VK_DELETE", {});
+    EventUtils.synthesizeKey("KEY_Delete");
   }
 
   await TestUtils.waitForCondition(() => tree.view.rowCount == 0);
 
   // eslint-disable-next-line mozilla/no-cpows-in-tests
   is_element_visible(content.gSubDialog._dialogs[0]._box,
     "Subdialog is visible after deleting an element");
 
--- a/browser/components/preferences/in-content/tests/browser_password_management.js
+++ b/browser/components/preferences/in-content/tests/browser_password_management.js
@@ -54,19 +54,19 @@ add_task(async function test_deletePassw
   let doc = passwordsDialog.document;
 
   let tree = doc.getElementById("signonsTree");
   Assert.equal(tree.view.rowCount, 1, "Row count should initially be 1");
   tree.focus();
   tree.view.selection.select(0);
 
   if (AppConstants.platform == "macosx") {
-    EventUtils.synthesizeKey("VK_BACK_SPACE", {});
+    EventUtils.synthesizeKey("KEY_Backspace");
   } else {
-    EventUtils.synthesizeKey("VK_DELETE", {});
+    EventUtils.synthesizeKey("KEY_Delete");
   }
 
   await TestUtils.waitForCondition(() => tree.view.rowCount == 0);
 
   // eslint-disable-next-line mozilla/no-cpows-in-tests
   is_element_visible(content.gSubDialog._dialogs[0]._box,
     "Subdialog is visible after deleting an element");
 });
--- a/browser/components/preferences/in-content/tests/browser_site_login_exceptions.js
+++ b/browser/components/preferences/in-content/tests/browser_site_login_exceptions.js
@@ -59,19 +59,19 @@ add_task(async function deleteALoginExce
   let doc = exceptionsDialog.document;
 
   let tree = doc.getElementById("permissionsTree");
   Assert.equal(tree.view.rowCount, 1, "Row count should initially be 1");
   tree.focus();
   tree.view.selection.select(0);
 
   if (AppConstants.platform == "macosx") {
-    EventUtils.synthesizeKey("VK_BACK_SPACE", {});
+    EventUtils.synthesizeKey("KEY_Backspace");
   } else {
-    EventUtils.synthesizeKey("VK_DELETE", {});
+    EventUtils.synthesizeKey("KEY_Delete");
   }
 
   await TestUtils.waitForCondition(() => tree.view.rowCount == 0);
 
   // eslint-disable-next-line mozilla/no-cpows-in-tests
   is_element_visible(content.gSubDialog._dialogs[0]._box,
     "Subdialog is visible after deleting an element");
 });
--- a/browser/components/search/test/browser_426329.js
+++ b/browser/components/search/test/browser_426329.js
@@ -130,27 +130,27 @@ add_task(async function testSetup() {
 });
 
 add_task(async function testSetupEngine() {
   await promiseSetEngine();
 });
 
 add_task(async function testReturn() {
   await prepareTest();
-  EventUtils.synthesizeKey("VK_RETURN", {});
+  EventUtils.synthesizeKey("KEY_Enter");
   await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
 
   is(gBrowser.tabs.length, preTabNo, "Return key did not open new tab");
   is(gBrowser.currentURI.spec, expectedURL(searchBar.value), "testReturn opened correct search page");
 });
 
 add_task(async function testAltReturn() {
   await prepareTest();
   await BrowserTestUtils.openNewForegroundTab(gBrowser, () => {
-    EventUtils.synthesizeKey("VK_RETURN", { altKey: true });
+    EventUtils.synthesizeKey("KEY_Enter", {altKey: true});
   });
 
   is(gBrowser.tabs.length, preTabNo + 1, "Alt+Return key added new tab");
   is(gBrowser.currentURI.spec, expectedURL(searchBar.value), "testAltReturn opened correct search page");
 });
 
 // Shift key has no effect for now, so skip it
 add_task(async function testShiftAltReturn() {
@@ -232,17 +232,17 @@ add_task(async function testAutocomplete
 
 add_task(async function testClearHistory() {
   // Open the textbox context menu to trigger controller attachment.
   let textbox = searchBar.textbox;
   let popupShownPromise = BrowserTestUtils.waitForEvent(textbox, "popupshown");
   EventUtils.synthesizeMouseAtCenter(textbox, { type: "contextmenu", button: 2 });
   await popupShownPromise;
   // Close the context menu.
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
 
   let controller = searchBar.textbox.controllers.getControllerForCommand("cmd_clearhistory");
   ok(controller.isCommandEnabled("cmd_clearhistory"), "Clear history command enabled");
 
   let historyCleared = promiseObserver("satchel-storage-changed");
   controller.doCommand("cmd_clearhistory");
   await historyCleared;
   let count = await countEntries();
--- a/browser/components/search/test/browser_google_behavior.js
+++ b/browser/components/search/test/browser_google_behavior.js
@@ -133,37 +133,37 @@ async function testSearchEngine(engineDe
       }
     },
     {
       name: "keyword search",
       searchURL: base + engineDetails.codes.keyword,
       run() {
         gURLBar.value = "? foo";
         gURLBar.focus();
-        EventUtils.synthesizeKey("VK_RETURN", {});
+        EventUtils.synthesizeKey("KEY_Enter");
       }
     },
     {
       name: "keyword search with alias",
       searchURL: base + engineDetails.codes.keyword,
       run() {
         gURLBar.value = `${engineDetails.alias} foo`;
         gURLBar.focus();
-        EventUtils.synthesizeKey("VK_RETURN", {});
+        EventUtils.synthesizeKey("KEY_Enter");
       }
     },
     {
       name: "search bar search",
       searchURL: base + engineDetails.codes.submission,
       run() {
         Services.prefs.setBoolPref("browser.search.widget.inNavBar", true);
         let sb = BrowserSearch.searchBar;
         sb.focus();
         sb.value = "foo";
-        EventUtils.synthesizeKey("VK_RETURN", {});
+        EventUtils.synthesizeKey("KEY_Enter");
       },
       postTest() {
         BrowserSearch.searchBar.value = "";
         Services.prefs.setBoolPref("browser.search.widget.inNavBar", false);
       }
     },
     {
       name: "new tab search",
@@ -176,17 +176,17 @@ async function testSearchEngine(engineDe
         await promiseContentSearchReady(browser);
       },
       async run(tab) {
         await ContentTask.spawn(tab.linkedBrowser, {}, async function(args) {
           let input = content.document.querySelector("input[id*=search-]");
           input.focus();
           input.value = "foo";
         });
-        EventUtils.synthesizeKey("VK_RETURN", {});
+        EventUtils.synthesizeKey("KEY_Enter");
       }
     }
   ];
 
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
 
   for (let test of engineTests) {
     info(`Running: ${test.name}`);
--- a/browser/components/search/test/browser_healthreport.js
+++ b/browser/components/search/test/browser_healthreport.js
@@ -42,17 +42,17 @@ function test() {
         Assert.ok(histogramKey in hs, "The histogram must contain the correct key");
         Assert.equal(hs[histogramKey].sum, numSearchesBefore + 1,
                      "Performing a search increments the related SEARCH_COUNTS key by 1.");
 
         let fooEngine = Services.search.getEngineByName("Foo");
         Services.search.removeEngine(fooEngine);
       }
 
-      EventUtils.synthesizeKey("VK_RETURN", {});
+      EventUtils.synthesizeKey("KEY_Enter");
       executeSoon(() => executeSoon(afterSearch));
   }
 
   function observer(subject, topic, data) {
     switch (data) {
       case "engine-added":
         let engine = Services.search.getEngineByName("Foo");
         ok(engine, "Engine was added.");
--- a/browser/components/search/test/browser_hiddenOneOffs_diacritics.js
+++ b/browser/components/search/test/browser_hiddenOneOffs_diacritics.js
@@ -39,17 +39,17 @@ add_task(async function test_hidden() {
   EventUtils.synthesizeMouseAtCenter(searchIcon, {});
   await promise;
 
   ok(!getOneOffs().some(x => x.getAttribute("tooltiptext") == diacritic_engine),
      "Search engines with diacritics are hidden when added to hiddenOneOffs preference.");
 
   promise = promiseEvent(searchPopup, "popuphidden");
   info("Closing search panel");
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await promise;
 });
 
 add_task(async function test_shown() {
   Preferences.set("browser.search.hiddenOneOffs", "");
 
   let promise = promiseEvent(searchPopup, "popupshown");
   info("Opening search panel");
--- a/browser/components/search/test/browser_oneOffContextMenu.js
+++ b/browser/components/search/test/browser_oneOffContextMenu.js
@@ -69,17 +69,17 @@ async function doTest() {
   // Click the Search in New Tab menu item.
   promise = BrowserTestUtils.waitForNewTab(gBrowser);
   EventUtils.synthesizeMouseAtCenter(searchInNewTabMenuItem, {});
   let tab = await promise;
 
   // By default the search will open in the background and the popup will stay open:
   promise = promiseEvent(searchPopup, "popuphidden");
   info("Closing search panel");
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await promise;
 
   // Check the loaded tab.
   Assert.equal(tab.linkedBrowser.currentURI.spec,
                "http://mochi.test:8888/browser/browser/components/search/test/",
                "Expected search tab should have loaded");
 
   await BrowserTestUtils.removeTab(tab);
--- a/browser/components/search/test/browser_oneOffContextMenu_setDefault.js
+++ b/browser/components/search/test/browser_oneOffContextMenu_setDefault.js
@@ -145,17 +145,17 @@ async function openPopupAndGetEngineButt
 
   // We have to open the popups in differnt ways.
   if (isSearch) {
     // Use the search icon to avoid hitting the network.
     EventUtils.synthesizeMouseAtCenter(searchIcon, {});
   } else {
     // There's no history at this stage, so we need to press a key.
     urlbar.focus();
-    EventUtils.synthesizeKey("a", {});
+    EventUtils.sendString("a");
   }
   await promise;
 
   const contextMenu = document.getAnonymousElementByAttribute(
     oneOffBinding, "anonid", "search-one-offs-context-menu"
   );
   const oneOffButtons = document.getAnonymousElementByAttribute(
     oneOffBinding, "anonid", "search-panel-one-offs"
@@ -190,14 +190,14 @@ async function openPopupAndGetEngineButt
 /**
  * Closes the popup and moves the mouse away from it.
  *
  * @param {Button} popup The popup to close.
  */
 async function promiseClosePopup(popup) {
   // close the panel using the escape key.
   let promise = promiseEvent(popup, "popuphidden");
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await promise;
 
   // Move the cursor out of the panel area to avoid messing with other tests.
   await EventUtils.synthesizeNativeMouseMove(popup);
 }
--- a/browser/components/search/test/browser_oneOffHeader.js
+++ b/browser/components/search/test/browser_oneOffHeader.js
@@ -89,17 +89,17 @@ add_task(async function test_notext() {
   await synthesizeNativeMouseMove(buttons[0]);
   is(header.getAttribute("selectedIndex"), 2,
      "Header has the correct index selected when a search engine has been selected");
   is(getHeaderText(), "Search " + buttons[0].engine.name,
      "Is the header text correct when a search engine is selected and no terms have been entered.");
 
   promise = promiseEvent(searchPopup, "popuphidden");
   info("Closing search panel");
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await promise;
 });
 
 add_task(async function test_text() {
   searchbar._textbox.value = "foo";
   registerCleanupFunction(() => {
     searchbar._textbox.value = "";
   });
--- a/browser/components/search/test/browser_searchEngine_behaviors.js
+++ b/browser/components/search/test/browser_searchEngine_behaviors.js
@@ -154,39 +154,39 @@ async function testSearchEngine(engineDe
       }
     },
     {
       name: "keyword search",
       searchURL: base + engineDetails.codes.keyword,
       run() {
         gURLBar.value = "? foo";
         gURLBar.focus();
-        EventUtils.synthesizeKey("VK_RETURN", {});
+        EventUtils.synthesizeKey("KEY_Enter");
       }
     },
     {
       name: "keyword search with alias",
       searchURL: base + engineDetails.codes.keyword,
       run() {
         gURLBar.value = `${engineDetails.alias} foo`;
         gURLBar.focus();
-        EventUtils.synthesizeKey("VK_RETURN", {});
+        EventUtils.synthesizeKey("KEY_Enter");
       }
     },
     {
       name: "search bar search",
       searchURL: base + engineDetails.codes.submission,
       run() {
         let sb = BrowserSearch.searchBar;
         sb.focus();
         sb.value = "foo";
         registerCleanupFunction(function() {
           sb.value = "";
         });
-        EventUtils.synthesizeKey("VK_RETURN", {});
+        EventUtils.synthesizeKey("KEY_Enter");
       }
     },
     {
       name: "new tab search",
       searchURL: base + engineDetails.codes.newTab,
       async preTest(tab) {
         let browser = tab.linkedBrowser;
         await BrowserTestUtils.loadURI(browser, "about:newtab");
@@ -195,17 +195,17 @@ async function testSearchEngine(engineDe
         await promiseContentSearchReady(browser);
       },
       async run(tab) {
         await ContentTask.spawn(tab.linkedBrowser, {}, async function(args) {
           let input = content.document.querySelector("input[id*=search-]");
           input.focus();
           input.value = "foo";
         });
-        EventUtils.synthesizeKey("VK_RETURN", {});
+        EventUtils.synthesizeKey("KEY_Enter");
       }
     }
   ];
 
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
 
   for (let test of engineTests) {
     info(`Running: ${test.name}`);
--- a/browser/components/search/test/browser_searchbar_keyboard_navigation.js
+++ b/browser/components/search/test/browser_searchbar_keyboard_navigation.js
@@ -87,117 +87,117 @@ add_task(async function test_arrows() {
   // than 4 default engines, but it's safer to check this assumption.
   let oneOffs = getOneOffs();
   ok(oneOffs.length >= 4, "we have at least 4 one-off buttons displayed");
 
   ok(!textbox.selectedButton, "no one-off button should be selected");
 
   // The down arrow should first go through the suggestions.
   for (let i = 0; i < kValues.length; ++i) {
-    EventUtils.synthesizeKey("VK_DOWN", {});
+    EventUtils.synthesizeKey("KEY_ArrowDown");
     is(searchPopup.selectedIndex, i,
        "the suggestion at index " + i + " should be selected");
     is(textbox.value, kValues[i],
        "the textfield value should be " + kValues[i]);
   }
 
   // Pressing down again should remove suggestion selection and change the text
   // field value back to what the user typed, and select the first one-off.
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   is(textbox.value, kUserValue,
      "the textfield value should be back to initial value");
 
   // now cycle through the one-off items, the first one is already selected.
   for (let i = 0; i < oneOffs.length; ++i) {
     is(textbox.selectedButton, oneOffs[i],
        "the one-off button #" + (i + 1) + " should be selected");
-    EventUtils.synthesizeKey("VK_DOWN", {});
+    EventUtils.synthesizeKey("KEY_ArrowDown");
   }
 
   is(textbox.selectedButton.getAttribute("anonid"), "search-settings",
      "the settings item should be selected");
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
 
   // We should now be back to the initial situation.
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   ok(!textbox.selectedButton, "no one-off button should be selected");
 
   info("now test the up arrow key");
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   is(textbox.selectedButton.getAttribute("anonid"), "search-settings",
      "the settings item should be selected");
 
   // cycle through the one-off items, the first one is already selected.
   for (let i = oneOffs.length; i; --i) {
-    EventUtils.synthesizeKey("VK_UP", {});
+    EventUtils.synthesizeKey("KEY_ArrowUp");
     is(textbox.selectedButton, oneOffs[i - 1],
        "the one-off button #" + i + " should be selected");
   }
 
   // Another press on up should clear the one-off selection and select the
   // last suggestion.
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   ok(!textbox.selectedButton, "no one-off button should be selected");
 
   for (let i = kValues.length - 1; i >= 0; --i) {
     is(searchPopup.selectedIndex, i,
        "the suggestion at index " + i + " should be selected");
     is(textbox.value, kValues[i],
        "the textfield value should be " + kValues[i]);
-    EventUtils.synthesizeKey("VK_UP", {});
+    EventUtils.synthesizeKey("KEY_ArrowUp");
   }
 
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   is(textbox.value, kUserValue,
      "the textfield value should be back to initial value");
 });
 
 add_task(async function test_typing_clears_button_selection() {
   is(Services.focus.focusedElement, textbox.inputField,
      "the search bar should be focused"); // from the previous test.
   ok(!textbox.selectedButton, "no button should be selected");
 
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   is(textbox.selectedButton.getAttribute("anonid"), "search-settings",
      "the settings item should be selected");
 
   // Type a character.
-  EventUtils.synthesizeKey("a", {});
+  EventUtils.sendString("a");
   ok(!textbox.selectedButton, "the settings item should be de-selected");
 
   // Remove the character.
-  EventUtils.synthesizeKey("VK_BACK_SPACE", {});
+  EventUtils.synthesizeKey("KEY_Backspace");
 });
 
 add_task(async function test_tab() {
   is(Services.focus.focusedElement, textbox.inputField,
      "the search bar should be focused"); // from the previous test.
 
   let oneOffs = getOneOffs();
   ok(!textbox.selectedButton, "no one-off button should be selected");
 
   // Pressing tab should select the first one-off without selecting suggestions.
   // now cycle through the one-off items, the first one is already selected.
   for (let i = 0; i < oneOffs.length; ++i) {
-    EventUtils.synthesizeKey("VK_TAB", {});
+    EventUtils.synthesizeKey("KEY_Tab");
     is(textbox.selectedButton, oneOffs[i],
        "the one-off button #" + (i + 1) + " should be selected");
   }
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   is(textbox.value, kUserValue, "the textfield value should be unmodified");
 
   // One more <tab> selects the settings button.
-  EventUtils.synthesizeKey("VK_TAB", {});
+  EventUtils.synthesizeKey("KEY_Tab");
   is(textbox.selectedButton.getAttribute("anonid"), "search-settings",
      "the settings item should be selected");
 
   // Pressing tab again should close the panel...
   let promise = promiseEvent(searchPopup, "popuphidden");
-  EventUtils.synthesizeKey("VK_TAB", {});
+  EventUtils.synthesizeKey("KEY_Tab");
   await promise;
 
   // ... and move the focus out of the searchbox.
   isnot(Services.focus.focusedElement, textbox.inputField,
         "the search bar no longer be focused");
 });
 
 add_task(async function test_shift_tab() {
@@ -206,185 +206,185 @@ add_task(async function test_shift_tab()
   info("Opening search panel");
   searchbar.focus();
   await promise;
 
   let oneOffs = getOneOffs();
   ok(!textbox.selectedButton, "no one-off button should be selected");
 
   // Press up once to select the last button.
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   is(textbox.selectedButton.getAttribute("anonid"), "search-settings",
      "the settings item should be selected");
 
   // Press up again to select the last one-off button.
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
 
   // Pressing shift+tab should cycle through the one-off items.
   for (let i = oneOffs.length - 1; i >= 0; --i) {
     is(textbox.selectedButton, oneOffs[i],
        "the one-off button #" + (i + 1) + " should be selected");
     if (i)
-      EventUtils.synthesizeKey("VK_TAB", {shiftKey: true});
+      EventUtils.synthesizeKey("KEY_Tab", {shiftKey: true});
   }
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   is(textbox.value, kUserValue, "the textfield value should be unmodified");
 
   // Pressing shift+tab again should close the panel...
   promise = promiseEvent(searchPopup, "popuphidden");
-  EventUtils.synthesizeKey("VK_TAB", {shiftKey: true});
+  EventUtils.synthesizeKey("KEY_Tab", {shiftKey: true});
   await promise;
 
   // ... and move the focus out of the searchbox.
   isnot(Services.focus.focusedElement, textbox.inputField,
         "the search bar no longer be focused");
 });
 
 add_task(async function test_alt_down() {
   // First refocus the panel.
   let promise = promiseEvent(searchPopup, "popupshown");
   info("Opening search panel");
   searchbar.focus();
   await promise;
 
   // close the panel using the escape key.
   promise = promiseEvent(searchPopup, "popuphidden");
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await promise;
 
   // check that alt+down opens the panel...
   promise = promiseEvent(searchPopup, "popupshown");
-  EventUtils.synthesizeKey("VK_DOWN", {altKey: true});
+  EventUtils.synthesizeKey("KEY_ArrowDown", {altKey: true});
   await promise;
 
   // ... and does nothing else.
   ok(!textbox.selectedButton, "no one-off button should be selected");
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   is(textbox.value, kUserValue, "the textfield value should be unmodified");
 
   // Pressing alt+down should select the first one-off without selecting suggestions
   // and cycle through the one-off items.
   let oneOffs = getOneOffs();
   for (let i = 0; i < oneOffs.length; ++i) {
-    EventUtils.synthesizeKey("VK_DOWN", {altKey: true});
+    EventUtils.synthesizeKey("KEY_ArrowDown", {altKey: true});
     is(textbox.selectedButton, oneOffs[i],
        "the one-off button #" + (i + 1) + " should be selected");
     is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   }
 
   // One more alt+down keypress and nothing should be selected.
-  EventUtils.synthesizeKey("VK_DOWN", {altKey: true});
+  EventUtils.synthesizeKey("KEY_ArrowDown", {altKey: true});
   ok(!textbox.selectedButton, "no one-off button should be selected");
 
   // another one and the first one-off should be selected.
-  EventUtils.synthesizeKey("VK_DOWN", {altKey: true});
+  EventUtils.synthesizeKey("KEY_ArrowDown", {altKey: true});
   is(textbox.selectedButton, oneOffs[0],
      "the first one-off button should be selected");
 });
 
 add_task(async function test_alt_up() {
   // close the panel using the escape key.
   let promise = promiseEvent(searchPopup, "popuphidden");
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await promise;
 
   // check that alt+up opens the panel...
   promise = promiseEvent(searchPopup, "popupshown");
-  EventUtils.synthesizeKey("VK_UP", {altKey: true});
+  EventUtils.synthesizeKey("KEY_ArrowUp", {altKey: true});
   await promise;
 
   // ... and does nothing else.
   ok(!textbox.selectedButton, "no one-off button should be selected");
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   is(textbox.value, kUserValue, "the textfield value should be unmodified");
 
   // Pressing alt+up should select the last one-off without selecting suggestions
   // and cycle up through the one-off items.
   let oneOffs = getOneOffs();
   for (let i = oneOffs.length - 1; i >= 0; --i) {
-    EventUtils.synthesizeKey("VK_UP", {altKey: true});
+    EventUtils.synthesizeKey("KEY_ArrowUp", {altKey: true});
     is(textbox.selectedButton, oneOffs[i],
        "the one-off button #" + (i + 1) + " should be selected");
     is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   }
 
   // One more alt+down keypress and nothing should be selected.
-  EventUtils.synthesizeKey("VK_UP", {altKey: true});
+  EventUtils.synthesizeKey("KEY_ArrowUp", {altKey: true});
   ok(!textbox.selectedButton, "no one-off button should be selected");
 
   // another one and the last one-off should be selected.
-  EventUtils.synthesizeKey("VK_UP", {altKey: true});
+  EventUtils.synthesizeKey("KEY_ArrowUp", {altKey: true});
   is(textbox.selectedButton, oneOffs[oneOffs.length - 1],
      "the last one-off button should be selected");
 
   // Cleanup for the next test.
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   is(textbox.selectedButton.getAttribute("anonid"), "search-settings",
      "the settings item should be selected");
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   ok(!textbox.selectedButton, "no one-off should be selected anymore");
 });
 
 add_task(async function test_tab_and_arrows() {
   // Check the initial state is as expected.
   ok(!textbox.selectedButton, "no one-off button should be selected");
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   is(textbox.value, kUserValue, "the textfield value should be unmodified");
 
   // After pressing down, the first sugggestion should be selected.
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   is(searchPopup.selectedIndex, 0, "first suggestion should be selected");
   is(textbox.value, kValues[0], "the textfield value should have changed");
   ok(!textbox.selectedButton, "no one-off button should be selected");
 
   // After pressing tab, the first one-off should be selected,
   // and no suggestion should be selected.
   let oneOffs = getOneOffs();
-  EventUtils.synthesizeKey("VK_TAB", {});
+  EventUtils.synthesizeKey("KEY_Tab");
   is(textbox.selectedButton, oneOffs[0],
      "the first one-off button should be selected");
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
 
   // After pressing down, the second one-off should be selected.
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   is(textbox.selectedButton, oneOffs[1],
      "the second one-off button should be selected");
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
 
   // After pressing right, the third one-off should be selected.
-  EventUtils.synthesizeKey("VK_RIGHT", {});
+  EventUtils.synthesizeKey("KEY_ArrowRight");
   is(textbox.selectedButton, oneOffs[2],
      "the third one-off button should be selected");
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
 
   // After pressing left, the second one-off should be selected again.
-  EventUtils.synthesizeKey("VK_LEFT", {});
+  EventUtils.synthesizeKey("KEY_ArrowLeft");
   is(textbox.selectedButton, oneOffs[1],
      "the second one-off button should be selected again");
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
 
   // After pressing up, the first one-off should be selected again.
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   is(textbox.selectedButton, oneOffs[0],
      "the first one-off button should be selected again");
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
 
   // After pressing up again, the last suggestion should be selected.
   // the textfield value back to the user-typed value, and still the first one-off
   // selected.
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   is(searchPopup.selectedIndex, kValues.length - 1,
      "last suggestion should be selected");
   is(textbox.value, kValues[kValues.length - 1],
      "the textfield value should match the suggestion");
   is(textbox.selectedButton, null,
      "no one-off button should be selected");
 
   // Now pressing down should select the first one-off.
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   is(textbox.selectedButton, oneOffs[0],
      "the first one-off button should be selected");
   is(searchPopup.selectedIndex, -1, "there should be no selected suggestion");
 
   // Finally close the panel.
   let promise = promiseEvent(searchPopup, "popuphidden");
   searchPopup.hidePopup();
   await promise;
@@ -402,44 +402,44 @@ add_task(async function test_open_search
   let engines = getOpenSearchItems();
   is(engines.length, 2, "the opensearch.html page exposes 2 engines");
 
   // Check that there's initially no selection.
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   ok(!textbox.selectedButton, "no button should be selected");
 
   // Pressing up once selects the setting button...
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   is(textbox.selectedButton.getAttribute("anonid"), "search-settings",
      "the settings item should be selected");
 
   // ...and then pressing up selects open search engines.
   for (let i = engines.length; i; --i) {
-    EventUtils.synthesizeKey("VK_UP", {});
+    EventUtils.synthesizeKey("KEY_ArrowUp");
     let selectedButton = textbox.selectedButton;
     is(selectedButton, engines[i - 1],
        "the engine #" + i + " should be selected");
     ok(selectedButton.classList.contains("addengine-item"),
        "the button is themed as an engine item");
   }
 
   // Pressing up again should select the last one-off button.
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   is(textbox.selectedButton, getOneOffs().pop(),
      "the last one-off button should be selected");
 
   info("now check that the down key navigates open search items as expected");
   for (let i = 0; i < engines.length; ++i) {
-    EventUtils.synthesizeKey("VK_DOWN", {});
+    EventUtils.synthesizeKey("KEY_ArrowDown");
     is(textbox.selectedButton, engines[i],
        "the engine #" + (i + 1) + " should be selected");
   }
 
   // Pressing down on the last engine item selects the settings button.
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   is(textbox.selectedButton.getAttribute("anonid"), "search-settings",
      "the settings item should be selected");
 
   promise = promiseEvent(searchPopup, "popuphidden");
   searchPopup.hidePopup();
   await promise;
 
   gBrowser.removeCurrentTab();
--- a/browser/components/search/test/browser_searchbar_openpopup.js
+++ b/browser/components/search/test/browser_searchbar_openpopup.js
@@ -241,17 +241,17 @@ add_task(async function focus_change_clo
   isnot(searchPopup.getAttribute("showonlysettings"), "true", "Should show the full popup");
 
   is(Services.focus.focusedElement, textbox.inputField, "Should have focused the search bar");
   is(textbox.selectionStart, 0, "Should have selected all of the text");
   is(textbox.selectionEnd, 3, "Should have selected all of the text");
 
   promise = promiseEvent(searchPopup, "popuphidden");
   let promise2 = promiseEvent(searchbar, "blur");
-  EventUtils.synthesizeKey("VK_TAB", { shiftKey: true });
+  EventUtils.synthesizeKey("KEY_Tab", {shiftKey: true});
   await promise;
   await promise2;
 
   textbox.value = "";
 });
 
 // Moving focus away from the search box should close the small popup
 add_task(async function focus_change_closes_small_popup() {
@@ -264,17 +264,17 @@ add_task(async function focus_change_clo
   });
   await promise;
   is(searchPopup.getAttribute("showonlysettings"), "true", "Should show the small popup");
 
   is(Services.focus.focusedElement, textbox.inputField, "Should have focused the search bar");
 
   promise = promiseEvent(searchPopup, "popuphidden");
   let promise2 = promiseEvent(searchbar, "blur");
-  EventUtils.synthesizeKey("VK_TAB", { shiftKey: true });
+  EventUtils.synthesizeKey("KEY_Tab", {shiftKey: true});
   await promise;
   await promise2;
 });
 
 // Pressing escape should close the popup.
 add_task(async function escape_closes_popup() {
   gURLBar.focus();
   textbox.value = "foo";
@@ -284,17 +284,17 @@ add_task(async function escape_closes_po
   await promise;
   isnot(searchPopup.getAttribute("showonlysettings"), "true", "Should show the full popup");
 
   is(Services.focus.focusedElement, textbox.inputField, "Should have focused the search bar");
   is(textbox.selectionStart, 0, "Should have selected all of the text");
   is(textbox.selectionEnd, 3, "Should have selected all of the text");
 
   promise = promiseEvent(searchPopup, "popuphidden");
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await promise;
 
   textbox.value = "";
 });
 
 // Pressing contextmenu should close the popup.
 add_task(async function contextmenu_closes_popup() {
   gURLBar.focus();
@@ -327,17 +327,17 @@ add_task(async function contextmenu_clos
 });
 
 // Tabbing to the search box should open the popup if it contains text.
 add_task(async function tab_opens_popup() {
   gURLBar.focus();
   textbox.value = "foo";
 
   let promise = promiseEvent(searchPopup, "popupshown");
-  EventUtils.synthesizeKey("VK_TAB", {});
+  EventUtils.synthesizeKey("KEY_Tab");
   await promise;
   isnot(searchPopup.getAttribute("showonlysettings"), "true", "Should show the full popup");
 
   is(Services.focus.focusedElement, textbox.inputField, "Should have focused the search bar");
   is(textbox.selectionStart, 0, "Should have selected all of the text");
   is(textbox.selectionEnd, 3, "Should have selected all of the text");
 
   promise = promiseEvent(searchPopup, "popuphidden");
@@ -347,17 +347,17 @@ add_task(async function tab_opens_popup(
   textbox.value = "";
 });
 
 // Tabbing to the search box should not open the popup if it doesn't contain text.
 add_no_popup_task(function tab_doesnt_open_popup() {
   gURLBar.focus();
   textbox.value = "foo";
 
-  EventUtils.synthesizeKey("VK_TAB", {});
+  EventUtils.synthesizeKey("KEY_Tab");
 
   is(Services.focus.focusedElement, textbox.inputField, "Should have focused the search bar");
   is(textbox.selectionStart, 0, "Should have selected all of the text");
   is(textbox.selectionEnd, 3, "Should have selected all of the text");
 
   textbox.value = "";
 });
 
@@ -399,17 +399,17 @@ add_task(async function refocus_window_d
 });
 
 // Switching back to the window when the search box has focus from keyboard should not open the popup.
 add_task(async function refocus_window_doesnt_open_popup_keyboard() {
   gURLBar.focus();
   textbox.value = "foo";
 
   let promise = promiseEvent(searchPopup, "popupshown");
-  EventUtils.synthesizeKey("VK_TAB", {});
+  EventUtils.synthesizeKey("KEY_Tab");
   await promise;
   isnot(searchPopup.getAttribute("showonlysettings"), "true", "Should show the full popup");
 
   is(Services.focus.focusedElement, textbox.inputField, "Should have focused the search bar");
   is(textbox.selectionStart, 0, "Should have selected all of the text");
   is(textbox.selectionEnd, 3, "Should have selected all of the text");
 
   promise = promiseEvent(searchPopup, "popuphidden");
@@ -497,75 +497,75 @@ add_task(async function dont_rollup_onca
   gURLBar.focus();
   textbox.value = "long text";
 
   let promise = promiseEvent(searchPopup, "popupshown");
   EventUtils.synthesizeMouseAtCenter(textbox, {});
   await promise;
 
   // Deselect the text
-  EventUtils.synthesizeKey("VK_RIGHT", {});
+  EventUtils.synthesizeKey("KEY_ArrowRight");
   is(textbox.selectionStart, 9, "Should have moved the caret (selectionStart after deselect right)");
   is(textbox.selectionEnd, 9, "Should have moved the caret (selectionEnd after deselect right)");
   is(searchPopup.state, "open", "Popup should still be open");
 
-  EventUtils.synthesizeKey("VK_LEFT", {});
+  EventUtils.synthesizeKey("KEY_ArrowLeft");
   is(textbox.selectionStart, 8, "Should have moved the caret (selectionStart after left)");
   is(textbox.selectionEnd, 8, "Should have moved the caret (selectionEnd after left)");
   is(searchPopup.state, "open", "Popup should still be open");
 
-  EventUtils.synthesizeKey("VK_RIGHT", {});
+  EventUtils.synthesizeKey("KEY_ArrowRight");
   is(textbox.selectionStart, 9, "Should have moved the caret (selectionStart after right)");
   is(textbox.selectionEnd, 9, "Should have moved the caret (selectionEnd after right)");
   is(searchPopup.state, "open", "Popup should still be open");
 
   // Ensure caret movement works while a suggestion is selected.
   is(textbox.popup.selectedIndex, -1, "No selected item in list");
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   is(textbox.popup.selectedIndex, 0, "Selected item in list");
   is(textbox.selectionStart, 9, "Should have moved the caret to the end (selectionStart after selection)");
   is(textbox.selectionEnd, 9, "Should have moved the caret to the end (selectionEnd after selection)");
 
-  EventUtils.synthesizeKey("VK_LEFT", {});
+  EventUtils.synthesizeKey("KEY_ArrowLeft");
   is(textbox.selectionStart, 8, "Should have moved the caret again (selectionStart after left)");
   is(textbox.selectionEnd, 8, "Should have moved the caret again (selectionEnd after left)");
   is(searchPopup.state, "open", "Popup should still be open");
 
-  EventUtils.synthesizeKey("VK_LEFT", {});
+  EventUtils.synthesizeKey("KEY_ArrowLeft");
   is(textbox.selectionStart, 7, "Should have moved the caret (selectionStart after left)");
   is(textbox.selectionEnd, 7, "Should have moved the caret (selectionEnd after left)");
   is(searchPopup.state, "open", "Popup should still be open");
 
-  EventUtils.synthesizeKey("VK_RIGHT", {});
+  EventUtils.synthesizeKey("KEY_ArrowRight");
   is(textbox.selectionStart, 8, "Should have moved the caret (selectionStart after right)");
   is(textbox.selectionEnd, 8, "Should have moved the caret (selectionEnd after right)");
   is(searchPopup.state, "open", "Popup should still be open");
 
   if (!navigator.platform.includes("Mac")) {
-    EventUtils.synthesizeKey("VK_HOME", {});
+    EventUtils.synthesizeKey("KEY_Home");
     is(textbox.selectionStart, 0, "Should have moved the caret (selectionStart after home)");
     is(textbox.selectionEnd, 0, "Should have moved the caret (selectionEnd after home)");
     is(searchPopup.state, "open", "Popup should still be open");
   }
 
   // Close the popup again
   promise = promiseEvent(searchPopup, "popuphidden");
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await promise;
 
   textbox.value = "";
 });
 
 // Entering customization mode shouldn't open the popup.
 add_task(async function dont_open_in_customization() {
   gURLBar.focus();
   textbox.value = "foo";
 
   let promise = promiseEvent(searchPopup, "popupshown");
-  EventUtils.synthesizeKey("VK_TAB", {});
+  EventUtils.synthesizeKey("KEY_Tab");
   await promise;
   isnot(searchPopup.getAttribute("showonlysettings"), "true", "Should show the full popup");
 
   info("Entering customization mode");
   let sawPopup = false;
   function listener() {
     sawPopup = true;
   }
--- a/browser/components/search/test/browser_searchbar_smallpanel_keyboard_navigation.js
+++ b/browser/components/search/test/browser_searchbar_smallpanel_keyboard_navigation.js
@@ -90,79 +90,79 @@ info("textbox.mController.searchString =
   // before-last one-off buttons aren't different. We should always have more
   // than 4 default engines, but it's safer to check this assumption.
   let oneOffs = getOneOffs();
   ok(oneOffs.length >= 4, "we have at least 4 one-off buttons displayed");
 
   ok(!textbox.selectedButton, "no one-off button should be selected");
 
   // Pressing should select the first one-off.
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   is(textbox.value, "", "the textfield value should be unmodified");
 
   // now cycle through the one-off items, the first one is already selected.
   for (let i = 0; i < oneOffs.length; ++i) {
     is(textbox.selectedButton, oneOffs[i],
        "the one-off button #" + (i + 1) + " should be selected");
-    EventUtils.synthesizeKey("VK_DOWN", {});
+    EventUtils.synthesizeKey("KEY_ArrowDown");
   }
 
   is(textbox.selectedButton.getAttribute("anonid"), "search-settings",
      "the settings item should be selected");
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
 
   // We should now be back to the initial situation.
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   ok(!textbox.selectedButton, "no one-off button should be selected");
 
   info("now test the up arrow key");
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   is(textbox.selectedButton.getAttribute("anonid"), "search-settings",
      "the settings item should be selected");
 
   // cycle through the one-off items, the first one is already selected.
   for (let i = oneOffs.length; i; --i) {
-    EventUtils.synthesizeKey("VK_UP", {});
+    EventUtils.synthesizeKey("KEY_ArrowUp");
     is(textbox.selectedButton, oneOffs[i - 1],
        "the one-off button #" + i + " should be selected");
   }
 
   // Another press on up should clear the one-off selection.
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   ok(!textbox.selectedButton, "no one-off button should be selected");
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   is(textbox.value, "", "the textfield value should be unmodified");
 });
 
 add_task(async function test_tab() {
   is(Services.focus.focusedElement, textbox.inputField,
      "the search bar should be focused"); // from the previous test.
 
   let oneOffs = getOneOffs();
   ok(!textbox.selectedButton, "no one-off button should be selected");
 
   // Pressing tab should select the first one-off without selecting suggestions.
   // now cycle through the one-off items, the first one is already selected.
   for (let i = 0; i < oneOffs.length; ++i) {
-    EventUtils.synthesizeKey("VK_TAB", {});
+    EventUtils.synthesizeKey("KEY_Tab");
     is(textbox.selectedButton, oneOffs[i],
        "the one-off button #" + (i + 1) + " should be selected");
   }
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   is(textbox.value, "", "the textfield value should be unmodified");
 
   // One more <tab> selects the settings button.
-  EventUtils.synthesizeKey("VK_TAB", {});
+  EventUtils.synthesizeKey("KEY_Tab");
   is(textbox.selectedButton.getAttribute("anonid"), "search-settings",
      "the settings item should be selected");
 
   // Pressing tab again should close the panel...
   let promise = promiseEvent(searchPopup, "popuphidden");
-  EventUtils.synthesizeKey("VK_TAB", {});
+  EventUtils.synthesizeKey("KEY_Tab");
   await promise;
 
   // ... and move the focus out of the searchbox.
   isnot(Services.focus.focusedElement, textbox.inputField,
         "the search bar no longer be focused");
 });
 
 add_task(async function test_shift_tab() {
@@ -174,36 +174,36 @@ add_task(async function test_shift_tab()
   });
   await promise;
 
   let oneOffs = getOneOffs();
   ok(!textbox.selectedButton, "no one-off button should be selected");
   is(searchPopup.getAttribute("showonlysettings"), "true", "Should show the small popup");
 
   // Press up once to select the last button.
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   is(textbox.selectedButton.getAttribute("anonid"), "search-settings",
      "the settings item should be selected");
 
   // Press up again to select the last one-off button.
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
 
   // Pressing shift+tab should cycle through the one-off items.
   for (let i = oneOffs.length - 1; i >= 0; --i) {
     is(textbox.selectedButton, oneOffs[i],
        "the one-off button #" + (i + 1) + " should be selected");
     if (i)
-      EventUtils.synthesizeKey("VK_TAB", {shiftKey: true});
+      EventUtils.synthesizeKey("KEY_Tab", {shiftKey: true});
   }
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   is(textbox.value, "", "the textfield value should be unmodified");
 
   // Pressing shift+tab again should close the panel...
   promise = promiseEvent(searchPopup, "popuphidden");
-  EventUtils.synthesizeKey("VK_TAB", {shiftKey: true});
+  EventUtils.synthesizeKey("KEY_Tab", {shiftKey: true});
   await promise;
 
   // ... and move the focus out of the searchbox.
   isnot(Services.focus.focusedElement, textbox.inputField,
         "the search bar no longer be focused");
 });
 
 add_task(async function test_alt_down() {
@@ -220,90 +220,90 @@ add_task(async function test_alt_down() 
   ok(!textbox.selectedButton, "no one-off button should be selected");
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   is(textbox.value, "", "the textfield value should be unmodified");
 
   // Pressing alt+down should select the first one-off without selecting suggestions
   // and cycle through the one-off items.
   let oneOffs = getOneOffs();
   for (let i = 0; i < oneOffs.length; ++i) {
-    EventUtils.synthesizeKey("VK_DOWN", {altKey: true});
+    EventUtils.synthesizeKey("KEY_ArrowDown", {altKey: true});
     is(textbox.selectedButton, oneOffs[i],
        "the one-off button #" + (i + 1) + " should be selected");
     is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   }
 
   // One more alt+down keypress and nothing should be selected.
-  EventUtils.synthesizeKey("VK_DOWN", {altKey: true});
+  EventUtils.synthesizeKey("KEY_ArrowDown", {altKey: true});
   ok(!textbox.selectedButton, "no one-off button should be selected");
 
   // another one and the first one-off should be selected.
-  EventUtils.synthesizeKey("VK_DOWN", {altKey: true});
+  EventUtils.synthesizeKey("KEY_ArrowDown", {altKey: true});
   is(textbox.selectedButton, oneOffs[0],
      "the first one-off button should be selected");
 
   // Clear the selection with an alt+up keypress
-  EventUtils.synthesizeKey("VK_UP", {altKey: true});
+  EventUtils.synthesizeKey("KEY_ArrowUp", {altKey: true});
   ok(!textbox.selectedButton, "no one-off button should be selected");
 });
 
 add_task(async function test_alt_up() {
   // Check the initial state of the panel
   ok(!textbox.selectedButton, "no one-off button should be selected");
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   is(textbox.value, "", "the textfield value should be unmodified");
 
   // Pressing alt+up should select the last one-off without selecting suggestions
   // and cycle up through the one-off items.
   let oneOffs = getOneOffs();
   for (let i = oneOffs.length - 1; i >= 0; --i) {
-    EventUtils.synthesizeKey("VK_UP", {altKey: true});
+    EventUtils.synthesizeKey("KEY_ArrowUp", {altKey: true});
     is(textbox.selectedButton, oneOffs[i],
        "the one-off button #" + (i + 1) + " should be selected");
     is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   }
 
   // One more alt+down keypress and nothing should be selected.
-  EventUtils.synthesizeKey("VK_UP", {altKey: true});
+  EventUtils.synthesizeKey("KEY_ArrowUp", {altKey: true});
   ok(!textbox.selectedButton, "no one-off button should be selected");
 
   // another one and the last one-off should be selected.
-  EventUtils.synthesizeKey("VK_UP", {altKey: true});
+  EventUtils.synthesizeKey("KEY_ArrowUp", {altKey: true});
   is(textbox.selectedButton, oneOffs[oneOffs.length - 1],
      "the last one-off button should be selected");
 
   // Cleanup for the next test.
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   is(textbox.selectedButton.getAttribute("anonid"), "search-settings",
      "the settings item should be selected");
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   ok(!textbox.selectedButton, "no one-off should be selected anymore");
 });
 
 add_task(async function test_tab_and_arrows() {
   // Check the initial state is as expected.
   ok(!textbox.selectedButton, "no one-off button should be selected");
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   is(textbox.value, "", "the textfield value should be unmodified");
 
   // After pressing down, the first one-off should be selected.
   let oneOffs = getOneOffs();
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   is(textbox.selectedButton, oneOffs[0],
      "the first one-off button should be selected");
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
 
   // After pressing tab, the second one-off should be selected.
-  EventUtils.synthesizeKey("VK_TAB", {});
+  EventUtils.synthesizeKey("KEY_Tab");
   is(textbox.selectedButton, oneOffs[1],
      "the second one-off button should be selected");
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
 
   // After pressing up, the first one-off should be selected again.
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   is(textbox.selectedButton, oneOffs[0],
      "the first one-off button should be selected");
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
 
   // Finally close the panel.
   let promise = promiseEvent(searchPopup, "popuphidden");
   searchPopup.hidePopup();
   await promise;
@@ -322,44 +322,44 @@ add_task(async function test_open_search
   let engines = getOpenSearchItems();
   is(engines.length, 2, "the opensearch.html page exposes 2 engines");
 
   // Check that there's initially no selection.
   is(searchPopup.selectedIndex, -1, "no suggestion should be selected");
   ok(!textbox.selectedButton, "no button should be selected");
 
   // Pressing up once selects the setting button...
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   is(textbox.selectedButton.getAttribute("anonid"), "search-settings",
      "the settings item should be selected");
 
   // ...and then pressing up selects open search engines.
   for (let i = engines.length; i; --i) {
-    EventUtils.synthesizeKey("VK_UP", {});
+    EventUtils.synthesizeKey("KEY_ArrowUp");
     let selectedButton = textbox.selectedButton;
     is(selectedButton, engines[i - 1],
        "the engine #" + i + " should be selected");
     ok(selectedButton.classList.contains("addengine-item"),
        "the button is themed as an engine item");
   }
 
   // Pressing up again should select the last one-off button.
-  EventUtils.synthesizeKey("VK_UP", {});
+  EventUtils.synthesizeKey("KEY_ArrowUp");
   is(textbox.selectedButton, getOneOffs().pop(),
      "the last one-off button should be selected");
 
   info("now check that the down key navigates open search items as expected");
   for (let i = 0; i < engines.length; ++i) {
-    EventUtils.synthesizeKey("VK_DOWN", {});
+    EventUtils.synthesizeKey("KEY_ArrowDown");
     is(textbox.selectedButton, engines[i],
        "the engine #" + (i + 1) + " should be selected");
   }
 
   // Pressing down on the last engine item selects the settings button.
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   is(textbox.selectedButton.getAttribute("anonid"), "search-settings",
      "the settings item should be selected");
 
   promise = promiseEvent(searchPopup, "popuphidden");
   searchPopup.hidePopup();
   await promise;
 
   gBrowser.removeCurrentTab();
--- a/browser/components/search/test/browser_tooManyEnginesOffered.js
+++ b/browser/components/search/test/browser_tooManyEnginesOffered.js
@@ -19,17 +19,17 @@ add_task(async function test() {
   let rootDir = getRootDirectory(gTestPath);
   let url = rootDir + "tooManyEnginesOffered.html";
   await BrowserTestUtils.openNewForegroundTab(gBrowser, url);
 
   // Open the search popup.
   let promise = promiseEvent(searchPopup, "popupshown");
   info("Opening search panel");
   searchbar.focus();
-  EventUtils.synthesizeKey("VK_DOWN", {});
+  EventUtils.synthesizeKey("KEY_ArrowDown");
   await promise;
 
   // Make sure it has only one add-engine menu button item.
   let items = getOpenSearchItems();
   Assert.equal(items.length, 1, "A single button");
   let menuButton = items[0];
   Assert.equal(menuButton.type, "menu", "A menu button");
 
@@ -55,29 +55,29 @@ add_task(async function test() {
   await promise;
 
   Assert.ok(!menuButton.open, "Submenu should be closed");
 
   // Key up until the menu button is selected.
   for (let button = null;
        button != menuButton;
        button = searchbar.textbox.popup.oneOffButtons.selectedButton) {
-    EventUtils.synthesizeKey("VK_UP", {});
+    EventUtils.synthesizeKey("KEY_ArrowUp");
   }
 
   // Press the Right arrow key.  The submenu should open.
   promise = promiseEvent(buttonPopup, "popupshown");
-  EventUtils.synthesizeKey("VK_RIGHT", {});
+  EventUtils.synthesizeKey("KEY_ArrowRight");
   await promise;
 
   Assert.ok(menuButton.open, "Submenu should be open");
 
   // Press the Esc key.  The submenu should close.
   promise = promiseEvent(buttonPopup, "popuphidden");
-  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  EventUtils.synthesizeKey("KEY_Escape");
   await promise;
 
   Assert.ok(!menuButton.open, "Submenu should be closed");
 
   gBrowser.removeCurrentTab();
 });
 
 function getOpenSearchItems() {
--- a/browser/components/sessionstore/test/browser_522545.js
+++ b/browser/components/sessionstore/test/browser_522545.js
@@ -226,17 +226,17 @@ function test() {
       // Make sure this tab isn't loading and state is clear before we test.
       is(browser.userTypedValue, null, "userTypedValue is empty to start");
       ok(!browser.didStartLoadSinceLastUserTyping(),
          "Initially, no load should be ongoing");
 
       let inputText = "example.org";
       gURLBar.focus();
       gURLBar.value = inputText.slice(0, -1);
-      EventUtils.synthesizeKey(inputText.slice(-1), {});
+      EventUtils.sendString(inputText.slice(-1));
 
       executeSoon(function() {
         is(browser.userTypedValue, "example.org",
            "userTypedValue was set when changing URLBar value");
         ok(!browser.didStartLoadSinceLastUserTyping(),
            "No load started since changing URLBar value");
 
         // Now make sure ss gets these values too
--- a/browser/extensions/formautofill/test/mochitest/formautofill_common.js
+++ b/browser/extensions/formautofill/test/mochitest/formautofill_common.js
@@ -114,17 +114,17 @@ function triggerAutofillAndCheckProfile(
     const checkFieldAutofilled = Promise.all([
       new Promise(resolve => element.addEventListener("input", resolve, {once: true})),
       new Promise(resolve => element.addEventListener(expectingEvent, resolve, {once: true})),
     ]).then(() => checkFieldValue(element, value));
 
     promises.push(checkFieldAutofilled);
   }
   // Press Enter key and trigger form autofill.
-  synthesizeKey("KEY_Enter", {});
+  synthesizeKey("KEY_Enter");
 
   return Promise.all(promises);
 }
 
 async function onStorageChanged(type) {
   info(`expecting the storage changed: ${type}`);
   return new Promise(resolve => {
     formFillChromeScript.addMessageListener("formautofill-storage-changed", function onChanged(data) {
@@ -238,20 +238,20 @@ function popupShownListener() {
 }
 
 function initPopupListener() {
   registerPopupShownListener(popupShownListener);
 }
 
 async function triggerPopupAndHoverItem(fieldSelector, selectIndex) {
   await focusAndWaitForFieldsIdentified(fieldSelector);
-  synthesizeKey("KEY_ArrowDown", {});
+  synthesizeKey("KEY_ArrowDown");
   await expectPopup();
   for (let i = 0; i <= selectIndex; i++) {
-    synthesizeKey("KEY_ArrowDown", {});
+    synthesizeKey("KEY_ArrowDown");
   }
   await notifySelectedIndex(selectIndex);
 }
 
 function formAutoFillCommonSetup() {
   let chromeURL = SimpleTest.getTestFileURL("formautofill_parent_utils.js");
   formFillChromeScript = SpecialPowers.loadChromeScript(chromeURL);
   formFillChromeScript.addMessageListener("onpopupshown", ({results}) => {
--- a/browser/extensions/formautofill/test/mochitest/test_autofocus_form.html
+++ b/browser/extensions/formautofill/test/mochitest/test_autofocus_form.html
@@ -34,17 +34,17 @@ initPopupListener();
 
 async function setupAddressStorage() {
   await addAddress(MOCK_STORAGE[0]);
   await addAddress(MOCK_STORAGE[1]);
 }
 
 add_task(async function check_autocomplete_on_autofocus_field() {
   await setupAddressStorage();
-  synthesizeKey("KEY_ArrowDown", {});
+  synthesizeKey("KEY_ArrowDown");
   await expectPopup();
   checkMenuEntries(MOCK_STORAGE.map(address =>
     JSON.stringify({primary: address.organization, secondary: address["street-address"]})
   ));
 });
 
 </script>
 
--- a/browser/extensions/formautofill/test/mochitest/test_basic_autocomplete_form.html
+++ b/browser/extensions/formautofill/test/mochitest/test_basic_autocomplete_form.html
@@ -49,134 +49,134 @@ async function setupFormHistory() {
 
 initPopupListener();
 
 // Form with history only.
 add_task(async function history_only_menu_checking() {
   await setupFormHistory();
 
   await setInput("#tel", "");
-  synthesizeKey("KEY_ArrowDown", {});
+  synthesizeKey("KEY_ArrowDown");
   await expectPopup();
   checkMenuEntries(["+1234567890"], false);
 });
 
 // Display history search result if less than 3 inputs are covered by all saved
 // fields in the storage.
 add_task(async function all_saved_fields_less_than_threshold() {
   await addAddress({
     email: "test@test.com",
   });
 
   await setInput("#email", &