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
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
"use strict";
// Ignore strange errors when shutting down.
PromiseTestUtils.allowMatchingRejectionsGlobally(/No such actor/);
add_task(async function () {
const dbg = await initDebugger("doc-script-switching.html");
const found = findElement(dbg, "callStackBody");
is(found, null, "Call stack is hidden");
invokeInTab("firstCall");
await waitForPaused(dbg);
ok(isFrameSelected(dbg, 1, "secondCall"), "the first frame is selected");
const button = toggleButton(dbg);
ok(!button, "toggle button shouldn't be there");
});
add_task(async function () {
const dbg = await initDebugger("doc-frames.html");
invokeInTab("startRecursion");
await waitForPaused(dbg);
ok(isFrameSelected(dbg, 1, "recurseA"), "the first frame is selected");
// check to make sure that the toggle button isn't there
let button = toggleButton(dbg);
let frames = findAllElements(dbg, "frames");
is(button.innerText, "Expand rows", "toggle button should be 'expand'");
is(frames.length, 7, "There should be at most seven frames");
button.click();
button = toggleButton(dbg);
frames = findAllElements(dbg, "frames");
is(button.innerText, "Collapse rows", "toggle button should be collapsed");
is(frames.length, 22, "All of the frames should be shown");
await waitForSelectedSource(dbg, "frames.js");
});
add_task(async function () {
const url = createMockAngularPage();
const tab = await addTab(url);
info("Open debugger");
const toolbox = await openToolboxForTab(tab, "jsdebugger");
const dbg = createDebuggerContext(toolbox);
const found = findElement(dbg, "callStackBody");
is(found, null, "Call stack is hidden");
SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
content.document.querySelector("button.pause").click();
});
await waitForPaused(dbg);
const $group = findElementWithSelector(dbg, ".frames .frames-group");
is(
$group.querySelector(".badge").textContent,
"2",
"Group has expected badge"
);
is(
$group.querySelector(".group-description-name").textContent,
"Angular",
"Group has expected location"
);
});
function toggleButton(dbg) {
const callStackBody = findElement(dbg, "callStackBody");
return callStackBody.querySelector(".show-more");
}
// Create an HTTP server to simulate an angular app with anonymous functions
// and return the URL.
function createMockAngularPage() {
const httpServer = createTestHTTPServer();
httpServer.registerContentType("html", "text/html");
httpServer.registerContentType("js", "application/javascript");
const htmlFilename = "angular-mock.html";
httpServer.registerPathHandler(
`/${htmlFilename}`,
function (request, response) {
response.setStatusLine(request.httpVersion, 200, "OK");
response.write(`
<html>
<button class="pause">Click me</button>
<script type="text/javascript" src="angular.js"></script>
</html>`);
}
);
// Register an angular.js file in order to create a Group with anonymous functions in
// the callstack panel.
httpServer.registerPathHandler("/angular.js", function (request, response) {
response.setHeader("Content-Type", "application/javascript");
response.write(`
document.querySelector("button.pause").addEventListener("click", () => {
(function() {
debugger;
})();
})
`);
});
const port = httpServer.identity.primaryPort;
return `http://localhost:${port}/${htmlFilename}`;
}
|