diff --git a/packages/playwright-core/src/server/chromium/crBrowser.ts b/packages/playwright-core/src/server/chromium/crBrowser.ts index fe3f114c61c93..83cb12d2eec47 100644 --- a/packages/playwright-core/src/server/chromium/crBrowser.ts +++ b/packages/playwright-core/src/server/chromium/crBrowser.ts @@ -452,13 +452,25 @@ export class CRBrowserContext extends BrowserContext { ['local-fonts', 'localFonts'], ['local-network-access', ['localNetworkAccess', 'localNetwork', 'loopbackNetwork']], ]); - const filtered = permissions.flatMap(permission => { - const protocolPermission = webPermissionToProtocol.get(permission); - if (!protocolPermission) - throw new Error('Unknown permission: ' + permission); - return typeof protocolPermission === 'string' ? [protocolPermission] : protocolPermission; - }); - await this._browser._session.send('Browser.grantPermissions', { origin: origin === '*' ? undefined : origin, browserContextId: this._browserContextId, permissions: filtered }); + + const grantPermissions = async (mapping: Map) => { + const filtered = permissions.flatMap(permission => { + const protocolPermission = mapping.get(permission); + if (!protocolPermission) + throw new Error('Unknown permission: ' + permission); + return typeof protocolPermission === 'string' ? [protocolPermission] : protocolPermission; + }); + await this._browser._session.send('Browser.grantPermissions', { origin: origin === '*' ? undefined : origin, browserContextId: this._browserContextId, permissions: filtered }); + }; + + try { + await grantPermissions(webPermissionToProtocol); + } catch (e) { + // Old stable browsers dislike the new permission name, so we use the fallback mapping. + const fallbackMapping = new Map(webPermissionToProtocol); + fallbackMapping.set('local-network-access', ['localNetworkAccess']); + await grantPermissions(fallbackMapping); + } } async doClearPermissions() { diff --git a/tests/library/permissions.spec.ts b/tests/library/permissions.spec.ts index 6965554b40dbe..d5d73f3fae7fb 100644 --- a/tests/library/permissions.spec.ts +++ b/tests/library/permissions.spec.ts @@ -258,7 +258,6 @@ it('local network request is allowed from public origin', { annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright/issues/37861' } }, async ({ page, context, server, browserName, channel, browserMajorVersion }) => { it.skip(browserName === 'webkit'); - it.skip(channel?.startsWith('msedge')); it.skip(browserName === 'chromium' && browserMajorVersion < 145, 'local-network-access permission support has changed between versions'); if (browserName === 'chromium')