--- a/toolkit/components/extensions/ExtensionTestCommon.jsm
+++ b/toolkit/components/extensions/ExtensionTestCommon.jsm
@@ -378,11 +378,14 @@ this.ExtensionTestCommon = class Extensi
if (!id) {
id = uuidGen.generateUUID().number;
}
return new Extension({
id,
resourceURI: jarURI,
cleanupFile: file,
+ signedState: data.isPrivileged ? AddonManager.SIGNEDSTATE_PRIVILEGED
+ : AddonManager.SIGNEDSTATE_SIGNED,
+ temporarilyInstalled: !!data.temporarilyInstalled,
});
}
};
--- a/toolkit/components/extensions/test/xpcshell/test_ext_experiments.js
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_experiments.js
@@ -182,8 +182,122 @@ add_task(async function test_experiments
boringAddon.userDisabled = true;
await new Promise(do_execute_soon);
equal(addon.appDisabled, true, "Add-on should be app-disabled after its dependency is removed.");
addon.uninstall();
boringAddon.uninstall();
});
+
+add_task(async function test_bundled_experiments() {
+ let extension = ExtensionTestUtils.loadExtension({
+ isPrivileged: true,
+
+ manifest: {
+ experiment_apis: {
+ foo: {
+ schema: "schema.json",
+ parent: {
+ scopes: ["addon_parent"],
+ script: "parent.js",
+ paths: [["experiments", "foo", "parent"]],
+ },
+ child: {
+ scopes: ["addon_child"],
+ script: "child.js",
+ paths: [["experiments", "foo", "child"]],
+ },
+ },
+ },
+ },
+
+ async background() {
+ browser.test.assertEq("object", typeof browser.experiments,
+ "typeof browser.experiments");
+
+ browser.test.assertEq("object", typeof browser.experiments.foo,
+ "typeof browser.experiments.foo");
+
+ browser.test.assertEq("function", typeof browser.experiments.foo.child,
+ "typeof browser.experiments.foo.child");
+
+ browser.test.assertEq("function", typeof browser.experiments.foo.parent,
+ "typeof browser.experiments.foo.parent");
+
+ browser.test.assertEq("child", browser.experiments.foo.child(),
+ "foo.child()");
+
+ browser.test.assertEq("parent", await browser.experiments.foo.parent(),
+ "await foo.parent()");
+
+ browser.test.notifyPass("background.experiments.foo");
+ },
+
+ files: {
+ "schema.json": JSON.stringify([
+ {
+ "namespace": "experiments.foo",
+ "types": [
+ {
+ "id": "Meh",
+ "type": "object",
+ "properties": {},
+ },
+ ],
+ "functions": [
+ {
+ "name": "parent",
+ "type": "function",
+ "async": true,
+ "parameters": [],
+ },
+ {
+ "name": "child",
+ "type": "function",
+ "parameters": [],
+ "returns": {"type": "string"},
+ },
+ ],
+ },
+ ]),
+
+ /* globals ExtensionAPI */
+ "parent.js": () => {
+ this.foo = class extends ExtensionAPI {
+ getAPI(context) {
+ return {
+ experiments: {
+ foo: {
+ parent() {
+ return Promise.resolve("parent");
+ },
+ },
+ },
+ };
+ }
+ };
+ },
+
+ "child.js": () => {
+ this.foo = class extends ExtensionAPI {
+ getAPI(context) {
+ return {
+ experiments: {
+ foo: {
+ child() {
+ return "child";
+ },
+ },
+ },
+ };
+ }
+ };
+ },
+ },
+ });
+
+ await extension.startup();
+
+ await extension.awaitFinish("background.experiments.foo");
+
+ await extension.unload();
+});