Skip to content

Isolated browser context for each page#2160

Merged
pranavz28 merged 5 commits intomasterfrom
fix/clear-cookies-between-snapshots
Mar 26, 2026
Merged

Isolated browser context for each page#2160
pranavz28 merged 5 commits intomasterfrom
fix/clear-cookies-between-snapshots

Conversation

@pranavz28
Copy link
Copy Markdown
Contributor

@pranavz28 pranavz28 commented Mar 25, 2026

This pull request improves browser isolation for snapshot discovery to prevent cookies and storage from leaking between concurrent or sequential snapshots. The main changes include creating a new isolated browser context for each page, ensuring proper cleanup of these contexts, and adding a test to verify that cookies do not accumulate across multiple snapshots.

Browser context isolation

  • Modified Browser class (browser.js) to create a new isolated browser context for each page using Target.createBrowserContext, ensuring that cookies and storage do not leak between concurrent snapshot discovery pages.
  • Updated the Page class (page.js) to store the browserContextId and dispose of the browser context when the page is closed, preventing resource leaks.

Testing cookie isolation

  • Added a test in discovery.test.js to verify that cookies are not accumulated across multiple snapshots, ensuring that cookies set in one snapshot do not carry over to the next.

Cookies set via Network.setCookies persist across browser targets in
the same context. When processing many snapshots on sites sharing a
parent domain, consent cookies (e.g., didomi_token) accumulate until
the Cookie header exceeds the server's ~8KB limit, causing HTTP 400
errors on all CSS/JS/image requests after ~40 snapshots.

Add Network.clearBrowserCookies before Network.setCookies in page.goto()
so each snapshot starts with a clean cookie jar containing only its own
captured cookies.

Fixes: PER-7073
@pranavz28 pranavz28 requested a review from a team as a code owner March 25, 2026 10:23
@pranavz28 pranavz28 changed the title fix: clear browser cookies between snapshots to prevent accumulation Clear browser cookies between snapshots to prevent accumulation Mar 25, 2026
Percy caches discovered resources across snapshots. The test now uses
img2.gif for the second snapshot so discovery must fetch it fresh,
allowing us to verify the Cookie header contains only cookie-b.
Replace Network.clearBrowserCookies (browser-global, unsafe at
concurrency > 1) with Target.createBrowserContext per snapshot page.

Each snapshot's discovery page now runs in its own isolated browser
context (like an incognito window) with a separate cookie jar. This
eliminates cookie leakage between concurrent snapshots at any
concurrency level.

Changes:
- browser.js: create isolated context before target, store contextId
- page.js: dispose context after session close, remove clearBrowserCookies
- Performance: +0.35ms/snapshot (negligible vs 3-60s per snapshot)

Fixes: PER-7073
When a page crashes or session closes abruptly, this.session.browser
can be null. Add null check before calling disposeBrowserContext.
@pranavz28 pranavz28 changed the title Clear browser cookies between snapshots to prevent accumulation Isolated browser context for each page Mar 26, 2026
@pranavz28 pranavz28 merged commit 4102590 into master Mar 26, 2026
62 of 63 checks passed
@pranavz28 pranavz28 deleted the fix/clear-cookies-between-snapshots branch March 26, 2026 13:38
@pranavz28 pranavz28 added Bug Fix 🐛 bug Something isn't working and removed Bug Fix labels Mar 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🐛 bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants