Bug 1294038 - force selections to be read after webconsole completion;r=nchevobbe draft
authorJulian Descottes <jdescottes@mozilla.com>
Mon, 06 Feb 2017 13:59:41 +0100
changeset 480612 685c42f5a37e435dce9531571b1ee5ef9a224293
parent 479141 20a8536b0bfac74389d3a57bd8dd957d98779ce1
child 545003 3f87399a544bb0214da7364259a3ca5f0991ed49
push id44595
push userjdescottes@mozilla.com
push dateWed, 08 Feb 2017 16:22:41 +0000
reviewersnchevobbe
bugs1294038
milestone54.0a1
Bug 1294038 - force selections to be read after webconsole completion;r=nchevobbe MozReview-Commit-ID: 977wLMj3cSa
devtools/client/webconsole/jsterm.js
devtools/client/webconsole/test/browser.ini
devtools/client/webconsole/test/browser_webconsole_autocomplete_accessibility.js
--- 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");
+}