From 5b5b01194db9efcb5eae841bb0e2bb41e0617fc7 Mon Sep 17 00:00:00 2001 From: Shane Caraveo Date: Thu, 14 Feb 2019 01:32:31 +0000 Subject: [PATCH] Bug 1524001 update manifest to validate manifest.icons, r=kmag Differential Revision: https://phabricator.services.mozilla.com/D18105 --HG-- rename : toolkit/components/extensions/test/xpcshell/test_ext_manifest.js => browser/components/extensions/test/xpcshell/test_ext_manifest.js extra : moz-landing-system : lando --- .../test/xpcshell/test_ext_manifest.js | 48 +++++++++++++++ .../extensions/test/xpcshell/xpcshell.ini | 1 + .../extensions/schemas/manifest.json | 2 +- .../test/xpcshell/test_ext_manifest.js | 60 +++++++++---------- .../test/xpcshell/test_ext_management.js | 4 +- 5 files changed, 80 insertions(+), 35 deletions(-) create mode 100644 browser/components/extensions/test/xpcshell/test_ext_manifest.js diff --git a/browser/components/extensions/test/xpcshell/test_ext_manifest.js b/browser/components/extensions/test/xpcshell/test_ext_manifest.js new file mode 100644 index 000000000000..a2a3c79bdadf --- /dev/null +++ b/browser/components/extensions/test/xpcshell/test_ext_manifest.js @@ -0,0 +1,48 @@ +/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set sts=2 sw=2 et tw=80: */ +"use strict"; + +async function testIconPaths(icon, manifest, expectedError) { + let normalized = await ExtensionTestUtils.normalizeManifest(manifest); + + if (expectedError) { + ok(expectedError.test(normalized.error), + `Should have an error for ${JSON.stringify(manifest)}`); + } else { + ok(!normalized.error, `Should not have an error ${JSON.stringify(manifest)}, ${normalized.error}`); + } +} + +add_task(async function test_manifest() { + let badpaths = ["", " ", "\t", "http://foo.com/icon.png"]; + for (let path of badpaths) { + for (let action of ["browser_action", "page_action", "sidebar_action"]) { + let manifest = {}; + manifest[action] = {default_icon: path}; + let error = new RegExp(`Error processing ${action}.default_icon`); + await testIconPaths(path, manifest, error); + + manifest[action] = {default_icon: {"16": path}}; + await testIconPaths(path, manifest, error); + } + } + + let paths = ["icon.png", "/icon.png", "./icon.png", "path to an icon.png", " icon.png"]; + for (let path of paths) { + for (let action of ["browser_action", "page_action", "sidebar_action"]) { + let manifest = {}; + manifest[action] = {default_icon: path}; + if (action == "sidebar_action") { + // Sidebar requires panel. + manifest[action].default_panel = "foo.html"; + } + await testIconPaths(path, manifest); + + manifest[action] = {default_icon: {"16": path}}; + if (action == "sidebar_action") { + manifest[action].default_panel = "foo.html"; + } + await testIconPaths(path, manifest); + } + } +}); diff --git a/browser/components/extensions/test/xpcshell/xpcshell.ini b/browser/components/extensions/test/xpcshell/xpcshell.ini index 190b90749e4a..230f60d22590 100644 --- a/browser/components/extensions/test/xpcshell/xpcshell.ini +++ b/browser/components/extensions/test/xpcshell/xpcshell.ini @@ -17,6 +17,7 @@ dupe-manifest = # For tests which should only run with both remote extensions and remote content. [test_ext_geckoProfiler_schema.js] +[test_ext_manifest.js] [test_ext_manifest_commands.js] [test_ext_manifest_omnibox.js] [test_ext_manifest_permissions.js] diff --git a/toolkit/components/extensions/schemas/manifest.json b/toolkit/components/extensions/schemas/manifest.json index 2b778a8c5ca3..db1f6a2552e9 100644 --- a/toolkit/components/extensions/schemas/manifest.json +++ b/toolkit/components/extensions/schemas/manifest.json @@ -95,7 +95,7 @@ "type": "object", "optional": true, "patternProperties": { - "^[1-9]\\d*$": { "type": "string" } + "^[1-9]\\d*$": { "$ref": "ExtensionFileUrl" } } }, diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_manifest.js b/toolkit/components/extensions/test/xpcshell/test_ext_manifest.js index b21dbda6d585..bde6bff3357d 100644 --- a/toolkit/components/extensions/test/xpcshell/test_ext_manifest.js +++ b/toolkit/components/extensions/test/xpcshell/test_ext_manifest.js @@ -2,48 +2,42 @@ /* vim: set sts=2 sw=2 et tw=80: */ "use strict"; +async function testIconPaths(icon, manifest, expectedError) { + let normalized = await ExtensionTestUtils.normalizeManifest(manifest); + + if (expectedError) { + ok(expectedError.test(normalized.error), + `Should have an error for ${JSON.stringify(icon)}`); + } else { + ok(!normalized.error, `Should not have an error ${JSON.stringify(icon)}`); + } +} + add_task(async function test_manifest() { let badpaths = ["", " ", "\t", "http://foo.com/icon.png"]; for (let path of badpaths) { - let normalized = await ExtensionTestUtils.normalizeManifest({ - "browser_action": { - "default_icon": path, + await testIconPaths(path, { + "icons": path, + }, /Error processing icons/); + + await testIconPaths(path, { + "icons": { + "16": path, }, - }); - - ok(/Error processing browser_action.default_icon/.test(normalized.error), - `Should have an error for ${JSON.stringify(path)}`); - - normalized = await ExtensionTestUtils.normalizeManifest({ - "browser_action": { - "default_icon": { - "16": path, - }, - }, - }); - - ok(/Error processing browser_action.default_icon/.test(normalized.error), - `Should have an error for ${JSON.stringify(path)}`); + }, /Error processing icons/); } let paths = ["icon.png", "/icon.png", "./icon.png", "path to an icon.png", " icon.png"]; for (let path of paths) { - let normalized = await ExtensionTestUtils.normalizeManifest({ - "browser_action": { - "default_icon": { - "16": path, - }, + // manifest.icons is an object + await testIconPaths(path, { + "icons": path, + }, /Error processing icons/); + + await testIconPaths(path, { + "icons": { + "16": path, }, }); - - ok(!normalized.error, `Should not have an error ${JSON.stringify(path)}`); - - normalized = await ExtensionTestUtils.normalizeManifest({ - "browser_action": { - "default_icon": path, - }, - }); - - ok(!normalized.error, `Should not have an error ${JSON.stringify(path)}`); } }); diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_ext_management.js b/toolkit/mozapps/extensions/test/xpcshell/test_ext_management.js index a91d230e9202..adc55ec1c5d9 100644 --- a/toolkit/mozapps/extensions/test/xpcshell/test_ext_management.js +++ b/toolkit/mozapps/extensions/test/xpcshell/test_ext_management.js @@ -11,6 +11,7 @@ function backgroundGetSelf() { browser.management.getSelf().then(extInfo => { let url = browser.extension.getURL("*"); extInfo.hostPermissions = extInfo.hostPermissions.filter(i => i != url); + extInfo.url = browser.extension.getURL(""); browser.test.sendMessage("management-getSelf", extInfo); }, error => { browser.test.notifyFail(`getSelf rejected with error: ${error}`); @@ -65,8 +66,9 @@ add_task(async function test_management_get_self_complete() { equal(extInfo.updateUrl, manifest.applications.gecko.update_url, "getSelf returned the expected updateUrl"); ok(extInfo.optionsUrl.endsWith(manifest.options_ui.page), "getSelf returned the expected optionsUrl"); for (let [index, size] of Object.keys(manifest.icons).sort().entries()) { + let iconUrl = `${extInfo.url}${manifest.icons[size]}`; equal(extInfo.icons[index].size, +size, "getSelf returned the expected icon size"); - equal(extInfo.icons[index].url, manifest.icons[size], "getSelf returned the expected icon url"); + equal(extInfo.icons[index].url, iconUrl, "getSelf returned the expected icon url"); } deepEqual(extInfo.permissions.sort(), permissions.sort(), "getSelf returned the expected permissions"); deepEqual(extInfo.hostPermissions.sort(), hostPermissions.sort(), "getSelf returned the expected hostPermissions");