summaryrefslogtreecommitdiff
path: root/toolkit/devtools/netmonitor/test/browser_net_prefs-reload.js
blob: 669ec31f2aec814b8ba518673195e6587ed99bcd (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
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

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

function test() {
  initNetMonitor(SIMPLE_URL).then(([aTab, aDebuggee, aMonitor]) => {
    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 = () => aMonitor.panelWin.NetMonitorView;
    let getController = () => aMonitor.panelWin.NetMonitorController;

    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: ($, aValue) => aValue.forEach(e => getView().RequestsMenu.filterOn(e))
      },
      networkDetailsWidth: {
        newValue: ~~(Math.random() * 200 + 100),
        validateValue: ($) => ~~$("#details-pane").getAttribute("width"),
        modifyFrontend: ($, aValue) => $("#details-pane").setAttribute("width", aValue)
      },
      networkDetailsHeight: {
        newValue: ~~(Math.random() * 300 + 100),
        validateValue: ($) => ~~$("#details-pane").getAttribute("height"),
        modifyFrontend: ($, aValue) => $("#details-pane").setAttribute("height", aValue)
      }
      /* add more prefs here... */
    };

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

      for (let name in prefsToCheck) {
        let currentValue = aMonitor.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 = aMonitor.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(aMonitor.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 = aMonitor.panelWin.Prefs[name];
        let firstValue = prefsToCheck[name].firstValue;
        let newValue = prefsToCheck[name].newValue;
        let validateValue = prefsToCheck[name].validateValue;
        let modifyFrontend = prefsToCheck[name].modifyFrontend;

        modifyFrontend(aMonitor.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(aMonitor.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 = aMonitor.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(aMonitor.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 = aMonitor.panelWin.Prefs[name];
        let firstValue = prefsToCheck[name].firstValue;
        let newValue = prefsToCheck[name].newValue;
        let validateValue = prefsToCheck[name].validateValue;
        let modifyFrontend = prefsToCheck[name].modifyFrontend;

        modifyFrontend(aMonitor.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(aMonitor.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();

      return restartNetMonitor(aMonitor)
        .then(([,, aNewMonitor]) => {
          aMonitor = aNewMonitor;

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

          return restartNetMonitor(aMonitor);
        })
        .then(([,, aNewMonitor]) => {
          aMonitor = aNewMonitor;

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

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

      return aMonitor._toolbox.switchHost(Toolbox.HostType.SIDE)
        .then(() => {
          info("Testing prefs reload for a side host.");
          storeFirstPrefValues();

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

          return restartNetMonitor(aMonitor);
        })
        .then(([,, aNewMonitor]) => {
          aMonitor = aNewMonitor;

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

          return restartNetMonitor(aMonitor);
        })
        .then(([,, aNewMonitor]) => {
          aMonitor = aNewMonitor;

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

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

      return aMonitor._toolbox.switchHost(Toolbox.HostType.WINDOW)
        .then(() => {
          info("Testing prefs reload for a window host.");
          storeFirstPrefValues();

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

          return restartNetMonitor(aMonitor);
        })
        .then(([,, aNewMonitor]) => {
          aMonitor = aNewMonitor;

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

          return restartNetMonitor(aMonitor);
        })
        .then(([,, aNewMonitor]) => {
          aMonitor = aNewMonitor;

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

    function cleanupAndFinish() {
      info("Moving toolbox back to the bottom...");

      aMonitor._toolbox.switchHost(Toolbox.HostType.BOTTOM)
        .then(() => teardown(aMonitor))
        .then(finish);
    }

    testBottom()
      .then(testSide)
      .then(testWindow)
      .then(cleanupAndFinish);
  });
}