Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
// Test that console command input is persisted across toolbox loads.
// See Bug 943306.
"use strict";
requestLongerTimeout(2);
const TEST_URI =
"data:text/html;charset=utf-8,<!DOCTYPE html>Web Console test for persisting history";
const INPUT_HISTORY_COUNT = 10;
const {
getHistoryEntries,
} = require("resource://devtools/client/webconsole/selectors/history.js");
add_task(async function () {
info("Setting custom input history pref to " + INPUT_HISTORY_COUNT);
Services.prefs.setIntPref(
"devtools.webconsole.inputHistoryCount",
INPUT_HISTORY_COUNT
);
// First tab: run a bunch of commands and then make sure that you can
// navigate through their history.
const hud1 = await openNewTabAndConsole(TEST_URI);
let state1 = hud1.ui.wrapper.getStore().getState();
is(
JSON.stringify(getHistoryEntries(state1)),
"[]",
"No history on first tab initially"
);
await populateInputHistory(hud1);
state1 = hud1.ui.wrapper.getStore().getState();
is(
JSON.stringify(getHistoryEntries(state1)),
'["0","1","2","3","4","5","6","7","8","9"]',
"First tab has populated history"
);
// Second tab: Just make sure that you can navigate through the history
// generated by the first tab.
const hud2 = await openNewTabAndConsole(TEST_URI, false);
let state2 = hud2.ui.wrapper.getStore().getState();
is(
JSON.stringify(getHistoryEntries(state2)),
'["0","1","2","3","4","5","6","7","8","9"]',
"Second tab has populated history"
);
await testNavigatingHistoryInUI(hud2);
state2 = hud2.ui.wrapper.getStore().getState();
is(
JSON.stringify(getHistoryEntries(state2)),
'["0","1","2","3","4","5","6","7","8","9"]',
"An empty entry has been added in the second tab due to history perusal"
);
is(
state2.history.originalUserValue,
"",
"An empty value has been stored as the current input value"
);
// Third tab: Should have the same history as first tab, but if we run a
// command, then the history of the first and second shouldn't be affected
const hud3 = await openNewTabAndConsole(TEST_URI, false);
let state3 = hud3.ui.wrapper.getStore().getState();
is(
JSON.stringify(getHistoryEntries(state3)),
'["0","1","2","3","4","5","6","7","8","9"]',
"Third tab has populated history"
);
// Set input value separately from execute so UP arrow accurately navigates
// history.
setInputValue(hud3, '"hello from third tab"');
await executeAndWaitForResultMessage(
hud3,
'"hello from third tab"',
'"hello from third tab"'
);
state1 = hud1.ui.wrapper.getStore().getState();
is(
JSON.stringify(getHistoryEntries(state1)),
'["0","1","2","3","4","5","6","7","8","9"]',
"First tab history hasn't changed due to command in third tab"
);
state2 = hud2.ui.wrapper.getStore().getState();
is(
JSON.stringify(getHistoryEntries(state2)),
'["0","1","2","3","4","5","6","7","8","9"]',
"Second tab history hasn't changed due to command in third tab"
);
is(
state2.history.originalUserValue,
"",
"Current input value hasn't changed due to command in third tab"
);
state3 = hud3.ui.wrapper.getStore().getState();
is(
JSON.stringify(getHistoryEntries(state3)),
'["1","2","3","4","5","6","7","8","9","\\"hello from third tab\\""]',
"Third tab has updated history (and purged the first result) after " +
"running a command"
);
// Fourth tab: Should have the latest command from the third tab, followed
// by the rest of the history from the first tab.
const hud4 = await openNewTabAndConsole(TEST_URI, false);
let state4 = hud4.ui.wrapper.getStore().getState();
is(
JSON.stringify(getHistoryEntries(state4)),
'["1","2","3","4","5","6","7","8","9","\\"hello from third tab\\""]',
"Fourth tab has most recent history"
);
await hud4.ui.wrapper.dispatchClearHistory();
state4 = hud4.ui.wrapper.getStore().getState();
is(
JSON.stringify(getHistoryEntries(state4)),
"[]",
"Clearing history for a tab works"
);
const hud5 = await openNewTabAndConsole(TEST_URI, false);
const state5 = hud5.ui.wrapper.getStore().getState();
is(
JSON.stringify(getHistoryEntries(state5)),
"[]",
"Clearing history carries over to a new tab"
);
info("Clearing custom input history pref");
Services.prefs.clearUserPref("devtools.webconsole.inputHistoryCount");
});
/**
* Populate the history by running the following commands:
* [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
*/
async function populateInputHistory(hud) {
for (let i = 0; i < INPUT_HISTORY_COUNT; i++) {
const input = i.toString();
await executeAndWaitForResultMessage(hud, input, input);
}
}
/**
* Check pressing up results in history traversal like:
* [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
*/
function testNavigatingHistoryInUI(hud) {
const { jsterm } = hud;
jsterm.focus();
// Count backwards from original input and make sure that pressing up
// restores this.
for (let i = INPUT_HISTORY_COUNT - 1; i >= 0; i--) {
EventUtils.synthesizeKey("KEY_ArrowUp");
is(getInputValue(hud), i.toString(), "Pressing up restores last input");
}
}