/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ // Verify that API functions fail if the Add-ons Manager isn't initialised. const IGNORE = [ "getPreferredIconURL", "escapeAddonURI", "shouldAutoUpdate", "getStartupChanges", "addAddonListener", "removeAddonListener", "addInstallListener", "removeInstallListener", "addManagerListener", "removeManagerListener", "addExternalExtensionLoader", "beforeShutdown", "init", "stateToString", "errorToString", "getUpgradeListener", "addUpgradeListener", "removeUpgradeListener", "getInstallSourceFromHost", "stageLangpacksForAppUpdate", ]; const IGNORE_PRIVATE = [ "AddonAuthor", "AddonScreenshot", "startup", "shutdown", "addonIsActive", "registerProvider", "unregisterProvider", "addStartupChange", "removeStartupChange", "getNewSideloads", "finalShutdown", "recordTimestamp", "recordSimpleMeasure", "recordException", "getSimpleMeasures", "simpleTimer", "setTelemetryDetails", "getTelemetryDetails", "callNoUpdateListeners", "backgroundUpdateTimerHandler", "hasUpgradeListener", "getUpgradeListener", "isDBLoaded", "recordTiming", "BOOTSTRAP_REASONS", "notifyAddonChanged", "overrideAddonRepository", "overrideAsyncShutdown", ]; async function test_functions() { for (let prop in AddonManager) { if (IGNORE.includes(prop)) { continue; } if (typeof AddonManager[prop] != "function") { continue; } let args = []; // Getter functions need a callback and in some cases not having one will // throw before checking if the add-ons manager is initialized so pass in // an empty one. if (prop.startsWith("get")) { // For now all getter functions with more than one argument take the // callback in the second argument. if (AddonManager[prop].length > 1) { args.push(undefined, () => {}); } else { args.push(() => {}); } } // Clean this up in bug 1365720 if (prop == "getActiveAddons") { args = []; } try { info("AddonManager." + prop); await AddonManager[prop](...args); do_throw(prop + " did not throw an exception"); } catch (e) { if (e.result != Cr.NS_ERROR_NOT_INITIALIZED) { do_throw(prop + " threw an unexpected exception: " + e); } } } for (let prop in AddonManagerPrivate) { if (IGNORE_PRIVATE.includes(prop)) { continue; } if (typeof AddonManagerPrivate[prop] != "function") { continue; } try { info("AddonManagerPrivate." + prop); AddonManagerPrivate[prop](); do_throw(prop + " did not throw an exception"); } catch (e) { if (e.result != Cr.NS_ERROR_NOT_INITIALIZED) { do_throw(prop + " threw an unexpected exception: " + e); } } } } add_task(async function () { await test_functions(); await promiseStartupManager(); await promiseShutdownManager(); await test_functions(); }); function run_test() { createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); run_next_test(); }