michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ michael@0: */ michael@0: michael@0: // This verifies that plugins exist and can be enabled and disabled. michael@0: var gID = null; michael@0: michael@0: function setTestPluginState(state) { michael@0: let tags = AM_Cc["@mozilla.org/plugin/host;1"].getService(AM_Ci.nsIPluginHost) michael@0: .getPluginTags(); michael@0: for (let tag of tags) { michael@0: if (tag.name == "Test Plug-in") { michael@0: tag.enabledState = state; michael@0: return; michael@0: } michael@0: } michael@0: throw Error("No plugin tag found for the test plugin"); michael@0: } michael@0: michael@0: function run_test() { michael@0: do_test_pending(); michael@0: createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); michael@0: Services.prefs.setBoolPref("plugins.click_to_play", true); michael@0: michael@0: setTestPluginState(AM_Ci.nsIPluginTag.STATE_CLICKTOPLAY); michael@0: michael@0: startupManager(); michael@0: AddonManager.addAddonListener(AddonListener); michael@0: AddonManager.addInstallListener(InstallListener); michael@0: michael@0: run_test_1(); michael@0: } michael@0: michael@0: // Finds the test plugin library michael@0: function get_test_plugin() { michael@0: var pluginEnum = Services.dirsvc.get("APluginsDL", AM_Ci.nsISimpleEnumerator); michael@0: while (pluginEnum.hasMoreElements()) { michael@0: let dir = pluginEnum.getNext().QueryInterface(AM_Ci.nsILocalFile); michael@0: let plugin = dir.clone(); michael@0: // OSX plugin michael@0: plugin.append("Test.plugin"); michael@0: if (plugin.exists()) { michael@0: plugin.normalize(); michael@0: return plugin; michael@0: } michael@0: plugin = dir.clone(); michael@0: // *nix plugin michael@0: plugin.append("libnptest.so"); michael@0: if (plugin.exists()) { michael@0: plugin.normalize(); michael@0: return plugin; michael@0: } michael@0: // Windows plugin michael@0: plugin = dir.clone(); michael@0: plugin.append("nptest.dll"); michael@0: if (plugin.exists()) { michael@0: plugin.normalize(); michael@0: return plugin; michael@0: } michael@0: } michael@0: return null; michael@0: } michael@0: michael@0: function getFileSize(aFile) { michael@0: if (!aFile.isDirectory()) michael@0: return aFile.fileSize; michael@0: michael@0: let size = 0; michael@0: let entries = aFile.directoryEntries.QueryInterface(AM_Ci.nsIDirectoryEnumerator); michael@0: let entry; michael@0: while (entry = entries.nextFile) michael@0: size += getFileSize(entry); michael@0: entries.close(); michael@0: return size; michael@0: } michael@0: michael@0: function getPluginLastModifiedTime(aPluginFile) { michael@0: // On OS X we use the bundle contents last modified time as using michael@0: // the package directories modified date may be outdated. michael@0: // See bug 313700. michael@0: try { michael@0: let localFileMac = aPluginFile.QueryInterface(AM_Ci.nsILocalFileMac); michael@0: if (localFileMac) { michael@0: return localFileMac.bundleContentsLastModifiedTime; michael@0: } michael@0: } catch (e) { michael@0: } michael@0: michael@0: return aPluginFile.lastModifiedTime; michael@0: } michael@0: michael@0: // Tests that the test plugin exists michael@0: function run_test_1() { michael@0: var testPlugin = get_test_plugin(); michael@0: do_check_neq(testPlugin, null); michael@0: michael@0: AddonManager.getAddonsByTypes(["plugin"], function(addons) { michael@0: do_check_true(addons.length > 0); michael@0: michael@0: addons.forEach(function(p) { michael@0: if (p.name == "Test Plug-in") michael@0: gID = p.id; michael@0: }); michael@0: michael@0: do_check_neq(gID, null); michael@0: michael@0: AddonManager.getAddonByID(gID, function(p) { michael@0: do_check_neq(p, null); michael@0: do_check_eq(p.name, "Test Plug-in"); michael@0: do_check_eq(p.description, michael@0: "Plug-in for testing purposes.\u2122 " + michael@0: "(\u0939\u093f\u0928\u094d\u0926\u0940 " + michael@0: "\u4e2d\u6587 " + michael@0: "\u0627\u0644\u0639\u0631\u0628\u064a\u0629)"); michael@0: do_check_eq(p.creator, null); michael@0: do_check_eq(p.version, "1.0.0.0"); michael@0: do_check_eq(p.type, "plugin"); michael@0: do_check_eq(p.userDisabled, "askToActivate"); michael@0: do_check_false(p.appDisabled); michael@0: do_check_true(p.isActive); michael@0: do_check_true(p.isCompatible); michael@0: do_check_true(p.providesUpdatesSecurely); michael@0: do_check_eq(p.blocklistState, 0); michael@0: do_check_eq(p.permissions, AddonManager.PERM_CAN_DISABLE | AddonManager.PERM_CAN_ENABLE); michael@0: do_check_eq(p.pendingOperations, 0); michael@0: do_check_true(p.size > 0); michael@0: do_check_eq(p.size, getFileSize(testPlugin)); michael@0: do_check_true(p.updateDate > 0); michael@0: do_check_true("isCompatibleWith" in p); michael@0: do_check_true("findUpdates" in p); michael@0: michael@0: let lastModifiedTime = getPluginLastModifiedTime(testPlugin); michael@0: do_check_eq(p.updateDate.getTime(), lastModifiedTime); michael@0: do_check_eq(p.installDate.getTime(), lastModifiedTime); michael@0: michael@0: run_test_2(p); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: // Tests that disabling a plugin works michael@0: function run_test_2(p) { michael@0: let test = {}; michael@0: test[gID] = [ michael@0: ["onDisabling", false], michael@0: "onDisabled", michael@0: ["onPropertyChanged", ["userDisabled"]] michael@0: ]; michael@0: prepare_test(test); michael@0: michael@0: p.userDisabled = true; michael@0: michael@0: ensure_test_completed(); michael@0: michael@0: do_check_true(p.userDisabled); michael@0: do_check_false(p.appDisabled); michael@0: do_check_false(p.isActive); michael@0: michael@0: AddonManager.getAddonByID(gID, function(p) { michael@0: do_check_neq(p, null); michael@0: do_check_true(p.userDisabled); michael@0: do_check_false(p.appDisabled); michael@0: do_check_false(p.isActive); michael@0: do_check_eq(p.name, "Test Plug-in"); michael@0: michael@0: run_test_3(p); michael@0: }); michael@0: } michael@0: michael@0: // Tests that enabling a plugin works michael@0: function run_test_3(p) { michael@0: let test = {}; michael@0: test[gID] = [ michael@0: ["onEnabling", false], michael@0: "onEnabled" michael@0: ]; michael@0: prepare_test(test); michael@0: michael@0: p.userDisabled = false; michael@0: michael@0: ensure_test_completed(); michael@0: michael@0: do_check_false(p.userDisabled); michael@0: do_check_false(p.appDisabled); michael@0: do_check_true(p.isActive); michael@0: michael@0: AddonManager.getAddonByID(gID, function(p) { michael@0: do_check_neq(p, null); michael@0: do_check_false(p.userDisabled); michael@0: do_check_false(p.appDisabled); michael@0: do_check_true(p.isActive); michael@0: do_check_eq(p.name, "Test Plug-in"); michael@0: michael@0: do_execute_soon(run_test_4); michael@0: }); michael@0: } michael@0: michael@0: // Verify that after a restart the test plugin has the same ID michael@0: function run_test_4() { michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID(gID, function(p) { michael@0: do_check_neq(p, null); michael@0: do_check_eq(p.name, "Test Plug-in"); michael@0: michael@0: Services.prefs.clearUserPref("plugins.click_to_play"); michael@0: michael@0: do_execute_soon(do_test_finished); michael@0: }); michael@0: }