diff --git a/packages/playwright-core/src/server/firefox/firefox.ts b/packages/playwright-core/src/server/firefox/firefox.ts index a55d28750bb0e..a4062fa375d27 100644 --- a/packages/playwright-core/src/server/firefox/firefox.ts +++ b/packages/playwright-core/src/server/firefox/firefox.ts @@ -68,7 +68,7 @@ export class Firefox extends BrowserType { throw new Error('Pass userDataDir parameter to `browserType.launchPersistentContext(userDataDir, ...)` instead of specifying --profile argument'); if (args.find(arg => arg.startsWith('-juggler'))) throw new Error('Use the port parameter instead of -juggler argument'); - const firefoxUserPrefs = isPersistent ? undefined : options.firefoxUserPrefs; + const firefoxUserPrefs = isPersistent ? undefined : { ...kBandaidFirefoxUserPrefs, ...options.firefoxUserPrefs }; if (firefoxUserPrefs) { const lines: string[] = []; for (const [name, value] of Object.entries(firefoxUserPrefs)) @@ -92,3 +92,9 @@ export class Firefox extends BrowserType { return firefoxArguments; } } + +// Prefs for quick fixes that didn't make it to the build. +// Should all be moved to `playwright.cfg`. +const kBandaidFirefoxUserPrefs = { + 'network.cookie.cookieBehavior': 4, +}; diff --git a/tests/library/browsercontext-cookies.spec.ts b/tests/library/browsercontext-cookies.spec.ts index e1d139a76846a..342be6b059875 100644 --- a/tests/library/browsercontext-cookies.spec.ts +++ b/tests/library/browsercontext-cookies.spec.ts @@ -320,3 +320,32 @@ it('should add cookies with an expiration', async ({ context }) => { expires: -42, }])).rejects.toThrow(/Cookie should have a valid expires/); }); + +it('should be able to send third party cookies via an iframe', async ({ browser, httpsServer, browserName, isMac }) => { + it.fixme(browserName === 'webkit' && isMac); + it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/16937' }); + + const context = await browser.newContext({ + ignoreHTTPSErrors: true, + }); + try { + const page = await context.newPage(); + await page.goto(httpsServer.EMPTY_PAGE); + await context.addCookies([{ + domain: new URL(httpsServer.CROSS_PROCESS_PREFIX).hostname, + path: '/', + name: 'cookie1', + value: 'yes', + httpOnly: true, + secure: true, + sameSite: 'None' + }]); + const [response] = await Promise.all([ + httpsServer.waitForRequest('/grid.html'), + page.setContent(``) + ]); + expect(response.headers['cookie']).toBe('cookie1=yes'); + } finally { + await context.close(); + } +});