|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
3 |
|
4 /** |
|
5 * Tests if requests render correct information in the details UI. |
|
6 */ |
|
7 |
|
8 function test() { |
|
9 initNetMonitor(SIMPLE_SJS).then(([aTab, aDebuggee, aMonitor]) => { |
|
10 info("Starting test... "); |
|
11 |
|
12 let { document, L10N, Editor, NetMonitorView } = aMonitor.panelWin; |
|
13 let { RequestsMenu, NetworkDetails } = NetMonitorView; |
|
14 let TAB_UPDATED = aMonitor.panelWin.EVENTS.TAB_UPDATED; |
|
15 RequestsMenu.lazyUpdate = false; |
|
16 |
|
17 Task.spawn(function () { |
|
18 yield waitForNetworkEvents(aMonitor, 1); |
|
19 is(RequestsMenu.selectedItem, null, |
|
20 "There shouldn't be any selected item in the requests menu."); |
|
21 is(RequestsMenu.itemCount, 1, |
|
22 "The requests menu should not be empty after the first request."); |
|
23 is(NetMonitorView.detailsPaneHidden, true, |
|
24 "The details pane should still be hidden after the first request."); |
|
25 |
|
26 EventUtils.sendMouseEvent({ type: "mousedown" }, |
|
27 document.getElementById("details-pane-toggle")); |
|
28 |
|
29 isnot(RequestsMenu.selectedItem, null, |
|
30 "There should be a selected item in the requests menu."); |
|
31 is(RequestsMenu.selectedIndex, 0, |
|
32 "The first item should be selected in the requests menu."); |
|
33 is(NetMonitorView.detailsPaneHidden, false, |
|
34 "The details pane should not be hidden after toggle button was pressed."); |
|
35 |
|
36 yield waitFor(aMonitor.panelWin, TAB_UPDATED) |
|
37 testHeadersTab(); |
|
38 testCookiesTab(); |
|
39 testParamsTab(); |
|
40 yield testResponseTab(); |
|
41 testTimingsTab(); |
|
42 yield teardown(aMonitor); |
|
43 finish(); |
|
44 }); |
|
45 |
|
46 function testHeadersTab() { |
|
47 let tab = document.querySelectorAll("#details-pane tab")[0]; |
|
48 let tabpanel = document.querySelectorAll("#details-pane tabpanel")[0]; |
|
49 |
|
50 is(tab.getAttribute("selected"), "true", |
|
51 "The headers tab in the network details pane should be selected."); |
|
52 |
|
53 is(tabpanel.querySelector("#headers-summary-url-value").getAttribute("value"), |
|
54 SIMPLE_SJS, "The url summary value is incorrect."); |
|
55 is(tabpanel.querySelector("#headers-summary-url-value").getAttribute("tooltiptext"), |
|
56 SIMPLE_SJS, "The url summary tooltiptext is incorrect."); |
|
57 is(tabpanel.querySelector("#headers-summary-method-value").getAttribute("value"), |
|
58 "GET", "The method summary value is incorrect."); |
|
59 is(tabpanel.querySelector("#headers-summary-status-circle").getAttribute("code"), |
|
60 "200", "The status summary code is incorrect."); |
|
61 is(tabpanel.querySelector("#headers-summary-status-value").getAttribute("value"), |
|
62 "200 Och Aye", "The status summary value is incorrect."); |
|
63 |
|
64 is(tabpanel.querySelectorAll(".variables-view-scope").length, 2, |
|
65 "There should be 2 header scopes displayed in this tabpanel."); |
|
66 ok(tabpanel.querySelectorAll(".variable-or-property").length >= 12, |
|
67 "There should be at least 12 header values displayed in this tabpanel."); |
|
68 // Can't test for an exact total number of headers, because it seems to |
|
69 // vary across pgo/non-pgo builds. |
|
70 |
|
71 is(tabpanel.querySelectorAll(".variables-view-empty-notice").length, 0, |
|
72 "The empty notice should not be displayed in this tabpanel."); |
|
73 |
|
74 let responseScope = tabpanel.querySelectorAll(".variables-view-scope")[0]; |
|
75 let requestScope = tabpanel.querySelectorAll(".variables-view-scope")[1]; |
|
76 |
|
77 is(responseScope.querySelector(".name").getAttribute("value"), |
|
78 L10N.getStr("responseHeaders") + " (" + |
|
79 L10N.getFormatStr("networkMenu.sizeKB", L10N.numberWithDecimals(173/1024, 3)) + ")", |
|
80 "The response headers scope doesn't have the correct title."); |
|
81 |
|
82 ok(requestScope.querySelector(".name").getAttribute("value").contains( |
|
83 L10N.getStr("requestHeaders") + " (0"), |
|
84 "The request headers scope doesn't have the correct title."); |
|
85 // Can't test for full request headers title because the size may |
|
86 // vary across platforms ("User-Agent" header differs). We're pretty |
|
87 // sure it's smaller than 1 MB though, so it starts with a 0. |
|
88 |
|
89 is(responseScope.querySelectorAll(".variables-view-variable .name")[0].getAttribute("value"), |
|
90 "Connection", "The first response header name was incorrect."); |
|
91 is(responseScope.querySelectorAll(".variables-view-variable .value")[0].getAttribute("value"), |
|
92 "\"close\"", "The first response header value was incorrect."); |
|
93 is(responseScope.querySelectorAll(".variables-view-variable .name")[1].getAttribute("value"), |
|
94 "Content-Length", "The second response header name was incorrect."); |
|
95 is(responseScope.querySelectorAll(".variables-view-variable .value")[1].getAttribute("value"), |
|
96 "\"12\"", "The second response header value was incorrect."); |
|
97 is(responseScope.querySelectorAll(".variables-view-variable .name")[2].getAttribute("value"), |
|
98 "Content-Type", "The third response header name was incorrect."); |
|
99 is(responseScope.querySelectorAll(".variables-view-variable .value")[2].getAttribute("value"), |
|
100 "\"text/plain; charset=utf-8\"", "The third response header value was incorrect."); |
|
101 is(responseScope.querySelectorAll(".variables-view-variable .name")[5].getAttribute("value"), |
|
102 "foo-bar", "The last response header name was incorrect."); |
|
103 is(responseScope.querySelectorAll(".variables-view-variable .value")[5].getAttribute("value"), |
|
104 "\"baz\"", "The last response header value was incorrect."); |
|
105 |
|
106 is(requestScope.querySelectorAll(".variables-view-variable .name")[0].getAttribute("value"), |
|
107 "Host", "The first request header name was incorrect."); |
|
108 is(requestScope.querySelectorAll(".variables-view-variable .value")[0].getAttribute("value"), |
|
109 "\"example.com\"", "The first request header value was incorrect."); |
|
110 is(requestScope.querySelectorAll(".variables-view-variable .name")[5].getAttribute("value"), |
|
111 "Connection", "The penultimate request header name was incorrect."); |
|
112 is(requestScope.querySelectorAll(".variables-view-variable .value")[5].getAttribute("value"), |
|
113 "\"keep-alive\"", "The penultimate request header value was incorrect."); |
|
114 |
|
115 let lastReqHeaderName = requestScope.querySelectorAll(".variables-view-variable .name")[6]; |
|
116 let lastReqHeaderValue = requestScope.querySelectorAll(".variables-view-variable .value")[6]; |
|
117 if (lastReqHeaderName && lastReqHeaderValue) { |
|
118 is(lastReqHeaderName.getAttribute("value"), |
|
119 "Cache-Control", "The last request header name was incorrect."); |
|
120 is(lastReqHeaderValue.getAttribute("value"), |
|
121 "\"max-age=0\"", "The last request header value was incorrect."); |
|
122 } else { |
|
123 info("The number of request headers was 6 instead of 7. Technically, " + |
|
124 "not a failure in this particular test, but needs investigation."); |
|
125 } |
|
126 } |
|
127 |
|
128 function testCookiesTab() { |
|
129 EventUtils.sendMouseEvent({ type: "mousedown" }, |
|
130 document.querySelectorAll("#details-pane tab")[1]); |
|
131 |
|
132 let tab = document.querySelectorAll("#details-pane tab")[1]; |
|
133 let tabpanel = document.querySelectorAll("#details-pane tabpanel")[1]; |
|
134 |
|
135 is(tab.getAttribute("selected"), "true", |
|
136 "The cookies tab in the network details pane should be selected."); |
|
137 |
|
138 is(tabpanel.querySelectorAll(".variables-view-scope").length, 0, |
|
139 "There should be no cookie scopes displayed in this tabpanel."); |
|
140 is(tabpanel.querySelectorAll(".variable-or-property").length, 0, |
|
141 "There should be no cookie values displayed in this tabpanel."); |
|
142 is(tabpanel.querySelectorAll(".variables-view-empty-notice").length, 1, |
|
143 "The empty notice should be displayed in this tabpanel."); |
|
144 } |
|
145 |
|
146 function testParamsTab() { |
|
147 EventUtils.sendMouseEvent({ type: "mousedown" }, |
|
148 document.querySelectorAll("#details-pane tab")[2]); |
|
149 |
|
150 let tab = document.querySelectorAll("#details-pane tab")[2]; |
|
151 let tabpanel = document.querySelectorAll("#details-pane tabpanel")[2]; |
|
152 |
|
153 is(tab.getAttribute("selected"), "true", |
|
154 "The params tab in the network details pane should be selected."); |
|
155 |
|
156 is(tabpanel.querySelectorAll(".variables-view-scope").length, 0, |
|
157 "There should be no param scopes displayed in this tabpanel."); |
|
158 is(tabpanel.querySelectorAll(".variable-or-property").length, 0, |
|
159 "There should be no param values displayed in this tabpanel."); |
|
160 is(tabpanel.querySelectorAll(".variables-view-empty-notice").length, 1, |
|
161 "The empty notice should be displayed in this tabpanel."); |
|
162 |
|
163 is(tabpanel.querySelector("#request-params-box") |
|
164 .hasAttribute("hidden"), false, |
|
165 "The request params box should not be hidden."); |
|
166 is(tabpanel.querySelector("#request-post-data-textarea-box") |
|
167 .hasAttribute("hidden"), true, |
|
168 "The request post data textarea box should be hidden."); |
|
169 } |
|
170 |
|
171 function testResponseTab() { |
|
172 EventUtils.sendMouseEvent({ type: "mousedown" }, |
|
173 document.querySelectorAll("#details-pane tab")[3]); |
|
174 |
|
175 return Task.spawn(function () { |
|
176 yield waitFor(aMonitor.panelWin, TAB_UPDATED); |
|
177 |
|
178 let tab = document.querySelectorAll("#details-pane tab")[3]; |
|
179 let tabpanel = document.querySelectorAll("#details-pane tabpanel")[3]; |
|
180 |
|
181 is(tab.getAttribute("selected"), "true", |
|
182 "The response tab in the network details pane should be selected."); |
|
183 |
|
184 is(tabpanel.querySelector("#response-content-info-header") |
|
185 .hasAttribute("hidden"), true, |
|
186 "The response info header should be hidden."); |
|
187 is(tabpanel.querySelector("#response-content-json-box") |
|
188 .hasAttribute("hidden"), true, |
|
189 "The response content json box should be hidden."); |
|
190 is(tabpanel.querySelector("#response-content-textarea-box") |
|
191 .hasAttribute("hidden"), false, |
|
192 "The response content textarea box should not be hidden."); |
|
193 is(tabpanel.querySelector("#response-content-image-box") |
|
194 .hasAttribute("hidden"), true, |
|
195 "The response content image box should be hidden."); |
|
196 |
|
197 let aEditor = yield NetMonitorView.editor("#response-content-textarea"); |
|
198 is(aEditor.getText(), "Hello world!", |
|
199 "The text shown in the source editor is incorrect."); |
|
200 is(aEditor.getMode(), Editor.modes.text, |
|
201 "The mode active in the source editor is incorrect."); |
|
202 }); |
|
203 } |
|
204 |
|
205 function testTimingsTab() { |
|
206 EventUtils.sendMouseEvent({ type: "mousedown" }, |
|
207 document.querySelectorAll("#details-pane tab")[4]); |
|
208 |
|
209 let tab = document.querySelectorAll("#details-pane tab")[4]; |
|
210 let tabpanel = document.querySelectorAll("#details-pane tabpanel")[4]; |
|
211 |
|
212 is(tab.getAttribute("selected"), "true", |
|
213 "The timings tab in the network details pane should be selected."); |
|
214 |
|
215 ok(tabpanel.querySelector("#timings-summary-blocked .requests-menu-timings-total") |
|
216 .getAttribute("value").match(/[0-9]+/), |
|
217 "The blocked timing info does not appear to be correct."); |
|
218 |
|
219 ok(tabpanel.querySelector("#timings-summary-dns .requests-menu-timings-total") |
|
220 .getAttribute("value").match(/[0-9]+/), |
|
221 "The dns timing info does not appear to be correct."); |
|
222 |
|
223 ok(tabpanel.querySelector("#timings-summary-connect .requests-menu-timings-total") |
|
224 .getAttribute("value").match(/[0-9]+/), |
|
225 "The connect timing info does not appear to be correct."); |
|
226 |
|
227 ok(tabpanel.querySelector("#timings-summary-send .requests-menu-timings-total") |
|
228 .getAttribute("value").match(/[0-9]+/), |
|
229 "The send timing info does not appear to be correct."); |
|
230 |
|
231 ok(tabpanel.querySelector("#timings-summary-wait .requests-menu-timings-total") |
|
232 .getAttribute("value").match(/[0-9]+/), |
|
233 "The wait timing info does not appear to be correct."); |
|
234 |
|
235 ok(tabpanel.querySelector("#timings-summary-receive .requests-menu-timings-total") |
|
236 .getAttribute("value").match(/[0-9]+/), |
|
237 "The receive timing info does not appear to be correct."); |
|
238 } |
|
239 |
|
240 aDebuggee.location.reload(); |
|
241 }); |
|
242 } |