browser/devtools/webconsole/test/browser_webconsole_bug_585991_autocomplete_keys.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* vim:set ts=2 sw=2 sts=2 et: */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 const TEST_URI = "data:text/html;charset=utf-8,<p>bug 585991 - autocomplete popup keyboard usage test";
     7 let HUD, popup, jsterm, inputNode, completeNode;
     9 function test() {
    10   addTab(TEST_URI);
    11   browser.addEventListener("load", function onLoad() {
    12     browser.removeEventListener("load", onLoad, true);
    13     openConsole(null, consoleOpened);
    14   }, true);
    15 }
    17 function consoleOpened(aHud) {
    18   HUD = aHud;
    19   info("web console opened");
    21   jsterm = HUD.jsterm;
    23   jsterm.execute("window.foobarBug585991={" +
    24     "'item0': 'value0'," +
    25     "'item1': 'value1'," +
    26     "'item2': 'value2'," +
    27     "'item3': 'value3'" +
    28   "}");
    29   popup = jsterm.autocompletePopup;
    30   completeNode = jsterm.completeNode;
    31   inputNode = jsterm.inputNode;
    33   ok(!popup.isOpen, "popup is not open");
    35   popup._panel.addEventListener("popupshown", function onShown() {
    36     popup._panel.removeEventListener("popupshown", onShown, false);
    38     ok(popup.isOpen, "popup is open");
    40     // 4 values, and the following properties:
    41     // __defineGetter__  __defineSetter__ __lookupGetter__ __lookupSetter__
    42     // hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString
    43     // toSource unwatch valueOf watch constructor.
    44     is(popup.itemCount, 18, "popup.itemCount is correct");
    46     let sameItems = popup.getItems().reverse().map(function(e) {return e.label;});
    47     ok(sameItems.every(function(prop, index) {
    48       return [
    49         "__defineGetter__",
    50         "__defineSetter__",
    51         "__lookupGetter__",
    52         "__lookupSetter__",
    53         "constructor",
    54         "hasOwnProperty",
    55         "isPrototypeOf",
    56         "item0",
    57         "item1",
    58         "item2",
    59         "item3",
    60         "propertyIsEnumerable",
    61         "toLocaleString",
    62         "toSource",
    63         "toString",
    64         "unwatch",
    65         "valueOf",
    66         "watch",
    67       ][index] === prop}), "getItems returns the items we expect");
    69     is(popup.selectedIndex, 17,
    70        "Index of the first item from bottom is selected.");
    71     EventUtils.synthesizeKey("VK_DOWN", {});
    73     let prefix = jsterm.inputNode.value.replace(/[\S]/g, " ");
    75     is(popup.selectedIndex, 0, "index 0 is selected");
    76     is(popup.selectedItem.label, "watch", "watch is selected");
    77     is(completeNode.value, prefix + "watch",
    78         "completeNode.value holds watch");
    80     EventUtils.synthesizeKey("VK_DOWN", {});
    82     is(popup.selectedIndex, 1, "index 1 is selected");
    83     is(popup.selectedItem.label, "valueOf", "valueOf is selected");
    84     is(completeNode.value, prefix + "valueOf",
    85         "completeNode.value holds valueOf");
    87     EventUtils.synthesizeKey("VK_UP", {});
    89     is(popup.selectedIndex, 0, "index 0 is selected");
    90     is(popup.selectedItem.label, "watch", "watch is selected");
    91     is(completeNode.value, prefix + "watch",
    92         "completeNode.value holds watch");
    94     let currentSelectionIndex = popup.selectedIndex;
    96     EventUtils.synthesizeKey("VK_PAGE_DOWN", {});
    98     ok(popup.selectedIndex > currentSelectionIndex,
    99       "Index is greater after PGDN");
   101     currentSelectionIndex = popup.selectedIndex;
   102     EventUtils.synthesizeKey("VK_PAGE_UP", {});
   104     ok(popup.selectedIndex < currentSelectionIndex, "Index is less after Page UP");
   106     info("press Tab and wait for popup to hide");
   107     popup._panel.addEventListener("popuphidden", popupHideAfterTab, false);
   108     EventUtils.synthesizeKey("VK_TAB", {});
   109   }, false);
   111   info("wait for completion: window.foobarBug585991.");
   112   jsterm.setInputValue("window.foobarBug585991");
   113   EventUtils.synthesizeKey(".", {});
   114 }
   116 function popupHideAfterTab()
   117 {
   118   // At this point the completion suggestion should be accepted.
   119   popup._panel.removeEventListener("popuphidden", popupHideAfterTab, false);
   121   ok(!popup.isOpen, "popup is not open");
   123   is(inputNode.value, "window.foobarBug585991.watch",
   124      "completion was successful after VK_TAB");
   126   ok(!completeNode.value, "completeNode is empty");
   128   popup._panel.addEventListener("popupshown", function onShown() {
   129     popup._panel.removeEventListener("popupshown", onShown, false);
   131     ok(popup.isOpen, "popup is open");
   133     is(popup.itemCount, 18, "popup.itemCount is correct");
   135     is(popup.selectedIndex, 17, "First index from bottom is selected");
   136     EventUtils.synthesizeKey("VK_DOWN", {});
   138     let prefix = jsterm.inputNode.value.replace(/[\S]/g, " ");
   140     is(popup.selectedIndex, 0, "index 0 is selected");
   141     is(popup.selectedItem.label, "watch", "watch is selected");
   142     is(completeNode.value, prefix + "watch",
   143         "completeNode.value holds watch");
   145     popup._panel.addEventListener("popuphidden", function onHidden() {
   146       popup._panel.removeEventListener("popuphidden", onHidden, false);
   148       ok(!popup.isOpen, "popup is not open after VK_ESCAPE");
   150       is(inputNode.value, "window.foobarBug585991.",
   151          "completion was cancelled");
   153       ok(!completeNode.value, "completeNode is empty");
   155       executeSoon(testReturnKey);
   156     }, false);
   158     info("press Escape to close the popup");
   159     executeSoon(function() {
   160       EventUtils.synthesizeKey("VK_ESCAPE", {});
   161     });
   162   }, false);
   164   info("wait for completion: window.foobarBug585991.");
   165   executeSoon(function() {
   166     jsterm.setInputValue("window.foobarBug585991");
   167     EventUtils.synthesizeKey(".", {});
   168   });
   169 }
   171 function testReturnKey()
   172 {
   173   popup._panel.addEventListener("popupshown", function onShown() {
   174     popup._panel.removeEventListener("popupshown", onShown, false);
   176     ok(popup.isOpen, "popup is open");
   178     is(popup.itemCount, 18, "popup.itemCount is correct");
   180     is(popup.selectedIndex, 17, "First index from bottom is selected");
   181     EventUtils.synthesizeKey("VK_DOWN", {});
   183     let prefix = jsterm.inputNode.value.replace(/[\S]/g, " ");
   185     is(popup.selectedIndex, 0, "index 0 is selected");
   186     is(popup.selectedItem.label, "watch", "watch is selected");
   187     is(completeNode.value, prefix + "watch",
   188         "completeNode.value holds watch");
   190     EventUtils.synthesizeKey("VK_DOWN", {});
   192     is(popup.selectedIndex, 1, "index 1 is selected");
   193     is(popup.selectedItem.label, "valueOf", "valueOf is selected");
   194     is(completeNode.value, prefix + "valueOf",
   195        "completeNode.value holds valueOf");
   197     popup._panel.addEventListener("popuphidden", function onHidden() {
   198       popup._panel.removeEventListener("popuphidden", onHidden, false);
   200       ok(!popup.isOpen, "popup is not open after VK_RETURN");
   202       is(inputNode.value, "window.foobarBug585991.valueOf",
   203          "completion was successful after VK_RETURN");
   205       ok(!completeNode.value, "completeNode is empty");
   207       dontShowArrayNumbers();
   208     }, false);
   210     info("press Return to accept suggestion. wait for popup to hide");
   212     executeSoon(() => EventUtils.synthesizeKey("VK_RETURN", {}));
   213   }, false);
   215   info("wait for completion suggestions: window.foobarBug585991.");
   217   executeSoon(function() {
   218     jsterm.setInputValue("window.foobarBug58599");
   219     EventUtils.synthesizeKey("1", {});
   220     EventUtils.synthesizeKey(".", {});
   221   });
   222 }
   224 function dontShowArrayNumbers()
   225 {
   226   info("dontShowArrayNumbers");
   227   content.wrappedJSObject.foobarBug585991 = ["Sherlock Holmes"];
   229   let jsterm = HUD.jsterm;
   230   let popup = jsterm.autocompletePopup;
   231   let completeNode = jsterm.completeNode;
   233   popup._panel.addEventListener("popupshown", function onShown() {
   234     popup._panel.removeEventListener("popupshown", onShown, false);
   236     let sameItems = popup.getItems().map(function(e) {return e.label;});
   237     ok(!sameItems.some(function(prop, index) { prop === "0"; }),
   238        "Completing on an array doesn't show numbers.");
   240     popup._panel.addEventListener("popuphidden", testReturnWithNoSelection, false);
   242     info("wait for popup to hide");
   243     executeSoon(() => EventUtils.synthesizeKey("VK_ESCAPE", {}));
   244   }, false);
   246   info("wait for popup to show");
   247   executeSoon(() => {
   248     jsterm.setInputValue("window.foobarBug585991");
   249     EventUtils.synthesizeKey(".", {});
   250   });
   251 }
   253 function testReturnWithNoSelection()
   254 {
   255   popup._panel.removeEventListener("popuphidden", testReturnWithNoSelection, false);
   257   info("test pressing return with open popup, but no selection, see bug 873250");
   258   content.wrappedJSObject.testBug873250a = "hello world";
   259   content.wrappedJSObject.testBug873250b = "hello world 2";
   261   popup._panel.addEventListener("popupshown", function onShown() {
   262     popup._panel.removeEventListener("popupshown", onShown);
   264     ok(popup.isOpen, "popup is open");
   265     is(popup.itemCount, 2, "popup.itemCount is correct");
   266     isnot(popup.selectedIndex, -1, "popup.selectedIndex is correct");
   268     info("press Return and wait for popup to hide");
   269     popup._panel.addEventListener("popuphidden", popupHideAfterReturnWithNoSelection);
   270     executeSoon(() => EventUtils.synthesizeKey("VK_RETURN", {}));
   271   });
   273   executeSoon(() => {
   274     info("wait for popup to show");
   275     jsterm.setInputValue("window.testBu");
   276     EventUtils.synthesizeKey("g", {});
   277   });
   278 }
   280 function popupHideAfterReturnWithNoSelection()
   281 {
   282   popup._panel.removeEventListener("popuphidden", popupHideAfterReturnWithNoSelection);
   284   ok(!popup.isOpen, "popup is not open after VK_RETURN");
   286   is(inputNode.value, "", "inputNode is empty after VK_RETURN");
   287   is(completeNode.value, "", "completeNode is empty");
   288   is(jsterm.history[jsterm.history.length-1], "window.testBug",
   289      "jsterm history is correct");
   291   executeSoon(testCompletionInText);
   292 }
   294 function testCompletionInText()
   295 {
   296   info("test that completion works inside text, see bug 812618");
   298   popup._panel.addEventListener("popupshown", function onShown() {
   299     popup._panel.removeEventListener("popupshown", onShown);
   301     ok(popup.isOpen, "popup is open");
   302     is(popup.itemCount, 2, "popup.itemCount is correct");
   304     EventUtils.synthesizeKey("VK_DOWN", {});
   305     is(popup.selectedIndex, 0, "popup.selectedIndex is correct");
   306     ok(!completeNode.value, "completeNode.value is empty");
   308     let items = popup.getItems().reverse().map(e => e.label);
   309     let sameItems = items.every((prop, index) =>
   310       ["testBug873250a", "testBug873250b"][index] === prop);
   311     ok(sameItems, "getItems returns the items we expect");
   313     info("press Tab and wait for popup to hide");
   314     popup._panel.addEventListener("popuphidden", popupHideAfterCompletionInText);
   315     EventUtils.synthesizeKey("VK_TAB", {});
   316   });
   318   jsterm.setInputValue("dump(window.testBu)");
   319   inputNode.selectionStart = inputNode.selectionEnd = 18;
   320   EventUtils.synthesizeKey("g", {});
   321 }
   323 function popupHideAfterCompletionInText()
   324 {
   325   // At this point the completion suggestion should be accepted.
   326   popup._panel.removeEventListener("popuphidden", popupHideAfterCompletionInText);
   328   ok(!popup.isOpen, "popup is not open");
   329   is(inputNode.value, "dump(window.testBug873250b)",
   330      "completion was successful after VK_TAB");
   331   is(inputNode.selectionStart, 26, "cursor location is correct");
   332   is(inputNode.selectionStart, inputNode.selectionEnd, "cursor location (confirmed)");
   333   ok(!completeNode.value, "completeNode is empty");
   335   finishUp();
   336 }
   338 function finishUp() {
   339   HUD = popup = jsterm = inputNode = completeNode = null;
   340   finishTest();
   341 }

mercurial