Bug 1294038 - force selections to be read after webconsole completion;r=nchevobbe
MozReview-Commit-ID: 977wLMj3cSa
--- a/devtools/client/webconsole/jsterm.js
+++ b/devtools/client/webconsole/jsterm.js
@@ -1632,16 +1632,22 @@ JSTerm.prototype = {
* Clear the current completion information and close the autocomplete popup,
* if needed.
*/
clearCompletion: function () {
this.autocompletePopup.clearItems();
this.lastCompletion = { value: null };
this.updateCompleteNode("");
if (this.autocompletePopup.isOpen) {
+ // Trigger a blur/focus of the JSTerm input to force screen readers to read the
+ // value again.
+ this.inputNode.blur();
+ this.autocompletePopup.once("popup-closed", () => {
+ this.inputNode.focus();
+ });
this.autocompletePopup.hidePopup();
this._autocompletePopupNavigated = false;
}
},
/**
* Accept the proposed input completion.
*
--- a/devtools/client/webconsole/test/browser.ini
+++ b/devtools/client/webconsole/test/browser.ini
@@ -355,16 +355,17 @@ skip-if = e10s # Bug 1042253 - webconsol
[browser_webconsole_split_focus.js]
[browser_webconsole_split_persist.js]
[browser_webconsole_trackingprotection_errors.js]
tags = trackingprotection
[browser_webconsole_view_source.js]
[browser_webconsole_reflow.js]
[browser_webconsole_log_file_filter.js]
[browser_webconsole_expandable_timestamps.js]
+[browser_webconsole_autocomplete_accessibility.js]
[browser_webconsole_autocomplete_in_debugger_stackframe.js]
[browser_webconsole_autocomplete_popup_close_on_tab_switch.js]
[browser_webconsole_autocomplete-properties-with-non-alphanumeric-names.js]
[browser_console_hide_jsterm_when_devtools_chrome_enabled_false.js]
[browser_console_history_persist.js]
[browser_webconsole_output_01.js]
[browser_webconsole_output_02.js]
[browser_webconsole_output_03.js]
new file mode 100644
--- /dev/null
+++ b/devtools/client/webconsole/test/browser_webconsole_autocomplete_accessibility.js
@@ -0,0 +1,60 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// Tests that the autocomplete input is being blurred and focused when selecting a value.
+// This will help screen-readers notify users of the value that was set in the input.
+
+"use strict";
+
+const TEST_URI = "data:text/html;charset=utf8,<p>test code completion";
+
+add_task(function* () {
+ yield loadTab(TEST_URI);
+
+ let hud = yield openConsole();
+
+ let jsterm = hud.jsterm;
+ let input = jsterm.inputNode;
+
+ info("Type 'd' to open the autocomplete popup");
+ yield autocomplete(jsterm, "d");
+
+ // Add listeners for focus and blur events.
+ let wasBlurred = false;
+ input.addEventListener("blur", () => {
+ wasBlurred = true;
+ }, {
+ once: true
+ });
+
+ let wasFocused = false;
+ input.addEventListener("blur", () => {
+ ok(wasBlurred, "jsterm input received a blur event before received back the focus");
+ wasFocused = true;
+ }, {
+ once: true
+ });
+
+ info("Close the autocomplete popup by simulating a TAB key event");
+ let onPopupClosed = jsterm.autocompletePopup.once("popup-closed");
+ EventUtils.synthesizeKey("VK_TAB", {});
+
+ info("Wait for the autocomplete popup to be closed");
+ yield onPopupClosed;
+
+ ok(wasFocused, "jsterm input received a focus event");
+});
+
+function* autocomplete(jsterm, value) {
+ let popup = jsterm.autocompletePopup;
+
+ yield new Promise(resolve => {
+ jsterm.setInputValue(value);
+ jsterm.complete(jsterm.COMPLETE_HINT_ONLY, resolve);
+ });
+
+ ok(popup.isOpen && popup.itemCount > 0,
+ "Autocomplete popup is open and contains suggestions");
+}