summaryrefslogtreecommitdiffstats
path: root/devtools/platform/tests/xpcshell
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/platform/tests/xpcshell')
-rw-r--r--devtools/platform/tests/xpcshell/.eslintrc.js19
-rw-r--r--devtools/platform/tests/xpcshell/head_dbg.js14
-rw-r--r--devtools/platform/tests/xpcshell/test_nativewrappers.js45
-rw-r--r--devtools/platform/tests/xpcshell/test_nsjsinspector.js65
-rw-r--r--devtools/platform/tests/xpcshell/xpcshell.toml7
5 files changed, 150 insertions, 0 deletions
diff --git a/devtools/platform/tests/xpcshell/.eslintrc.js b/devtools/platform/tests/xpcshell/.eslintrc.js
new file mode 100644
index 0000000000..dc7f2c85c4
--- /dev/null
+++ b/devtools/platform/tests/xpcshell/.eslintrc.js
@@ -0,0 +1,19 @@
+"use strict";
+
+// Parent config file for all devtools xpcshell files.
+module.exports = {
+ extends: ["plugin:mozilla/xpcshell-test"],
+ rules: {
+ // Allow non-camelcase so that run_test doesn't produce a warning.
+ camelcase: "off",
+ // Allow using undefined variables so that tests can refer to functions
+ // and variables defined in head.js files, without having to maintain a
+ // list of globals in each .eslintrc file.
+ // Note that bug 1168340 will eventually help auto-registering globals
+ // from head.js files.
+ "no-undef": "off",
+ "block-scoped-var": "off",
+ // Tests can always import anything.
+ "mozilla/reject-some-requires": "off",
+ },
+};
diff --git a/devtools/platform/tests/xpcshell/head_dbg.js b/devtools/platform/tests/xpcshell/head_dbg.js
new file mode 100644
index 0000000000..48942bdb7a
--- /dev/null
+++ b/devtools/platform/tests/xpcshell/head_dbg.js
@@ -0,0 +1,14 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+function testGlobal(name) {
+ const systemPrincipal = Cc["@mozilla.org/systemprincipal;1"].createInstance(
+ Ci.nsIPrincipal
+ );
+
+ const sandbox = Cu.Sandbox(systemPrincipal);
+ Cu.evalInSandbox("this.__name = '" + name + "'", sandbox);
+ return sandbox;
+}
diff --git a/devtools/platform/tests/xpcshell/test_nativewrappers.js b/devtools/platform/tests/xpcshell/test_nativewrappers.js
new file mode 100644
index 0000000000..a7ea81adaf
--- /dev/null
+++ b/devtools/platform/tests/xpcshell/test_nativewrappers.js
@@ -0,0 +1,45 @@
+"use strict";
+
+function run_test() {
+ const { addDebuggerToGlobal } = ChromeUtils.importESModule(
+ "resource://gre/modules/jsdebugger.sys.mjs"
+ );
+
+ Services.prefs.setBoolPref("security.allow_eval_with_system_principal", true);
+ registerCleanupFunction(() => {
+ Services.prefs.clearUserPref("security.allow_eval_with_system_principal");
+ });
+
+ addDebuggerToGlobal(globalThis);
+ const g = testGlobal("test1");
+
+ const dbg = new Debugger();
+ dbg.addDebuggee(g);
+ dbg.onDebuggerStatement = function (frame) {
+ const args = frame.arguments;
+ try {
+ args[0];
+ Assert.ok(true);
+ } catch (ex) {
+ Assert.ok(false);
+ }
+ };
+
+ g.eval("function stopMe(arg) {debugger;}");
+
+ const g2 = testGlobal("test2");
+ g2.g = g;
+ g2.eval(
+ "(" +
+ function createBadEvent() {
+ // eslint-disable-next-line mozilla/reject-importGlobalProperties
+ Cu.importGlobalProperties(["DOMParser"]);
+ const parser = new DOMParser();
+ const doc = parser.parseFromString("<foo></foo>", "text/xml");
+ g.stopMe(doc.createEvent("MouseEvent"));
+ } +
+ ")()"
+ );
+
+ dbg.removeAllDebuggees();
+}
diff --git a/devtools/platform/tests/xpcshell/test_nsjsinspector.js b/devtools/platform/tests/xpcshell/test_nsjsinspector.js
new file mode 100644
index 0000000000..74d18b7689
--- /dev/null
+++ b/devtools/platform/tests/xpcshell/test_nsjsinspector.js
@@ -0,0 +1,65 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// Test the basic functionality of the nsIJSInspector component.
+var gCount = 0;
+const MAX = 10;
+
+var inspector = Cc["@mozilla.org/jsinspector;1"].getService(Ci.nsIJSInspector);
+
+// Emulate 10 simultaneously-debugged windows from 3 separate client connections.
+var requestor = count => ({
+ url: "http://foo/bar/" + count,
+ connection: "conn" + (count % 3),
+});
+
+function run_test() {
+ test_nesting();
+}
+
+function test_nesting() {
+ Assert.equal(inspector.eventLoopNestLevel, 0);
+
+ Services.tm.dispatchToMainThread({ run: enterEventLoop });
+
+ Assert.equal(inspector.enterNestedEventLoop(requestor(gCount)), 0);
+ Assert.equal(inspector.eventLoopNestLevel, 0);
+ Assert.equal(inspector.lastNestRequestor, null);
+}
+
+function enterEventLoop() {
+ if (gCount++ < MAX) {
+ Services.tm.dispatchToMainThread({ run: enterEventLoop });
+
+ Object.create(requestor(gCount));
+
+ Assert.equal(inspector.eventLoopNestLevel, gCount);
+ Assert.equal(inspector.lastNestRequestor.url, requestor(gCount - 1).url);
+ Assert.equal(
+ inspector.lastNestRequestor.connection,
+ requestor(gCount - 1).connection
+ );
+ Assert.equal(inspector.enterNestedEventLoop(requestor(gCount)), gCount);
+ } else {
+ Assert.equal(gCount, MAX + 1);
+ Services.tm.dispatchToMainThread({ run: exitEventLoop });
+ }
+}
+
+function exitEventLoop() {
+ if (inspector.lastNestRequestor != null) {
+ Assert.equal(inspector.lastNestRequestor.url, requestor(gCount - 1).url);
+ Assert.equal(
+ inspector.lastNestRequestor.connection,
+ requestor(gCount - 1).connection
+ );
+ if (gCount-- > 1) {
+ Services.tm.dispatchToMainThread({ run: exitEventLoop });
+ }
+
+ Assert.equal(inspector.exitNestedEventLoop(), gCount);
+ Assert.equal(inspector.eventLoopNestLevel, gCount);
+ }
+}
diff --git a/devtools/platform/tests/xpcshell/xpcshell.toml b/devtools/platform/tests/xpcshell/xpcshell.toml
new file mode 100644
index 0000000000..ede5c03e2b
--- /dev/null
+++ b/devtools/platform/tests/xpcshell/xpcshell.toml
@@ -0,0 +1,7 @@
+[DEFAULT]
+tags = "devtools"
+head = "head_dbg.js"
+
+["test_nativewrappers.js"]
+
+["test_nsjsinspector.js"]