diff options
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_duplicateplugins.js')
-rw-r--r-- | toolkit/mozapps/extensions/test/xpcshell/test_duplicateplugins.js | 160 |
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); +} |