forked from mirrors/gecko-dev
177 lines
5.8 KiB
JavaScript
177 lines
5.8 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
// Tests reverse search features.
|
|
|
|
"use strict";
|
|
|
|
const TEST_URI = `data:text/html,<!DOCTYPE html><meta charset=utf8>Test reverse search`;
|
|
const isMacOS = AppConstants.platform === "macosx";
|
|
|
|
add_task(async function () {
|
|
const hud = await openNewTabAndConsole(TEST_URI);
|
|
|
|
const jstermHistory = [
|
|
`document`,
|
|
`Dog = "Snoopy"`,
|
|
`document
|
|
.querySelectorAll("*")
|
|
.forEach(()=>{})`,
|
|
`document`,
|
|
`"a" + "😎"`,
|
|
];
|
|
|
|
// We have to wait for the same message twice in order to wait for the evaluation line
|
|
// as well as the result line
|
|
const onLastMessage = Promise.all([
|
|
waitForMessageByType(hud, `"a" + "😎"`, ".command"),
|
|
waitForMessageByType(hud, `"a😎"`, ".result"),
|
|
]);
|
|
for (const input of jstermHistory) {
|
|
execute(hud, input);
|
|
}
|
|
await onLastMessage;
|
|
|
|
const initialValue = "initialValue";
|
|
setInputValue(hud, initialValue);
|
|
|
|
info("Check that the reverse search toolbar as the expected initial state");
|
|
let reverseSearchElement = await openReverseSearch(hud);
|
|
ok(
|
|
reverseSearchElement,
|
|
"Reverse search is displayed with a keyboard shortcut"
|
|
);
|
|
ok(
|
|
!getReverseSearchInfoElement(hud),
|
|
"The result info element is not displayed by default"
|
|
);
|
|
ok(
|
|
!reverseSearchElement.querySelector(".search-result-button-prev") &&
|
|
!reverseSearchElement.querySelector(".search-result-button-next"),
|
|
"The results navigation buttons are not displayed by default"
|
|
);
|
|
is(
|
|
getInputValue(hud),
|
|
initialValue,
|
|
"The jsterm value is not changed when opening reverse search"
|
|
);
|
|
is(isReverseSearchInputFocused(hud), true, "reverse search input is focused");
|
|
|
|
EventUtils.sendString("d");
|
|
let infoElement = await waitFor(() => getReverseSearchInfoElement(hud));
|
|
is(
|
|
infoElement.textContent,
|
|
"3 of 3 results",
|
|
"The reverse info has the expected text " +
|
|
"— duplicated results (`document`) are coalesced"
|
|
);
|
|
|
|
const previousButton = reverseSearchElement.querySelector(
|
|
".search-result-button-prev"
|
|
);
|
|
const nextButton = reverseSearchElement.querySelector(
|
|
".search-result-button-next"
|
|
);
|
|
ok(previousButton, "Previous navigation button is now displayed");
|
|
is(
|
|
previousButton.title,
|
|
`Previous result (${isMacOS ? "Ctrl + R" : "F9"})`,
|
|
"Previous navigation button has expected title"
|
|
);
|
|
|
|
ok(nextButton, "Next navigation button is now displayed");
|
|
is(
|
|
nextButton.title,
|
|
`Next result (${isMacOS ? "Ctrl + S" : "Shift + F9"})`,
|
|
"Next navigation button has expected title"
|
|
);
|
|
is(getInputValue(hud), "document", "JsTerm has the expected input");
|
|
is(
|
|
hud.jsterm.autocompletePopup.isOpen,
|
|
false,
|
|
"Setting the input value did not trigger the autocompletion"
|
|
);
|
|
is(isReverseSearchInputFocused(hud), true, "reverse search input is focused");
|
|
|
|
let onJsTermValueChanged = hud.jsterm.once("set-input-value");
|
|
EventUtils.sendString("og");
|
|
await onJsTermValueChanged;
|
|
is(getInputValue(hud), `Dog = "Snoopy"`, "JsTerm input was updated");
|
|
is(
|
|
infoElement.textContent,
|
|
"1 result",
|
|
"The reverse info has the expected text"
|
|
);
|
|
ok(
|
|
!reverseSearchElement.querySelector(".search-result-button-prev") &&
|
|
!reverseSearchElement.querySelector(".search-result-button-next"),
|
|
"The results navigation buttons are not displayed when there's only one result"
|
|
);
|
|
|
|
info("Check that the UI and results are updated when typing in the input");
|
|
onJsTermValueChanged = hud.jsterm.once("set-input-value");
|
|
EventUtils.sendString("g");
|
|
await waitFor(() => reverseSearchElement.classList.contains("no-result"));
|
|
is(
|
|
getInputValue(hud),
|
|
`Dog = "Snoopy"`,
|
|
"JsTerm input was not updated since there's no results"
|
|
);
|
|
is(
|
|
infoElement.textContent,
|
|
"No results",
|
|
"The reverse info has the expected text"
|
|
);
|
|
ok(
|
|
!reverseSearchElement.querySelector(".search-result-button-prev") &&
|
|
!reverseSearchElement.querySelector(".search-result-button-next"),
|
|
"The results navigation buttons are not displayed when there's no result"
|
|
);
|
|
|
|
info("Check that Backspace updates the UI");
|
|
EventUtils.synthesizeKey("KEY_Backspace");
|
|
await waitFor(() => !reverseSearchElement.classList.contains("no-result"));
|
|
is(
|
|
infoElement.textContent,
|
|
"1 result",
|
|
"The reverse info has the expected text"
|
|
);
|
|
is(getInputValue(hud), `Dog = "Snoopy"`, "JsTerm kept its value");
|
|
|
|
info("Check that Escape does not affect the jsterm value");
|
|
EventUtils.synthesizeKey("KEY_Escape");
|
|
await waitFor(() => !getReverseSearchElement(hud));
|
|
is(
|
|
getInputValue(hud),
|
|
`Dog = "Snoopy"`,
|
|
"Closing the input did not changed the JsTerm value"
|
|
);
|
|
is(isInputFocused(hud), true, "input is focused");
|
|
|
|
info("Check that the search works with emojis");
|
|
reverseSearchElement = await openReverseSearch(hud);
|
|
onJsTermValueChanged = hud.jsterm.once("set-input-value");
|
|
EventUtils.sendString("😎");
|
|
infoElement = await waitFor(() => getReverseSearchInfoElement(hud));
|
|
is(
|
|
infoElement.textContent,
|
|
"1 result",
|
|
"The reverse info has the expected text"
|
|
);
|
|
|
|
info("Check that Enter evaluates the JsTerm and closes the UI");
|
|
// We have to wait for the same message twice in order to wait for the evaluation line
|
|
// as well as the result line
|
|
const onMessage = Promise.all([
|
|
waitForMessageByType(hud, `"a" + "😎"`, ".command"),
|
|
waitForMessageByType(hud, `"a😎"`, ".result"),
|
|
]);
|
|
const onReverseSearchClose = waitFor(() => !getReverseSearchElement(hud));
|
|
EventUtils.synthesizeKey("KEY_Enter");
|
|
await Promise.all([onMessage, onReverseSearchClose]);
|
|
ok(
|
|
true,
|
|
"Enter evaluates what's in the JsTerm and closes the reverse search UI"
|
|
);
|
|
});
|