Skip to content

fix: treat querySelector/querySelectorAll as methods in untainted pro…#1802

Open
juliecheng wants to merge 1 commit intorrweb-io:masterfrom
pendo-io:jc-rrweb-queryselector-as-methods
Open

fix: treat querySelector/querySelectorAll as methods in untainted pro…#1802
juliecheng wants to merge 1 commit intorrweb-io:masterfrom
pendo-io:jc-rrweb-queryselector-as-methods

Conversation

@juliecheng
Copy link
Copy Markdown
Contributor

@juliecheng juliecheng commented Mar 16, 2026

…totype check

issue:
querySelector and querySelectorAll were listed under testableAccessors = the checks always failed = we're always creating/removing iframes to try and get the untainted versions when it's not necessary

fix:
move both querySelector and querySelectorAll into testableMethods

@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Mar 16, 2026

🦋 Changeset detected

Latest commit: b66b5eb

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 19 packages
Name Type
@rrweb/utils Patch
rrweb Patch
rrweb-snapshot Patch
rrdom Patch
rrdom-nodejs Patch
rrweb-player Patch
@rrweb/all Patch
@rrweb/replay Patch
@rrweb/record Patch
@rrweb/types Patch
@rrweb/packer Patch
@rrweb/web-extension Patch
rrvideo Patch
@rrweb/rrweb-plugin-console-record Patch
@rrweb/rrweb-plugin-console-replay Patch
@rrweb/rrweb-plugin-sequential-id-record Patch
@rrweb/rrweb-plugin-sequential-id-replay Patch
@rrweb/rrweb-plugin-canvas-webrtc-record Patch
@rrweb/rrweb-plugin-canvas-webrtc-replay Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions
Copy link
Copy Markdown
Contributor

Size Change: -169 B (0%)

Total Size: 10.1 MB

