summaryrefslogtreecommitdiffstats
path: root/toolkit/mozapps/extensions/test/xpcshell/test_duplicateplugins.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_duplicateplugins.js')
-rw-r--r--toolkit/mozapps/extensions/test/xpcshell/test_duplicateplugins.js160
1 files changed, 160 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_duplicateplugins.js b/toolkit/mozapps/extensions/test/xpcshell/test_duplicateplugins.js
new file mode 100644
index 0000000000..41f070e2d8
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_duplicateplugins.js
@@ -0,0 +1,160 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// This verifies that duplicate plugins are coalesced and maintain their ID
+// across restarts.
+
+class MockPlugin extends MockPluginTag {
+ constructor(opts) {
+ super(opts, opts.enabledState);
+ this.blocklisted = opts.blocklisted;
+ }
+}
+
+var PLUGINS = [
+ {
+ name: "Duplicate Plugin 1",
+ description: "A duplicate plugin",
+ version: "1",
+ blocklisted: false,
+ enabledState: Ci.nsIPluginTag.STATE_ENABLED,
+ filename: "/home/mozilla/.plugins/dupplugin1.so",
+ },
+ {
+ name: "Duplicate Plugin 1",
+ description: "A duplicate plugin",
+ version: "1",
+ blocklisted: false,
+ enabledState: Ci.nsIPluginTag.STATE_ENABLED,
+ filename: "/usr/lib/plugins/dupplugin1.so",
+ },
+ {
+ name: "Duplicate Plugin 2",
+ description: "Another duplicate plugin",
+ version: "1",
+ blocklisted: false,
+ enabledState: Ci.nsIPluginTag.STATE_ENABLED,
+ filename: "/home/mozilla/.plugins/dupplugin2.so",
+ },
+ {
+ name: "Duplicate Plugin 2",
+ description: "Another duplicate plugin",
+ version: "1",
+ blocklisted: false,
+ enabledState: Ci.nsIPluginTag.STATE_ENABLED,
+ filename: "/usr/lib/plugins/dupplugin2.so",
+ },
+ {
+ name: "Non-duplicate Plugin", // 3
+ description: "Not a duplicate plugin",
+ version: "1",
+ blocklisted: false,
+ enabledState: Ci.nsIPluginTag.STATE_ENABLED,
+ filename: "/home/mozilla/.plugins/dupplugin3.so",
+ },
+ {
+ name: "Non-duplicate Plugin", // 4
+ description: "Not a duplicate because the descriptions are different",
+ version: "1",
+ blocklisted: false,
+ enabledState: Ci.nsIPluginTag.STATE_ENABLED,
+ filename: "/usr/lib/plugins/dupplugin4.so",
+ },
+ {
+ name: "Another Non-duplicate Plugin", // 5
+ description: "Not a duplicate plugin",
+ version: "1",
+ blocklisted: false,
+ enabledState: Ci.nsIPluginTag.STATE_ENABLED,
+ filename: "/home/mozilla/.plugins/dupplugin5.so",
+ },
+].map(opts => new MockPlugin(opts));
+
+mockPluginHost(PLUGINS);
+
+var gPluginIDs = [null, null, null, null, null];
+
+async function run_test() {
+ do_test_pending();
+ createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
+ Services.prefs.setBoolPref("media.gmp-provider.enabled", false);
+
+ await promiseStartupManager();
+
+ run_test_1();
+}
+
+function found_plugin(aNum, aId) {
+ if (gPluginIDs[aNum]) {
+ do_throw("Found duplicate of plugin " + aNum);
+ }
+ gPluginIDs[aNum] = aId;
+}
+
+// Test that the plugins were coalesced and all appear in the returned list
+async function run_test_1() {
+ let aAddons = await AddonManager.getAddonsByTypes(["plugin"]);
+ Assert.equal(aAddons.length, 5);
+ aAddons.forEach(function(aAddon) {
+ if (aAddon.name == "Duplicate Plugin 1") {
+ found_plugin(0, aAddon.id);
+ Assert.equal(aAddon.description, "A duplicate plugin");
+ } else if (aAddon.name == "Duplicate Plugin 2") {
+ found_plugin(1, aAddon.id);
+ Assert.equal(aAddon.description, "Another duplicate plugin");
+ } else if (aAddon.name == "Another Non-duplicate Plugin") {
+ found_plugin(5, aAddon.id);
+ Assert.equal(aAddon.description, "Not a duplicate plugin");
+ } else if (aAddon.name == "Non-duplicate Plugin") {
+ if (aAddon.description == "Not a duplicate plugin") {
+ found_plugin(3, aAddon.id);
+ } else if (
+ aAddon.description ==
+ "Not a duplicate because the descriptions are different"
+ ) {
+ found_plugin(4, aAddon.id);
+ } else {
+ do_throw(
+ "Found unexpected plugin with description " + aAddon.description
+ );
+ }
+ } else {
+ do_throw("Found unexpected plugin " + aAddon.name);
+ }
+ });
+
+ run_test_2();
+}
+
+// Test that disabling a coalesced plugin disables all its tags
+async function run_test_2() {
+ let p = await AddonManager.getAddonByID(gPluginIDs[0]);
+ Assert.ok(!p.userDisabled);
+ await p.disable();
+ Assert.ok(PLUGINS[0].disabled);
+ Assert.ok(PLUGINS[1].disabled);
+
+ executeSoon(run_test_3);
+}
+
+// Test that IDs persist across restart
+async function run_test_3() {
+ await promiseRestartManager();
+
+ let p = await AddonManager.getAddonByID(gPluginIDs[0]);
+ Assert.notEqual(p, null);
+ Assert.equal(p.name, "Duplicate Plugin 1");
+ Assert.equal(p.description, "A duplicate plugin");
+
+ // Reorder the plugins and restart again
+ [PLUGINS[0], PLUGINS[1]] = [PLUGINS[1], PLUGINS[0]];
+ await promiseRestartManager();
+
+ let p_2 = await AddonManager.getAddonByID(gPluginIDs[0]);
+ Assert.notEqual(p_2, null);
+ Assert.equal(p_2.name, "Duplicate Plugin 1");
+ Assert.equal(p_2.description, "A duplicate plugin");
+
+ executeSoon(do_test_finished);
+}