summaryrefslogtreecommitdiffstats
path: root/devtools/client/webconsole/test/browser_console_history_persist.js
blob: 61c4cbf4dfbc7d2c57dcc34aaaf9deff854a898e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/* -*- 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/ */

// 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,Web Console test for " +
                 "persisting history - bug 943306";
const INPUT_HISTORY_COUNT = 10;

add_task(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.
  yield loadTab(TEST_URI);
  let hud1 = yield openConsole();
  is(JSON.stringify(hud1.jsterm.history), "[]",
     "No history on first tab initially");
  yield populateInputHistory(hud1);
  is(JSON.stringify(hud1.jsterm.history),
     '["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.
  yield loadTab(TEST_URI);
  let hud2 = yield openConsole();
  is(JSON.stringify(hud2.jsterm.history),
     '["0","1","2","3","4","5","6","7","8","9"]',
     "Second tab has populated history");
  yield testNaviatingHistoryInUI(hud2);
  is(JSON.stringify(hud2.jsterm.history),
     '["0","1","2","3","4","5","6","7","8","9",""]',
     "An empty entry has been added in the second tab due to history perusal");

  // 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
  yield loadTab(TEST_URI);
  let hud3 = yield openConsole();
  is(JSON.stringify(hud3.jsterm.history),
     '["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.
  hud3.jsterm.setInputValue('"hello from third tab"');
  hud3.jsterm.execute();

  is(JSON.stringify(hud1.jsterm.history),
     '["0","1","2","3","4","5","6","7","8","9"]',
     "First tab history hasn't changed due to command in third tab");
  is(JSON.stringify(hud2.jsterm.history),
     '["0","1","2","3","4","5","6","7","8","9",""]',
     "Second tab history hasn't changed due to command in third tab");
  is(JSON.stringify(hud3.jsterm.history),
     '["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.
  yield loadTab(TEST_URI);
  let hud4 = yield openConsole();
  is(JSON.stringify(hud4.jsterm.history),
     '["1","2","3","4","5","6","7","8","9","\\"hello from third tab\\""]',
     "Fourth tab has most recent history");

  yield hud4.jsterm.clearHistory();
  is(JSON.stringify(hud4.jsterm.history), "[]",
     "Clearing history for a tab works");

  yield loadTab(TEST_URI);
  let hud5 = yield openConsole();
  is(JSON.stringify(hud5.jsterm.history), "[]",
     "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]
 */
function* populateInputHistory(hud) {
  let jsterm = hud.jsterm;

  for (let i = 0; i < INPUT_HISTORY_COUNT; i++) {
    // Set input value separately from execute so UP arrow accurately navigates
    // history.
    jsterm.setInputValue(i);
    jsterm.execute();
  }
}

/**
 * Check pressing up results in history traversal like:
 *  [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
 */
function* testNaviatingHistoryInUI(hud) {
  let jsterm = hud.jsterm;
  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("VK_UP", {});
    is(jsterm.getInputValue(), i, "Pressing up restores last input");
  }
}