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
|
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/* eslint-disable no-shadow */
"use strict";
/*
- Adds a 'get or set' watchpoint. Tests that the debugger will pause on both get and set.
*/
add_task(
threadFrontTest(async args => {
await testGetPauseWithGetOrSetWatchpoint(args);
await testSetPauseWithGetOrSetWatchpoint(args);
})
);
async function testGetPauseWithGetOrSetWatchpoint({ threadFront, debuggee }) {
function evaluateTestCode(debuggee) {
/* eslint-disable */
Cu.evalInSandbox(
` // 1
function stopMe(obj) { // 2
debugger; // 3
obj.a + 4; // 4
} //
stopMe({a: 1})`,
debuggee,
"1.8",
"test_watchpoint-05.js"
);
/* eslint-disable */
}
const packet = await executeOnNextTickAndWaitForPause(
() => evaluateTestCode(debuggee),
threadFront
);
info("Test that we paused on the debugger statement");
Assert.equal(packet.frame.where.line, 3);
info("Add get or set watchpoint.");
const args = packet.frame.arguments;
const obj = args[0];
const objClient = threadFront.pauseGrip(obj);
await objClient.addWatchpoint("a", "obj.a", "getorset");
info("Test that watchpoint triggers pause on get.");
const packet2 = await resumeAndWaitForPause(threadFront);
Assert.equal(packet2.frame.where.line, 4);
Assert.equal(packet2.why.type, "getWatchpoint");
Assert.equal(obj.preview.ownProperties.a.value, 1);
await resume(threadFront);
}
async function testSetPauseWithGetOrSetWatchpoint({ threadFront, debuggee, targetFront }) {
async function evaluateJS(input) {
const consoleFront = await targetFront.getFront("console");
const { result } = await consoleFront.evaluateJSAsync(input, {
thread: threadFront.actor,
frameActor: packet.frame.actorID,
});
return result;
}
function evaluateTestCode(debuggee) {
/* eslint-disable */
Cu.evalInSandbox(
` // 1
function stopMe(obj) { // 2
debugger; // 3
obj.a = 2; // 4
} //
stopMe({a: { b: 1 }})`,
debuggee,
"1.8",
"test_watchpoint-05.js"
);
/* eslint-disable */
}
const packet = await executeOnNextTickAndWaitForPause(
() => evaluateTestCode(debuggee),
threadFront
);
info("Test that we paused on the debugger statement");
Assert.equal(packet.frame.where.line, 3);
info("Add get or set watchpoint");
const args = packet.frame.arguments;
const obj = args[0];
const objClient = threadFront.pauseGrip(obj);
await objClient.addWatchpoint("a", "obj.a", "getorset");
let result = await evaluateJS("obj.a");
Assert.equal(result.getGrip().preview.ownProperties.b.value, 1);
result = await evaluateJS("obj.a.b");
Assert.equal(result, 1);
info("Test that watchpoint triggers pause on set");
const packet2 = await resumeAndWaitForPause(threadFront);
Assert.equal(packet2.frame.where.line, 4);
Assert.equal(packet2.why.type, "setWatchpoint");
Assert.equal(obj.preview.ownProperties.a.value.ownPropertyLength, 1);
await resume(threadFront);
}
|