summaryrefslogtreecommitdiffstats
path: root/toolkit/mozapps/extensions/test/xpcshell/test_webextension_icons.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_webextension_icons.js')
-rw-r--r--toolkit/mozapps/extensions/test/xpcshell/test_webextension_icons.js212
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..112a2c8410
--- /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,
+ browser_specific_settings: {
+ 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,
+ browser_specific_settings: {
+ 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,
+ browser_specific_settings: {
+ 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,
+ browser_specific_settings: {
+ 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,
+ browser_specific_settings: {
+ gecko: {
+ id: ID,
+ },
+ },
+ });
+
+ await testNoIconsParsing({
+ name: "Web Extension Name",
+ version: "1.0",
+ manifest_version: 2,
+ browser_specific_settings: {
+ gecko: {
+ id: ID,
+ },
+ },
+ theme: { images: { theme_frame: "example.png" } },
+ });
+});