summaryrefslogtreecommitdiff
path: root/browser/devtools/debugger/test/browser_dbg_bug727429_watch-expressions-02.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/devtools/debugger/test/browser_dbg_bug727429_watch-expressions-02.js')
-rw-r--r--browser/devtools/debugger/test/browser_dbg_bug727429_watch-expressions-02.js394
1 files changed, 394 insertions, 0 deletions
diff --git a/browser/devtools/debugger/test/browser_dbg_bug727429_watch-expressions-02.js b/browser/devtools/debugger/test/browser_dbg_bug727429_watch-expressions-02.js
new file mode 100644
index 000000000..df24c4d91
--- /dev/null
+++ b/browser/devtools/debugger/test/browser_dbg_bug727429_watch-expressions-02.js
@@ -0,0 +1,394 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * Bug 727429: test the debugger watch expressions.
+ */
+
+const TAB_URL = EXAMPLE_URL + "browser_dbg_watch-expressions.html";
+
+let gPane = null;
+let gTab = null;
+let gDebuggee = null;
+let gDebugger = null;
+let gWatch = null;
+let gVars = null;
+
+function test()
+{
+ debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) {
+ gTab = aTab;
+ gDebuggee = aDebuggee;
+ gPane = aPane;
+ gDebugger = gPane.panelWin;
+ gWatch = gDebugger.DebuggerView.WatchExpressions;
+ gVars = gDebugger.DebuggerView.Variables;
+
+ gDebugger.DebuggerView.toggleInstrumentsPane({ visible: true, animated: false });
+ addExpressions();
+ performTest();
+ });
+
+ function addExpressions()
+ {
+ gWatch.addExpression("'a'");
+ gWatch.addExpression("\"a\"");
+ gWatch.addExpression("'a\"\"'");
+ gWatch.addExpression("\"a''\"");
+ gWatch.addExpression("?");
+ gWatch.addExpression("a");
+ gWatch.addExpression("this");
+ gWatch.addExpression("this.canada");
+ gWatch.addExpression("[1, 2, 3]");
+ gWatch.addExpression("x = [1, 2, 3]");
+ gWatch.addExpression("y = [1, 2, 3]; y.test = 4");
+ gWatch.addExpression("z = [1, 2, 3]; z.test = 4; z");
+ gWatch.addExpression("t = [1, 2, 3]; t.test = 4; !t");
+ gWatch.addExpression("arguments[0]");
+ gWatch.addExpression("encodeURI(\"\\\")");
+ gWatch.addExpression("decodeURI(\"\\\")");
+ gWatch.addExpression("decodeURIComponent(\"%\")");
+ gWatch.addExpression("//");
+ gWatch.addExpression("// 42");
+ gWatch.addExpression("{}.foo");
+ gWatch.addExpression("{}.foo()");
+ gWatch.addExpression("({}).foo()");
+ gWatch.addExpression("new Array(-1)");
+ gWatch.addExpression("4.2.toExponential(-4.2)");
+ gWatch.addExpression("throw new Error(\"bazinga\")");
+ gWatch.addExpression("({ get error() { throw new Error(\"bazinga\") } }).error");
+ gWatch.addExpression("throw { get name() { throw \"bazinga\" } }");
+ }
+
+ function performTest()
+ {
+ is(gWatch.widget._parent.querySelectorAll(".dbg-expression[hidden=true]").length, 0,
+ "There should be 0 hidden nodes in the watch expressions container");
+ is(gWatch.widget._parent.querySelectorAll(".dbg-expression:not([hidden=true])").length, 27,
+ "There should be 27 visible nodes in the watch expressions container");
+
+ test1(function() {
+ test2(function() {
+ test3(function() {
+ test4(function() {
+ test5(function() {
+ test6(function() {
+ test7(function() {
+ test8(function() {
+ test9(function() {
+ finishTest();
+ });
+ });
+ });
+ });
+ });
+ });
+ });
+ });
+ });
+ }
+
+ function finishTest()
+ {
+ is(gWatch.widget._parent.querySelectorAll(".dbg-expression[hidden=true]").length, 0,
+ "There should be 0 hidden nodes in the watch expressions container");
+ is(gWatch.widget._parent.querySelectorAll(".dbg-expression:not([hidden=true])").length, 27,
+ "There should be 27 visible nodes in the watch expressions container");
+
+ closeDebuggerAndFinish();
+ }
+
+ function test1(callback) {
+ waitForWatchExpressions(function() {
+ info("Performing test1");
+ checkWatchExpressions("ReferenceError: a is not defined",
+ { type: "object", class: "Object" },
+ { type: "object", class: "String" },
+ { type: "undefined" },
+ 26);
+ callback();
+ });
+ executeSoon(function() {
+ gDebuggee.test(); // ermahgerd!!
+ });
+ }
+
+ function test2(callback) {
+ waitForWatchExpressions(function() {
+ info("Performing test2");
+ checkWatchExpressions({ type: "undefined" },
+ { type: "object", class: "Window" },
+ { type: "undefined" },
+ "sensational",
+ 26);
+ callback();
+ });
+ EventUtils.sendMouseEvent({ type: "mousedown" },
+ gDebugger.document.getElementById("resume"),
+ gDebugger);
+ }
+
+ function test3(callback) {
+ waitForWatchExpressions(function() {
+ info("Performing test3");
+ checkWatchExpressions({ type: "object", class: "Object" },
+ { type: "object", class: "Window" },
+ { type: "undefined" },
+ "sensational",
+ 26);
+ callback();
+ });
+ EventUtils.sendMouseEvent({ type: "mousedown" },
+ gDebugger.document.getElementById("resume"),
+ gDebugger);
+ }
+
+ function test4(callback) {
+ waitForWatchExpressions(function() {
+ info("Performing test4");
+ checkWatchExpressions(5,
+ { type: "object", class: "Window" },
+ { type: "undefined" },
+ "sensational",
+ 27);
+ callback();
+ });
+ executeSoon(function() {
+ gWatch.addExpression("a = 5");
+ EventUtils.sendKey("RETURN", gDebugger);
+ });
+ }
+
+ function test5(callback) {
+ waitForWatchExpressions(function() {
+ info("Performing test5");
+ checkWatchExpressions(5,
+ { type: "object", class: "Window" },
+ { type: "undefined" },
+ "sensational",
+ 27);
+ callback();
+ });
+ executeSoon(function() {
+ gWatch.addExpression("encodeURI(\"\\\")");
+ EventUtils.sendKey("RETURN", gDebugger);
+ });
+ }
+
+ function test6(callback) {
+ waitForWatchExpressions(function() {
+ info("Performing test6");
+ checkWatchExpressions(5,
+ { type: "object", class: "Window" },
+ { type: "undefined" },
+ "sensational",
+ 27);
+ callback();
+ })
+ executeSoon(function() {
+ gWatch.addExpression("decodeURI(\"\\\")");
+ EventUtils.sendKey("RETURN", gDebugger);
+ });
+ }
+
+ function test7(callback) {
+ waitForWatchExpressions(function() {
+ info("Performing test7");
+ checkWatchExpressions(5,
+ { type: "object", class: "Window" },
+ { type: "undefined" },
+ "sensational",
+ 27);
+ callback();
+ });
+ executeSoon(function() {
+ gWatch.addExpression("?");
+ EventUtils.sendKey("RETURN", gDebugger);
+ });
+ }
+
+ function test8(callback) {
+ waitForWatchExpressions(function() {
+ info("Performing test8");
+ checkWatchExpressions(5,
+ { type: "object", class: "Window" },
+ { type: "undefined" },
+ "sensational",
+ 27);
+ callback();
+ });
+ executeSoon(function() {
+ gWatch.addExpression("a");
+ EventUtils.sendKey("RETURN", gDebugger);
+ });
+ }
+
+ function test9(callback) {
+ waitForAfterFramesCleared(function() {
+ info("Performing test9");
+ callback();
+ });
+ EventUtils.sendMouseEvent({ type: "mousedown" },
+ gDebugger.document.getElementById("resume"),
+ gDebugger);
+ }
+
+ function waitForAfterFramesCleared(callback) {
+ gDebugger.addEventListener("Debugger:AfterFramesCleared", function onClear() {
+ gDebugger.removeEventListener("Debugger:AfterFramesCleared", onClear, false);
+ executeSoon(callback);
+ }, false);
+ }
+
+ function waitForWatchExpressions(callback) {
+ gDebugger.addEventListener("Debugger:FetchedWatchExpressions", function onFetch() {
+ gDebugger.removeEventListener("Debugger:FetchedWatchExpressions", onFetch, false);
+ executeSoon(callback);
+ }, false);
+ }
+
+ function checkWatchExpressions(expected_a,
+ expected_this,
+ expected_prop,
+ expected_arguments,
+ total)
+ {
+ is(gWatch.widget._parent.querySelectorAll(".dbg-expression[hidden=true]").length, total,
+ "There should be " + total + " hidden nodes in the watch expressions container");
+ is(gWatch.widget._parent.querySelectorAll(".dbg-expression:not([hidden=true])").length, 0,
+ "There should be 0 visible nodes in the watch expressions container");
+
+ let label = gDebugger.L10N.getStr("watchExpressionsScopeLabel");
+ let scope = gVars._currHierarchy.get(label);
+
+ ok(scope, "There should be a wach expressions scope in the variables view");
+ is(scope._store.size, total, "There should be " + total + " evaluations availalble");
+
+ let w1 = scope.get("'a'");
+ let w2 = scope.get("\"a\"");
+ let w3 = scope.get("'a\"\"'");
+ let w4 = scope.get("\"a''\"");
+ let w5 = scope.get("?");
+ let w6 = scope.get("a");
+ let w7 = scope.get("this");
+ let w8 = scope.get("this.canada");
+ let w9 = scope.get("[1, 2, 3]");
+ let w10 = scope.get("x = [1, 2, 3]");
+ let w11 = scope.get("y = [1, 2, 3]; y.test = 4");
+ let w12 = scope.get("z = [1, 2, 3]; z.test = 4; z");
+ let w13 = scope.get("t = [1, 2, 3]; t.test = 4; !t");
+ let w14 = scope.get("arguments[0]");
+ let w15 = scope.get("encodeURI(\"\\\")");
+ let w16 = scope.get("decodeURI(\"\\\")");
+ let w17 = scope.get("decodeURIComponent(\"%\")");
+ let w18 = scope.get("//");
+ let w19 = scope.get("// 42");
+ let w20 = scope.get("{}.foo");
+ let w21 = scope.get("{}.foo()");
+ let w22 = scope.get("({}).foo()");
+ let w23 = scope.get("new Array(-1)");
+ let w24 = scope.get("4.2.toExponential(-4.2)");
+ let w25 = scope.get("throw new Error(\"bazinga\")");
+ let w26 = scope.get("({ get error() { throw new Error(\"bazinga\") } }).error");
+ let w27 = scope.get("throw { get name() { throw \"bazinga\" } }");
+
+ ok(w1, "The first watch expression should be present in the scope");
+ ok(w2, "The second watch expression should be present in the scope");
+ ok(w3, "The third watch expression should be present in the scope");
+ ok(w4, "The fourth watch expression should be present in the scope");
+ ok(w5, "The fifth watch expression should be present in the scope");
+ ok(w6, "The sixth watch expression should be present in the scope");
+ ok(w7, "The seventh watch expression should be present in the scope");
+ ok(w8, "The eight watch expression should be present in the scope");
+ ok(w9, "The ninth watch expression should be present in the scope");
+ ok(w10, "The tenth watch expression should be present in the scope");
+ ok(w11, "The eleventh watch expression should be present in the scope");
+ ok(w12, "The twelfth watch expression should be present in the scope");
+ ok(w13, "The 13th watch expression should be present in the scope");
+ ok(w14, "The 14th watch expression should be present in the scope");
+ ok(w15, "The 15th watch expression should be present in the scope");
+ ok(w16, "The 16th watch expression should be present in the scope");
+ ok(w17, "The 17th watch expression should be present in the scope");
+ ok(w18, "The 18th watch expression should be present in the scope");
+ ok(w19, "The 19th watch expression should be present in the scope");
+ ok(w20, "The 20th watch expression should be present in the scope");
+ ok(w21, "The 21st watch expression should be present in the scope");
+ ok(w22, "The 22nd watch expression should be present in the scope");
+ ok(w23, "The 23nd watch expression should be present in the scope");
+ ok(w24, "The 24th watch expression should be present in the scope");
+ ok(w25, "The 25th watch expression should be present in the scope");
+ ok(w26, "The 26th watch expression should be present in the scope");
+ ok(!w27, "The 27th watch expression should not be present in the scope");
+
+ is(w1.value, "a", "The first value is correct");
+ is(w2.value, "a", "The second value is correct");
+ is(w3.value, "a\"\"", "The third value is correct");
+ is(w4.value, "a''", "The fourth value is correct");
+ is(w5.value, "SyntaxError: syntax error", "The fifth value is correct");
+
+ if (typeof expected_a == "object") {
+ is(w6.value.type, expected_a.type, "The sixth value type is correct");
+ is(w6.value.class, expected_a.class, "The sixth value class is correct");
+ } else {
+ is(w6.value, expected_a, "The sixth value is correct");
+ }
+
+ if (typeof expected_this == "object") {
+ is(w7.value.type, expected_this.type, "The seventh value type is correct");
+ is(w7.value.class, expected_this.class, "The seventh value class is correct");
+ } else {
+ is(w7.value, expected_this, "The seventh value is correct");
+ }
+
+ if (typeof expected_prop == "object") {
+ is(w8.value.type, expected_prop.type, "The eighth value type is correct");
+ is(w8.value.class, expected_prop.class, "The eighth value class is correct");
+ } else {
+ is(w8.value, expected_prop, "The eighth value is correct");
+ }
+
+ is(w9.value.type, "object", "The ninth value type is correct");
+ is(w9.value.class, "Array", "The ninth value class is correct");
+ is(w10.value.type, "object", "The tenth value type is correct");
+ is(w10.value.class, "Array", "The tenth value class is correct");
+ is(w11.value, "4", "The eleventh value is correct");
+ is(w12.value.type, "object", "The eleventh value type is correct");
+ is(w12.value.class, "Array", "The twelfth value class is correct");
+ is(w13.value, false, "The 13th value is correct");
+
+ if (typeof expected_arguments == "object") {
+ is(w14.value.type, expected_arguments.type, "The 14th value type is correct");
+ is(w14.value.class, expected_arguments.class, "The 14th value class is correct");
+ } else {
+ is(w14.value, expected_arguments, "The 14th value is correct");
+ }
+
+ is(w15.value, "SyntaxError: unterminated string literal", "The 15th value is correct");
+ is(w16.value, "SyntaxError: unterminated string literal", "The 16th value is correct");
+ is(w17.value, "URIError: malformed URI sequence", "The 17th value is correct");
+
+ is(w18.value.type, "undefined", "The 18th value type is correct");
+ is(w18.value.class, undefined, "The 18th value class is correct");
+
+ is(w19.value.type, "undefined", "The 19th value type is correct");
+ is(w19.value.class, undefined, "The 19th value class is correct");
+
+ is(w20.value, "SyntaxError: syntax error", "The 20th value is correct");
+ is(w21.value, "SyntaxError: syntax error", "The 21th value is correct");
+ is(w22.value, "TypeError: (intermediate value).foo is not a function", "The 22th value is correct");
+ is(w23.value, "RangeError: invalid array length", "The 23th value is correct");
+ is(w24.value, "RangeError: precision -4 out of range", "The 24st value is correct");
+ is(w25.value, "Error: bazinga", "The 25nd value is correct");
+ is(w26.value, "Error: bazinga", "The 26rd value is correct");
+ }
+
+ registerCleanupFunction(function() {
+ removeTab(gTab);
+ gPane = null;
+ gTab = null;
+ gDebuggee = null;
+ gDebugger = null;
+ gWatch = null;
+ gVars = null;
+ });
+}