Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Replace Array.from with clean implementation
Browse files Browse the repository at this point in the history
This work is to try to provide support where rrweb might be included
in applications with various tools that might override Array.from
so that the 2nd parameter (the map function) will always work for
rrweb.
mdellanoce authored and colingm committed May 6, 2024

Verified

This commit was signed with the committer’s verified signature.
colingm Colin Maxfield
1 parent f1e6a51 commit 6540a89
Showing 3 changed files with 21 additions and 0 deletions.
6 changes: 6 additions & 0 deletions .changeset/eleven-bobcats-peel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'rrweb-snapshot': patch
'rrweb': patch
---

try to provide clean implementation for Array.from to support older libraries that might drop the 2nd parameter
14 changes: 14 additions & 0 deletions packages/rrweb/src/record/index.ts
Original file line number Diff line number Diff line change
@@ -46,6 +46,20 @@ let takeFullSnapshot!: (isCheckout?: boolean) => void;
let canvasManager!: CanvasManager;
let recording = false;

// Multiple tools (i.e. MooTools, Prototype.js) override Array.from and drop support for the 2nd parameter
// Try to pull a clean implementation from a newly created iframe
try {
if (window.Array.from([1], (x) => x * 2)[0] !== 2) {
const cleanFrame = document.createElement('iframe');
document.body.appendChild(cleanFrame);
window.Array.from =
cleanFrame.contentWindow?.Array.from || window.Array.from;
document.body.removeChild(cleanFrame);
}
} catch (err) {
console.debug('Unable to override Array.from', err);
}

const mirror = createMirror();
function record<T = eventWithTime>(
options: recordOptions<T> = {},
1 change: 1 addition & 0 deletions packages/rrweb/src/types.ts
Original file line number Diff line number Diff line change
@@ -207,6 +207,7 @@ export type missingNodeMap = {
declare global {
interface Window {
FontFace: typeof FontFace;
Array: typeof Array;
}
}

0 comments on commit 6540a89

Please sign in to comment.