summaryrefslogtreecommitdiffstats
path: root/devtools/client/netmonitor/test/browser_net_prefs-reload.js
blob: ee56ee4461795f835d135b446fdb9ed6dd89d3fc (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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

/**
 * Tests if the prefs that should survive across tool reloads work.
 */

add_task(function* () {
  let Actions = require("devtools/client/netmonitor/actions/index");
  let { monitor } = yield initNetMonitor(SIMPLE_URL);
  info("Starting test... ");

  // This test reopens the network monitor a bunch of times, for different
  // hosts (bottom, side, window). This seems to be slow on debug builds.
  requestLongerTimeout(3);

  // Use these getters instead of caching instances inside the panel win,
  // since the tool is reopened a bunch of times during this test
  // and the instances will differ.
  let getView = () => monitor.panelWin.NetMonitorView;
  let getStore = () => monitor.panelWin.gStore;

  let prefsToCheck = {
    filters: {
      // A custom new value to be used for the verified preference.
      newValue: ["html", "css"],
      // Getter used to retrieve the current value from the frontend, in order
      // to verify that the pref was applied properly.
      validateValue: ($) => getView().RequestsMenu._activeFilters,
      // Predicate used to modify the frontend when setting the new pref value,
      // before trying to validate the changes.
      modifyFrontend: ($, value) => value.forEach(e =>
        getStore().dispatch(Actions.toggleFilterType(e)))
    },
    networkDetailsWidth: {
      newValue: ~~(Math.random() * 200 + 100),
      validateValue: ($) => ~~$("#details-pane").getAttribute("width"),
      modifyFrontend: ($, value) => $("#details-pane").setAttribute("width", value)
    },
    networkDetailsHeight: {
      newValue: ~~(Math.random() * 300 + 100),
      validateValue: ($) => ~~$("#details-pane").getAttribute("height"),
      modifyFrontend: ($, value) => $("#details-pane").setAttribute("height", value)
    }
    /* add more prefs here... */
  };

  yield testBottom();
  yield testSide();
  yield testWindow();

  info("Moving toolbox back to the bottom...");
  yield monitor._toolbox.switchHost(Toolbox.HostType.BOTTOM);
  return teardown(monitor);

  function storeFirstPrefValues() {
    info("Caching initial pref values.");

    for (let name in prefsToCheck) {
      let currentValue = monitor.panelWin.Prefs[name];
      prefsToCheck[name].firstValue = currentValue;
    }
  }

  function validateFirstPrefValues() {
    info("Validating current pref values to the UI elements.");

    for (let name in prefsToCheck) {
      let currentValue = monitor.panelWin.Prefs[name];
      let firstValue = prefsToCheck[name].firstValue;
      let validateValue = prefsToCheck[name].validateValue;

      is(currentValue.toSource(), firstValue.toSource(),
        "Pref " + name + " should be equal to first value: " + firstValue);
      is(currentValue.toSource(), validateValue(monitor.panelWin.$).toSource(),
        "Pref " + name + " should validate: " + currentValue);
    }
  }

  function modifyFrontend() {
    info("Modifying UI elements to the specified new values.");

    for (let name in prefsToCheck) {
      let currentValue = monitor.panelWin.Prefs[name];
      let firstValue = prefsToCheck[name].firstValue;
      let newValue = prefsToCheck[name].newValue;
      let validateValue = prefsToCheck[name].validateValue;
      let modFrontend = prefsToCheck[name].modifyFrontend;

      modFrontend(monitor.panelWin.$, newValue);
      info("Modified UI element affecting " + name + " to: " + newValue);

      is(currentValue.toSource(), firstValue.toSource(),
        "Pref " + name + " should still be equal to first value: " + firstValue);
      isnot(currentValue.toSource(), newValue.toSource(),
        "Pref " + name + " should't yet be equal to second value: " + newValue);
      is(newValue.toSource(), validateValue(monitor.panelWin.$).toSource(),
        "The UI element affecting " + name + " should validate: " + newValue);
    }
  }

  function validateNewPrefValues() {
    info("Invalidating old pref values to the modified UI elements.");

    for (let name in prefsToCheck) {
      let currentValue = monitor.panelWin.Prefs[name];
      let firstValue = prefsToCheck[name].firstValue;
      let newValue = prefsToCheck[name].newValue;
      let validateValue = prefsToCheck[name].validateValue;

      isnot(currentValue.toSource(), firstValue.toSource(),
        "Pref " + name + " should't be equal to first value: " + firstValue);
      is(currentValue.toSource(), newValue.toSource(),
        "Pref " + name + " should now be equal to second value: " + newValue);
      is(newValue.toSource(), validateValue(monitor.panelWin.$).toSource(),
        "The UI element affecting " + name + " should validate: " + newValue);
    }
  }

  function resetFrontend() {
    info("Resetting UI elements to the cached initial pref values.");

    for (let name in prefsToCheck) {
      let currentValue = monitor.panelWin.Prefs[name];
      let firstValue = prefsToCheck[name].firstValue;
      let newValue = prefsToCheck[name].newValue;
      let validateValue = prefsToCheck[name].validateValue;
      let modFrontend = prefsToCheck[name].modifyFrontend;

      modFrontend(monitor.panelWin.$, firstValue);
      info("Modified UI element affecting " + name + " to: " + firstValue);

      isnot(currentValue.toSource(), firstValue.toSource(),
        "Pref " + name + " should't yet be equal to first value: " + firstValue);
      is(currentValue.toSource(), newValue.toSource(),
        "Pref " + name + " should still be equal to second value: " + newValue);
      is(firstValue.toSource(), validateValue(monitor.panelWin.$).toSource(),
        "The UI element affecting " + name + " should validate: " + firstValue);
    }
  }

  function* testBottom() {
    info("Testing prefs reload for a bottom host.");
    storeFirstPrefValues();

    // Validate and modify while toolbox is on the bottom.
    validateFirstPrefValues();
    modifyFrontend();

    let newMonitor = yield restartNetMonitor(monitor);
    monitor = newMonitor.monitor;

    // Revalidate and reset frontend while toolbox is on the bottom.
    validateNewPrefValues();
    resetFrontend();

    newMonitor = yield restartNetMonitor(monitor);
    monitor = newMonitor.monitor;

    // Revalidate.
    validateFirstPrefValues();
  }

  function* testSide() {
    info("Moving toolbox to the side...");

    yield monitor._toolbox.switchHost(Toolbox.HostType.SIDE);
    info("Testing prefs reload for a side host.");
    storeFirstPrefValues();

    // Validate and modify frontend while toolbox is on the side.
    validateFirstPrefValues();
    modifyFrontend();

    let newMonitor = yield restartNetMonitor(monitor);
    monitor = newMonitor.monitor;

    // Revalidate and reset frontend while toolbox is on the side.
    validateNewPrefValues();
    resetFrontend();

    newMonitor = yield restartNetMonitor(monitor);
    monitor = newMonitor.monitor;

    // Revalidate.
    validateFirstPrefValues();
  }

  function* testWindow() {
    info("Moving toolbox into a window...");

    yield monitor._toolbox.switchHost(Toolbox.HostType.WINDOW);
    info("Testing prefs reload for a window host.");
    storeFirstPrefValues();

    // Validate and modify frontend while toolbox is in a window.
    validateFirstPrefValues();
    modifyFrontend();

    let newMonitor = yield restartNetMonitor(monitor);
    monitor = newMonitor.monitor;

    // Revalidate and reset frontend while toolbox is in a window.
    validateNewPrefValues();
    resetFrontend();

    newMonitor = yield restartNetMonitor(monitor);
    monitor = newMonitor.monitor;

    // Revalidate.
    validateFirstPrefValues();
  }
});