|
1 /* |
|
2 * Any copyright is dedicated to the Public Domain. |
|
3 * http://creativecommons.org/publicdomain/zero/1.0/ |
|
4 */ |
|
5 |
|
6 // Bug 874061: test for how the browser and web consoles display messages coming |
|
7 // from private windows. See bug for description of expected behavior. |
|
8 |
|
9 function test() |
|
10 { |
|
11 const TEST_URI = "data:text/html;charset=utf8,<p>hello world! bug 874061" + |
|
12 "<button onclick='console.log(\"foobar bug 874061\");" + |
|
13 "fooBazBaz.yummy()'>click</button>"; |
|
14 let ConsoleAPIStorage = Cc["@mozilla.org/consoleAPI-storage;1"] |
|
15 .getService(Ci.nsIConsoleAPIStorage); |
|
16 let privateWindow, privateBrowser, privateTab, privateContent; |
|
17 let hud, expectedMessages, nonPrivateMessage; |
|
18 |
|
19 // This test is slightly more involved: it opens the web console twice, |
|
20 // a new private window once, and the browser console twice. We can get |
|
21 // a timeout with debug builds on slower machines. |
|
22 requestLongerTimeout(2); |
|
23 start(); |
|
24 |
|
25 function start() |
|
26 { |
|
27 gBrowser.selectedTab = gBrowser.addTab("data:text/html;charset=utf8," + |
|
28 "<p>hello world! I am not private!"); |
|
29 gBrowser.selectedBrowser.addEventListener("load", onLoadTab, true); |
|
30 } |
|
31 |
|
32 function onLoadTab() |
|
33 { |
|
34 gBrowser.selectedBrowser.removeEventListener("load", onLoadTab, true); |
|
35 info("onLoadTab()"); |
|
36 |
|
37 // Make sure we have a clean state to start with. |
|
38 Services.console.reset(); |
|
39 ConsoleAPIStorage.clearEvents(); |
|
40 |
|
41 // Add a non-private message to the browser console. |
|
42 content.console.log("bug874061-not-private"); |
|
43 |
|
44 nonPrivateMessage = { |
|
45 name: "console message from a non-private window", |
|
46 text: "bug874061-not-private", |
|
47 category: CATEGORY_WEBDEV, |
|
48 severity: SEVERITY_LOG, |
|
49 }; |
|
50 |
|
51 privateWindow = OpenBrowserWindow({ private: true }); |
|
52 ok(privateWindow, "new private window"); |
|
53 ok(PrivateBrowsingUtils.isWindowPrivate(privateWindow), "window is private"); |
|
54 |
|
55 whenDelayedStartupFinished(privateWindow, onPrivateWindowReady); |
|
56 } |
|
57 |
|
58 function onPrivateWindowReady() |
|
59 { |
|
60 info("private browser window opened"); |
|
61 privateBrowser = privateWindow.gBrowser; |
|
62 |
|
63 privateTab = privateBrowser.selectedTab = privateBrowser.addTab(TEST_URI); |
|
64 privateBrowser.selectedBrowser.addEventListener("load", function onLoad() { |
|
65 info("private tab opened"); |
|
66 privateBrowser.selectedBrowser.removeEventListener("load", onLoad, true); |
|
67 privateContent = privateBrowser.selectedBrowser.contentWindow; |
|
68 ok(PrivateBrowsingUtils.isWindowPrivate(privateContent), "tab window is private"); |
|
69 openConsole(privateTab, consoleOpened); |
|
70 }, true); |
|
71 } |
|
72 |
|
73 function addMessages() |
|
74 { |
|
75 let button = privateContent.document.querySelector("button"); |
|
76 ok(button, "button in page"); |
|
77 EventUtils.synthesizeMouse(button, 2, 2, {}, privateContent); |
|
78 } |
|
79 |
|
80 function consoleOpened(aHud) |
|
81 { |
|
82 hud = aHud; |
|
83 ok(hud, "web console opened"); |
|
84 |
|
85 addMessages(); |
|
86 expectedMessages = [ |
|
87 { |
|
88 name: "script error", |
|
89 text: "fooBazBaz is not defined", |
|
90 category: CATEGORY_JS, |
|
91 severity: SEVERITY_ERROR, |
|
92 }, |
|
93 { |
|
94 name: "console message", |
|
95 text: "foobar bug 874061", |
|
96 category: CATEGORY_WEBDEV, |
|
97 severity: SEVERITY_LOG, |
|
98 }, |
|
99 ]; |
|
100 |
|
101 // Make sure messages are displayed in the web console as they happen, even |
|
102 // if this is a private tab. |
|
103 waitForMessages({ |
|
104 webconsole: hud, |
|
105 messages: expectedMessages, |
|
106 }).then(testCachedMessages); |
|
107 } |
|
108 |
|
109 function testCachedMessages() |
|
110 { |
|
111 info("testCachedMessages()"); |
|
112 closeConsole(privateTab, () => { |
|
113 info("web console closed"); |
|
114 openConsole(privateTab, consoleReopened); |
|
115 }); |
|
116 } |
|
117 |
|
118 function consoleReopened(aHud) |
|
119 { |
|
120 hud = aHud; |
|
121 ok(hud, "web console reopened"); |
|
122 |
|
123 // Make sure that cached messages are displayed in the web console, even |
|
124 // if this is a private tab. |
|
125 waitForMessages({ |
|
126 webconsole: hud, |
|
127 messages: expectedMessages, |
|
128 }).then(testBrowserConsole); |
|
129 } |
|
130 |
|
131 function testBrowserConsole() |
|
132 { |
|
133 info("testBrowserConsole()"); |
|
134 closeConsole(privateTab, () => { |
|
135 info("web console closed"); |
|
136 privateWindow.HUDService.toggleBrowserConsole().then(onBrowserConsoleOpen); |
|
137 }); |
|
138 } |
|
139 |
|
140 // Make sure that the cached messages from private tabs are not displayed in |
|
141 // the browser console. |
|
142 function checkNoPrivateMessages() |
|
143 { |
|
144 let text = hud.outputNode.textContent; |
|
145 is(text.indexOf("fooBazBaz"), -1, "no exception displayed"); |
|
146 is(text.indexOf("bug 874061"), -1, "no console message displayed"); |
|
147 } |
|
148 |
|
149 function onBrowserConsoleOpen(aHud) |
|
150 { |
|
151 hud = aHud; |
|
152 ok(hud, "browser console opened"); |
|
153 |
|
154 checkNoPrivateMessages(); |
|
155 addMessages(); |
|
156 expectedMessages.push(nonPrivateMessage); |
|
157 |
|
158 // Make sure that live messages are displayed in the browser console, even |
|
159 // from private tabs. |
|
160 waitForMessages({ |
|
161 webconsole: hud, |
|
162 messages: expectedMessages, |
|
163 }).then(testPrivateWindowClose); |
|
164 } |
|
165 |
|
166 function testPrivateWindowClose() |
|
167 { |
|
168 info("close the private window and check if the private messages are removed"); |
|
169 hud.jsterm.once("private-messages-cleared", () => { |
|
170 isnot(hud.outputNode.textContent.indexOf("bug874061-not-private"), -1, |
|
171 "non-private messages are still shown after private window closed"); |
|
172 checkNoPrivateMessages(); |
|
173 |
|
174 info("close the browser console"); |
|
175 privateWindow.HUDService.toggleBrowserConsole().then(() => { |
|
176 info("reopen the browser console"); |
|
177 executeSoon(() => |
|
178 HUDService.toggleBrowserConsole().then(onBrowserConsoleReopen)); |
|
179 }); |
|
180 }); |
|
181 privateWindow.BrowserTryToCloseWindow(); |
|
182 } |
|
183 |
|
184 function onBrowserConsoleReopen(aHud) |
|
185 { |
|
186 hud = aHud; |
|
187 ok(hud, "browser console reopened"); |
|
188 |
|
189 // Make sure that the non-private message is still shown after reopen. |
|
190 waitForMessages({ |
|
191 webconsole: hud, |
|
192 messages: [nonPrivateMessage], |
|
193 }).then(() => { |
|
194 // Make sure that no private message is displayed after closing the private |
|
195 // window and reopening the Browser Console. |
|
196 checkNoPrivateMessages(); |
|
197 executeSoon(finishTest); |
|
198 }); |
|
199 } |
|
200 } |