From efd5c40043b67006b63875c4e8e48e1c27aa72a6 Mon Sep 17 00:00:00 2001 From: Aaron Date: Fri, 19 Apr 2024 22:08:52 -0500 Subject: [PATCH] fix!: Automatically move `host_permissions` to `permissions` for MV2 (#626) BREAKING CHANGE: Out of an abundance of caution, I've marked this as a breaking change because permission generation has changed. ***If you list `host_permissions` in your `wxt.config.ts`'s manifest and have released your extension***, double check that your `permissions` and `host_permissions` have not changed for all browsers you target. Permission changes can cause the extension to be disabled on update, and can cause a drop in users, so be sure to double check for differences compared to the previous manifest version. --- src/core/utils/__tests__/manifest.test.ts | 47 +++++++++++++++++++++++ src/core/utils/manifest.ts | 12 ++++++ 2 files changed, 59 insertions(+) diff --git a/src/core/utils/__tests__/manifest.test.ts b/src/core/utils/__tests__/manifest.test.ts index 7bdaad94..3e04f457 100644 --- a/src/core/utils/__tests__/manifest.test.ts +++ b/src/core/utils/__tests__/manifest.test.ts @@ -1447,6 +1447,53 @@ describe('Manifest Utils', () => { }, ); }); + + describe('host_permissions', () => { + it('should keep host_permissions as-is for MV3', async () => { + const expectedHostPermissions = ['https://google.com/*']; + const expectedPermissions = ['scripting']; + setFakeWxt({ + config: { + manifest: { + host_permissions: expectedHostPermissions, + permissions: expectedPermissions, + }, + manifestVersion: 3, + command: 'build', + }, + }); + const output = fakeBuildOutput(); + + const { manifest: actual } = await generateManifest([], output); + + expect(actual.permissions).toEqual(expectedPermissions); + expect(actual.host_permissions).toEqual(expectedHostPermissions); + }); + + it('should move host_permissions to permissions for MV2, ignoring duplicates', async () => { + const expectedPermissions = [ + 'scripting', + '*://*.youtube.com/*', + 'https://google.com/*', + ]; + setFakeWxt({ + config: { + manifest: { + host_permissions: ['https://google.com/*', '*://*.youtube.com/*'], + permissions: ['scripting', '*://*.youtube.com/*'], + }, + manifestVersion: 2, + command: 'build', + }, + }); + const output = fakeBuildOutput(); + + const { manifest: actual } = await generateManifest([], output); + + expect(actual.permissions).toEqual(expectedPermissions); + expect(actual.host_permissions).toBeUndefined(); + }); + }); }); describe('stripPathFromMatchPattern', () => { diff --git a/src/core/utils/manifest.ts b/src/core/utils/manifest.ts index 3fbb4856..ec0bc5bb 100644 --- a/src/core/utils/manifest.ts +++ b/src/core/utils/manifest.ts @@ -117,6 +117,7 @@ export async function generateManifest( if (wxt.config.manifestVersion === 2) { convertWebAccessibleResourcesToMv2(manifest); convertActionToMv2(manifest); + moveHostPermissionsToPermissions(manifest); } if (wxt.config.manifestVersion === 3) { @@ -617,6 +618,17 @@ export function convertWebAccessibleResourcesToMv2( ); } +function moveHostPermissionsToPermissions( + manifest: Manifest.WebExtensionManifest, +): void { + if (!manifest.host_permissions?.length) return; + + manifest.host_permissions.forEach((permission) => + addPermission(manifest, permission), + ); + delete manifest.host_permissions; +} + function convertActionToMv2(manifest: Manifest.WebExtensionManifest): void { if ( manifest.action == null ||