diff options
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_webextension_install.js')
-rw-r--r-- | toolkit/mozapps/extensions/test/xpcshell/test_webextension_install.js | 196 |
1 files changed, 193 insertions, 3 deletions
diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_webextension_install.js b/toolkit/mozapps/extensions/test/xpcshell/test_webextension_install.js index 913c802609..3551b2c8dd 100644 --- a/toolkit/mozapps/extensions/test/xpcshell/test_webextension_install.js +++ b/toolkit/mozapps/extensions/test/xpcshell/test_webextension_install.js @@ -1,5 +1,14 @@ +AddonTestUtils.overrideCertDB(); +AddonTestUtils.usePrivilegedSignatures = id => id.startsWith("privileged-"); + +// Some tests in this test file can't run on android build because +// theme addon type isn't supported. +const skipOnAndroid = () => ({ + skip_if: () => AppConstants.platform === "android", +}); + let profileDir; -add_task(async function setup() { +add_setup(async function setup() { profileDir = gProfD.clone(); profileDir.append("extensions"); @@ -19,7 +28,7 @@ const IMPLICIT_ID_ID = "{46607a7b-1b2a-40ce-9afe-91cda52c46a6}"; // webext-implicit-id.xpi has a minimal manifest with no // applications or browser_specific_settings, so its id comes // from its signature, which should be the ID constant defined below. -add_task(async function test_implicit_id() { +add_task(skipOnAndroid(), async function test_implicit_id() { let addon = await promiseAddonByID(IMPLICIT_ID_ID); equal(addon, null, "Add-on is not installed"); @@ -34,7 +43,7 @@ add_task(async function test_implicit_id() { // We should also be able to install webext-implicit-id.xpi temporarily // and it should look just like the regular install (ie, the ID should // come from the signature) -add_task(async function test_implicit_id_temp() { +add_task(skipOnAndroid(), async function test_implicit_id_temp() { let addon = await promiseAddonByID(IMPLICIT_ID_ID); equal(addon, null, "Add-on is not installed"); @@ -602,6 +611,187 @@ add_task(async function test_permissions_prompt() { await IOUtils.remove(xpi.path); }); +// Check normalized optional origins. +add_task(async function test_normalized_optional_origins() { + const assertAddonWrapperPermissionsProperties = async ( + manifest, + expected + ) => { + let xpi = ExtensionTestCommon.generateXPI({ manifest }); + + let install = await AddonManager.getInstallForFile(xpi); + + let perminfo; + let installPromptCompletedDeferred = Promise.withResolvers(); + let installPromptShownDeferred = Promise.withResolvers(); + install.promptHandler = info => { + perminfo = info; + installPromptShownDeferred.resolve(); + return installPromptCompletedDeferred.promise; + }; + + const promiseInstalled = install.install(); + info("Wait for the install prompt"); + await installPromptShownDeferred.promise; + + equal( + await promiseAddonByID(perminfo.addon.id), + null, + "Extension should not be installed yet" + ); + notEqual(perminfo, undefined, "Permission handler was invoked"); + notEqual(perminfo.addon, null, "Permission info includes the new addon"); + equal( + perminfo.addon.isPrivileged, + expected.isPrivileged, + `Expect the addon to be ${expected.isPrivileged ? "" : "non-"}privileged` + ); + let addon = perminfo.addon; + deepEqual( + addon.userPermissions, + expected.userPermissions, + "userPermissions are correct" + ); + deepEqual( + addon.optionalPermissions, + expected.optionalPermissions, + "optionalPermissions are correct" + ); + info("Assert normalized optional origins on non-installed extension"); + deepEqual( + addon.optionalOriginsNormalized, + expected.optionalOriginsNormalized, + "optionalOriginsNormalized are correct" + ); + + installPromptCompletedDeferred.resolve(); + await promiseInstalled; + addon = await promiseAddonByID(perminfo.addon.id); + notEqual(addon, null, "Extension was installed successfully"); + + info("Assert normalized optional origins again on installed extension"); + deepEqual( + addon.optionalOriginsNormalized, + expected.optionalOriginsNormalized, + "Normalized origin permissions are correct" + ); + + await addon.uninstall(); + await IOUtils.remove(xpi.path); + }; + + info( + "Test normalized optional origins on non-privileged ManifestV2 extension" + ); + const manifestV2 = { + name: "permissions test mv2", + manifest_version: 2, + // Include a permission that would trigger an install time prompt. + permissions: ["tabs"], + // Include optional origins to be normalized. + // NOTE: we expect the normalized origins to be deduplicated. + optional_permissions: [ + "http://*.example.com/", + "http://*.example.com/somepath/", + "*://example.org/*", + "*://example.org/another-path/*", + "file://*/*", + ], + }; + + await assertAddonWrapperPermissionsProperties(manifestV2, { + isPrivileged: false, + userPermissions: { permissions: manifestV2.permissions, origins: [] }, + optionalPermissions: { + permissions: [], + origins: manifestV2.optional_permissions, + }, + optionalOriginsNormalized: [ + "http://*.example.com/*", + "*://example.org/*", + "file://*/*", + ], + }); + + info( + "Test normalized optional origins on non-privileged ManifestV3 extension" + ); + const manifestV3 = { + name: "permissions test mv3", + manifest_version: 3, + // Include a permission that would trigger an install time prompt. + permissions: ["tabs"], + + // Content Scripts match patterns are also expected to be part + // of the optional host permissions (and to be deduplicated). + content_scripts: [ + { + matches: ["*://*/*"], + js: ["script.js"], + }, + { + matches: ["*://example.org/*"], + js: ["script2.js"], + }, + ], + + // Include optional origins to be normalized. + host_permissions: [ + "http://*.example.com/", + "*://example.org/*", + "file://*/*", + ], + }; + + await assertAddonWrapperPermissionsProperties(manifestV3, { + isPrivileged: false, + userPermissions: { permissions: manifestV3.permissions, origins: [] }, + optionalPermissions: { + permissions: [], + origins: [...manifestV3.host_permissions, "*://*/*"], + }, + optionalOriginsNormalized: [ + "http://*.example.com/*", + "*://example.org/*", + "file://*/*", + "*://*/*", + ], + }); + + info("Test normalized optional origins on privileged ManifestV2 extension"); + const manifestV2Privileged = { + name: "permissions test privileged mv2", + manifest_version: 2, + browser_specific_settings: { gecko: { id: "privileged-mv2@ext" } }, + // Include a permission that would trigger an install time prompt. + permissions: ["tabs", "mozillaAddons"], + optional_permissions: [ + "http://*.example.com/", + "*://example.org/*", + "file://*/*", + "resource://gre/", + ], + }; + + await assertAddonWrapperPermissionsProperties(manifestV2Privileged, { + isPrivileged: true, + userPermissions: { + permissions: manifestV2Privileged.permissions, + origins: [], + }, + optionalPermissions: { + permissions: [], + origins: manifestV2Privileged.optional_permissions, + }, + optionalOriginsNormalized: [ + "http://*.example.com/*", + "*://example.org/*", + "file://*/*", + "resource://gre/*", + ], + }); +}); + // Check permissions prompt cancellation add_task(async function test_permissions_prompt_cancel() { const manifest = { |