summaryrefslogtreecommitdiffstats
path: root/devtools/server/tests/xpcshell/test_watchpoint-05.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/server/tests/xpcshell/test_watchpoint-05.js')
-rw-r--r--devtools/server/tests/xpcshell/test_watchpoint-05.js113
1 files changed, 113 insertions, 0 deletions
diff --git a/devtools/server/tests/xpcshell/test_watchpoint-05.js b/devtools/server/tests/xpcshell/test_watchpoint-05.js
new file mode 100644
index 0000000000..4d25a59399
--- /dev/null
+++ b/devtools/server/tests/xpcshell/test_watchpoint-05.js
@@ -0,0 +1,113 @@
+/* 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({
+ commands,
+ threadFront,
+ debuggee,
+}) {
+ async function evaluateJS(input) {
+ const { result } = await commands.scriptCommand.execute(input, {
+ 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);
+}