Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
/* Any copyright is dedicated to the Public Domain.
// Tests that code completion works properly.
"use strict";
const TEST_URI = `data:text/html;charset=utf8,<!DOCTYPE html><p>test code completion
<script>
foobar = true;
</script>`;
add_task(async function () {
const hud = await openNewTabAndConsole(TEST_URI);
const { jsterm } = hud;
const { autocompletePopup } = jsterm;
// Test typing 'docu'.
await setInputValueForAutocompletion(hud, "foob");
is(getInputValue(hud), "foob", "'foob' completion (input.value)");
checkInputCompletionValue(hud, "ar", "'foob' completion (completeNode)");
is(autocompletePopup.items.length, 1, "autocomplete popup has 1 item");
is(autocompletePopup.isOpen, false, "autocomplete popup is not open");
// Test typing 'docu' and press tab.
EventUtils.synthesizeKey("KEY_Tab");
is(getInputValue(hud), "foobar", "'foob' tab completion");
checkInputCursorPosition(
hud,
"foobar".length,
"cursor is at the end of 'foobar'"
);
is(getInputCompletionValue(hud).replace(/ /g, ""), "", "'foob' completed");
// Test typing 'window.Ob' and press tab. Just 'window.O' is
// ambiguous: could be window.Object, window.Option, etc.
await setInputValueForAutocompletion(hud, "window.Ob");
EventUtils.synthesizeKey("KEY_Tab");
is(getInputValue(hud), "window.Object", "'window.Ob' tab completion");
// Test typing 'document.getElem'.
const onPopupOpened = autocompletePopup.once("popup-opened");
await setInputValueForAutocompletion(hud, "document.getElem");
is(getInputValue(hud), "document.getElem", "'document.getElem' completion");
checkInputCompletionValue(hud, "entById", "'document.getElem' completion");
// Test pressing key down.
await onPopupOpened;
EventUtils.synthesizeKey("KEY_ArrowDown");
is(getInputValue(hud), "document.getElem", "'document.getElem' completion");
checkInputCompletionValue(
hud,
"entsByClassName",
"'document.getElem' another tab completion"
);
// Test pressing key up.
EventUtils.synthesizeKey("KEY_ArrowUp");
await waitFor(() => (getInputCompletionValue(hud) || "").includes("entById"));
is(
getInputValue(hud),
"document.getElem",
"'document.getElem' untab completion"
);
checkInputCompletionValue(hud, "entById", "'document.getElem' completion");
await clearOutput(hud);
await setInputValueForAutocompletion(hud, "docu");
checkInputCompletionValue(hud, "ment", "'docu' completion");
let onAutocompletUpdated = jsterm.once("autocomplete-updated");
EventUtils.synthesizeKey("KEY_Enter");
await onAutocompletUpdated;
checkInputCompletionValue(hud, "", "clear completion on execute()");
// Test multi-line completion works. We can't use setInputValueForAutocompletion because
// it would trigger an evaluation (because of the new line, an Enter keypress is
// simulated).
onAutocompletUpdated = jsterm.once("autocomplete-updated");
setInputValue(hud, "console.log('one');\n");
EventUtils.sendString("consol");
await onAutocompletUpdated;
checkInputCompletionValue(hud, "e", "multi-line completion");
// Test multi-line completion works even if there is text after the cursor
onAutocompletUpdated = jsterm.once("autocomplete-updated");
setInputValue(hud, "{\n\n}");
EventUtils.synthesizeKey("KEY_ArrowUp");
EventUtils.sendString("console.g");
await onAutocompletUpdated;
checkInputValueAndCursorPosition(hud, "{\nconsole.g|\n}");
checkInputCompletionValue(hud, "roup", "multi-line completion");
is(autocompletePopup.isOpen, true, "popup is opened");
// Test non-object autocompletion.
await setInputValueForAutocompletion(hud, "Object.name.sl");
checkInputCompletionValue(hud, "ice", "non-object completion");
// Test string literal autocompletion.
await setInputValueForAutocompletion(hud, "'Asimov'.sl");
checkInputCompletionValue(hud, "ice", "string literal completion");
});