diff options
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_webextension_icons.js')
-rw-r--r-- | toolkit/mozapps/extensions/test/xpcshell/test_webextension_icons.js | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_webextension_icons.js b/toolkit/mozapps/extensions/test/xpcshell/test_webextension_icons.js new file mode 100644 index 0000000000..c466bbf72e --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_webextension_icons.js @@ -0,0 +1,212 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +const ID = "webextension1@tests.mozilla.org"; + +const profileDir = gProfD.clone(); +profileDir.append("extensions"); +profileDir.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY); + +createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "42"); + +async function testSimpleIconsetParsing(manifest) { + await promiseWriteWebManifestForExtension(manifest, profileDir); + + await promiseRestartManager(); + + let uri = do_get_addon_root_uri(profileDir, ID); + + let addon = await promiseAddonByID(ID); + Assert.notEqual(addon, null); + + function check_icons(addon_copy) { + deepEqual(addon_copy.icons, { + 16: uri + "icon16.png", + 32: uri + "icon32.png", + 48: uri + "icon48.png", + 64: uri + "icon64.png", + }); + + // iconURL should map to icons[48] + equal(addon.iconURL, uri + "icon48.png"); + + // AddonManager gets the correct icon sizes from addon.icons + equal(AddonManager.getPreferredIconURL(addon, 1), uri + "icon16.png"); + equal(AddonManager.getPreferredIconURL(addon, 16), uri + "icon16.png"); + equal(AddonManager.getPreferredIconURL(addon, 30), uri + "icon32.png"); + equal(AddonManager.getPreferredIconURL(addon, 48), uri + "icon48.png"); + equal(AddonManager.getPreferredIconURL(addon, 64), uri + "icon64.png"); + equal(AddonManager.getPreferredIconURL(addon, 128), uri + "icon64.png"); + } + + check_icons(addon); + + // check if icons are persisted through a restart + await promiseRestartManager(); + + addon = await promiseAddonByID(ID); + Assert.notEqual(addon, null); + + check_icons(addon); + + await addon.uninstall(); +} + +async function testRetinaIconsetParsing(manifest) { + await promiseWriteWebManifestForExtension(manifest, profileDir); + + await promiseRestartManager(); + + let addon = await promiseAddonByID(ID); + Assert.notEqual(addon, null); + + let uri = do_get_addon_root_uri(profileDir, ID); + + // AddonManager displays larger icons for higher pixel density + equal( + AddonManager.getPreferredIconURL(addon, 32, { + devicePixelRatio: 2, + }), + uri + "icon64.png" + ); + + equal( + AddonManager.getPreferredIconURL(addon, 48, { + devicePixelRatio: 2, + }), + uri + "icon128.png" + ); + + equal( + AddonManager.getPreferredIconURL(addon, 64, { + devicePixelRatio: 2, + }), + uri + "icon128.png" + ); + + await addon.uninstall(); +} + +async function testNoIconsParsing(manifest) { + await promiseWriteWebManifestForExtension(manifest, profileDir); + + await promiseRestartManager(); + + let addon = await promiseAddonByID(ID); + Assert.notEqual(addon, null); + + deepEqual(addon.icons, {}); + + equal(addon.iconURL, null); + + equal(AddonManager.getPreferredIconURL(addon, 128), null); + + await addon.uninstall(); +} + +// Test simple icon set parsing +add_task(async function() { + await promiseStartupManager(); + await testSimpleIconsetParsing({ + name: "Web Extension Name", + version: "1.0", + manifest_version: 2, + applications: { + gecko: { + id: ID, + }, + }, + icons: { + 16: "icon16.png", + 32: "icon32.png", + 48: "icon48.png", + 64: "icon64.png", + }, + }); + + // Now for theme-type extensions too. + await testSimpleIconsetParsing({ + name: "Web Extension Name", + version: "1.0", + manifest_version: 2, + applications: { + gecko: { + id: ID, + }, + }, + icons: { + 16: "icon16.png", + 32: "icon32.png", + 48: "icon48.png", + 64: "icon64.png", + }, + theme: { images: { theme_frame: "example.png" } }, + }); +}); + +// Test AddonManager.getPreferredIconURL for retina screen sizes +add_task(async function() { + await testRetinaIconsetParsing({ + name: "Web Extension Name", + version: "1.0", + manifest_version: 2, + applications: { + gecko: { + id: ID, + }, + }, + icons: { + 32: "icon32.png", + 48: "icon48.png", + 64: "icon64.png", + 128: "icon128.png", + 256: "icon256.png", + }, + }); + + await testRetinaIconsetParsing({ + name: "Web Extension Name", + version: "1.0", + manifest_version: 2, + applications: { + gecko: { + id: ID, + }, + }, + icons: { + 32: "icon32.png", + 48: "icon48.png", + 64: "icon64.png", + 128: "icon128.png", + 256: "icon256.png", + }, + theme: { images: { theme_frame: "example.png" } }, + }); +}); + +// Handles no icons gracefully +add_task(async function() { + await testNoIconsParsing({ + name: "Web Extension Name", + version: "1.0", + manifest_version: 2, + applications: { + gecko: { + id: ID, + }, + }, + }); + + await testNoIconsParsing({ + name: "Web Extension Name", + version: "1.0", + manifest_version: 2, + applications: { + gecko: { + id: ID, + }, + }, + theme: { images: { theme_frame: "example.png" } }, + }); +}); |