Filename Size Change
packages/all/dist/all.cjs 578 kB -12 B (0%)
packages/all/dist/all.js 577 kB -12 B (0%)
packages/all/dist/all.umd.cjs 581 kB -12 B (0%)
packages/all/dist/all.umd.min.cjs 273 kB -2 B (0%)
packages/record/dist/record.cjs 397 kB -12 B (0%)
packages/record/dist/record.js 397 kB -12 B (0%)
packages/record/dist/record.umd.cjs 400 kB -12 B (0%)
packages/record/dist/record.umd.min.cjs 184 kB -2 B (0%)
packages/replay/dist/replay.cjs 410 kB -6 B (0%)
packages/replay/dist/replay.js 410 kB -6 B (0%)
packages/replay/dist/replay.umd.cjs 414 kB -6 B (0%)
packages/replay/dist/replay.umd.min.cjs 196 kB -1 B (0%)
packages/rrweb-snapshot/dist/rrweb-snapshot.cjs 176 kB -6 B (0%)
packages/rrweb-snapshot/dist/rrweb-snapshot.js 175 kB -6 B (0%)
packages/rrweb-snapshot/dist/rrweb-snapshot.umd.cjs 178 kB -6 B (0%)
packages/rrweb-snapshot/dist/rrweb-snapshot.umd.min.cjs 83.3 kB +1 B (0%)
packages/rrweb/dist/rrweb.cjs 560 kB -12 B (0%)
packages/rrweb/dist/rrweb.js 560 kB -12 B (0%)
packages/rrweb/dist/rrweb.umd.cjs 561 kB -12 B (0%)
packages/rrweb/dist/rrweb.umd.min.cjs 264 kB -2 B (0%)
packages/utils/dist/utils.cjs 6.25 kB -6 B (-0.1%)
packages/utils/dist/utils.js 5.73 kB -6 B (-0.1%)
packages/utils/dist/utils.umd.cjs 7.28 kB -6 B (-0.08%)
packages/utils/dist/utils.umd.min.cjs 4.09 kB -1 B (-0.02%)
ℹ️ View Unchanged
Filename Size
packages/packer/dist/base-DF-ifV6c.cjs 18.3 kB
packages/packer/dist/base-DF-ifV6c.umd.cjs 19.4 kB
packages/packer/dist/base-DF-ifV6c.umd.min.cjs 10.1 kB
packages/packer/dist/base-Dgki_PiJ.js 18.2 kB
packages/packer/dist/pack.cjs 347 B
packages/packer/dist/pack.js 285 B
packages/packer/dist/pack.umd.cjs 2.25 kB
packages/packer/dist/pack.umd.min.cjs 1.73 kB
packages/packer/dist/packer.cjs 257 B
packages/packer/dist/packer.js 136 B
packages/packer/dist/packer.umd.cjs 1.28 kB
packages/packer/dist/packer.umd.min.cjs 1.25 kB
packages/packer/dist/unpack.cjs 769 B
packages/packer/dist/unpack.js 702 B
packages/packer/dist/unpack.umd.cjs 1.79 kB
packages/packer/dist/unpack.umd.min.cjs 1.57 kB
packages/plugins/rrweb-plugin-canvas-webrtc-record/dist/rrweb-plugin-canvas-webrtc-record.cjs 37.6 kB
packages/plugins/rrweb-plugin-canvas-webrtc-record/dist/rrweb-plugin-canvas-webrtc-record.js 37.5 kB
packages/plugins/rrweb-plugin-canvas-webrtc-record/dist/rrweb-plugin-canvas-webrtc-record.umd.cjs 38.7 kB
packages/plugins/rrweb-plugin-canvas-webrtc-record/dist/rrweb-plugin-canvas-webrtc-record.umd.min.cjs 22.9 kB
packages/plugins/rrweb-plugin-canvas-webrtc-replay/dist/rrweb-plugin-canvas-webrtc-replay.cjs 34.3 kB
packages/plugins/rrweb-plugin-canvas-webrtc-replay/dist/rrweb-plugin-canvas-webrtc-replay.js 34.2 kB
packages/plugins/rrweb-plugin-canvas-webrtc-replay/dist/rrweb-plugin-canvas-webrtc-replay.umd.cjs 35.4 kB
packages/plugins/rrweb-plugin-canvas-webrtc-replay/dist/rrweb-plugin-canvas-webrtc-replay.umd.min.cjs 21.2 kB
packages/plugins/rrweb-plugin-console-record/dist/rrweb-plugin-console-record.cjs 15 kB
packages/plugins/rrweb-plugin-console-record/dist/rrweb-plugin-console-record.js 14.9 kB
packages/plugins/rrweb-plugin-console-record/dist/rrweb-plugin-console-record.umd.cjs 16.1 kB
packages/plugins/rrweb-plugin-console-record/dist/rrweb-plugin-console-record.umd.min.cjs 8.03 kB
packages/plugins/rrweb-plugin-console-replay/dist/rrweb-plugin-console-replay.cjs 5.01 kB
packages/plugins/rrweb-plugin-console-replay/dist/rrweb-plugin-console-replay.js 4.9 kB
packages/plugins/rrweb-plugin-console-replay/dist/rrweb-plugin-console-replay.umd.cjs 6.07 kB
packages/plugins/rrweb-plugin-console-replay/dist/rrweb-plugin-console-replay.umd.min.cjs 3.27 kB
packages/plugins/rrweb-plugin-sequential-id-record/dist/rrweb-plugin-sequential-id-record.cjs 681 B
packages/plugins/rrweb-plugin-sequential-id-record/dist/rrweb-plugin-sequential-id-record.js 548 B
packages/plugins/rrweb-plugin-sequential-id-record/dist/rrweb-plugin-sequential-id-record.umd.cjs 1.76 kB
packages/plugins/rrweb-plugin-sequential-id-record/dist/rrweb-plugin-sequential-id-record.umd.min.cjs 1.47 kB
packages/plugins/rrweb-plugin-sequential-id-replay/dist/rrweb-plugin-sequential-id-replay.cjs 933 B
packages/plugins/rrweb-plugin-sequential-id-replay/dist/rrweb-plugin-sequential-id-replay.js 820 B
packages/plugins/rrweb-plugin-sequential-id-replay/dist/rrweb-plugin-sequential-id-replay.umd.cjs 2.01 kB
packages/plugins/rrweb-plugin-sequential-id-replay/dist/rrweb-plugin-sequential-id-replay.umd.min.cjs 1.61 kB
packages/replay/dist/style.css 2.45 kB
packages/replay/dist/style.min.css 1.97 kB
packages/rrdom-nodejs/dist/rrdom-nodejs.cjs 143 kB
packages/rrdom-nodejs/dist/rrdom-nodejs.js 142 kB
packages/rrdom-nodejs/dist/rrdom-nodejs.umd.cjs 145 kB
packages/rrdom-nodejs/dist/rrdom-nodejs.umd.min.cjs 68.2 kB
packages/rrdom/dist/rrdom.cjs 161 kB
packages/rrdom/dist/rrdom.js 160 kB
packages/rrdom/dist/rrdom.umd.cjs 163 kB
packages/rrdom/dist/rrdom.umd.min.cjs 75.3 kB
packages/rrweb-player/dist/events.js 159 kB
packages/rrweb-player/dist/global.css 240 B
packages/rrweb-player/dist/rrweb-player.cjs 294 kB
packages/rrweb-player/dist/rrweb-player.js 294 kB
packages/rrweb-player/dist/rrweb-player.umd.cjs 296 kB
packages/rrweb-player/dist/rrweb-player.umd.min.cjs 132 kB
packages/rrweb-player/dist/style.css 5.57 kB
packages/rrweb-player/dist/style.min.css 5 kB
packages/rrweb/dist/style.css 2.45 kB
packages/rrweb/dist/style.min.css 1.97 kB
packages/types/dist/types.cjs 5.63 kB
packages/types/dist/types.js 5.38 kB
packages/types/dist/types.umd.cjs 6.66 kB
packages/types/dist/types.umd.min.cjs 3.41 kB

compressed-size-action

pauldambra pushed a commit to PostHog/posthog-rrweb that referenced this pull request Apr 2, 2026
… iframe creation (#159)

## Summary
- Adopts upstream rrweb
[#1770](rrweb-io/rrweb#1770) and
[#1802](rrweb-io/rrweb#1802)
- **#1770**: Wraps untainted prototype iframe creation in `try/finally`
so the iframe is always removed, even on early return (when
`contentWindow` is null) or exception. Previously these iframes would
leak into the DOM.
- **#1802**: Moves `querySelector`/`querySelectorAll` from
`testableAccessors` to `testableMethods` and switches helpers from
`getUntaintedAccessor` to `getUntaintedMethod`. These are methods, not
property accessors, so the accessor check
(`getOwnPropertyDescriptor(...).get`) always failed, causing a throwaway
iframe to be created every time just to get the untainted prototype.

## Why
Both fixes are in `packages/utils/src/index.ts` and affect the same
`getUntaintedPrototype` code path. #1770 prevents DOM pollution from
leaked iframes. #1802 avoids unnecessary iframe creation on every
querySelector/querySelectorAll call, which is a hot path during
recording.

## Test plan
- [ ] Verify no regressions in recording on pages with patched DOM
prototypes (Angular apps)
- [ ] Inspect DOM during recording to confirm no orphaned iframes from
untainted prototype detection
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant