Skip to content

Commit fbcd16a

Browse files
committed
ref: Avoid unnecessary cloning of objects or arrays
1 parent 8444cb2 commit fbcd16a

File tree

5 files changed

+15
-24
lines changed

5 files changed

+15
-24
lines changed

.changeset/gold-apples-joke.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'rrweb': patch
3+
---
4+
5+
ref: Avoid unnecessary cloning of objects or arrays

packages/rrweb/src/record/observer.ts

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -405,15 +405,6 @@ function initViewportResizeObserver(
405405
return on('resize', updateDimension, win);
406406
}
407407

408-
function wrapEventWithUserTriggeredFlag(
409-
v: inputValue,
410-
enable: boolean,
411-
): inputValue {
412-
const value = { ...v };
413-
if (!enable) delete value.userTriggered;
414-
return value;
415-
}
416-
417408
export const INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT'];
418409
const lastInputValueMap: WeakMap<EventTarget, inputValue> = new WeakMap();
419410
function initInputObserver({
@@ -477,10 +468,9 @@ function initInputObserver({
477468
}
478469
cbWithDedup(
479470
target,
480-
callbackWrapper(wrapEventWithUserTriggeredFlag)(
481-
{ text, isChecked, userTriggered },
482-
userTriggeredOnInput,
483-
),
471+
userTriggeredOnInput
472+
? { text, isChecked, userTriggered }
473+
: { text, isChecked },
484474
);
485475
// if a radio was checked
486476
// the other radios with the same name attribute will be unchecked.
@@ -490,16 +480,12 @@ function initInputObserver({
490480
.querySelectorAll(`input[type="radio"][name="${name}"]`)
491481
.forEach((el) => {
492482
if (el !== target) {
483+
const text = (el as HTMLInputElement).value;
493484
cbWithDedup(
494485
el,
495-
callbackWrapper(wrapEventWithUserTriggeredFlag)(
496-
{
497-
text: (el as HTMLInputElement).value,
498-
isChecked: !isChecked,
499-
userTriggered: false,
500-
},
501-
userTriggeredOnInput,
502-
),
486+
userTriggeredOnInput
487+
? { text, isChecked: !isChecked, userTriggered: false }
488+
: { text, isChecked: !isChecked },
503489
);
504490
}
505491
});

packages/rrweb/src/record/observers/canvas/2d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export default function initCanvas2DMutationObserver(
4545
// Using setTimeout as toDataURL can be heavy
4646
// and we'd rather not block the main thread
4747
setTimeout(() => {
48-
const recordArgs = serializeArgs([...args], win, this);
48+
const recordArgs = serializeArgs(args, win, this);
4949
cb(this.canvas, {
5050
type: CanvasContext['2D'],
5151
property: prop,

packages/rrweb/src/record/observers/canvas/serialize-args.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ export const serializeArgs = (
133133
win: IWindow,
134134
ctx: RenderingContext,
135135
) => {
136-
return [...args].map((arg) => serializeArg(arg, win, ctx));
136+
return args.map((arg) => serializeArg(arg, win, ctx));
137137
};
138138

139139
export const isInstanceOfWebGLObject = (

packages/rrweb/src/record/observers/canvas/webgl.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ function patchGLPrototype(
5353
'tagName' in this.canvas &&
5454
!isBlocked(this.canvas, blockClass, blockSelector, true)
5555
) {
56-
const recordArgs = serializeArgs([...args], win, this);
56+
const recordArgs = serializeArgs(args, win, this);
5757
const mutation: canvasMutationWithType = {
5858
type,
5959
property: prop,

0 commit comments

Comments
 (0)