Skip to content

Commit

Permalink
Guard against redefinition of Date.now (#1196)
Browse files Browse the repository at this point in the history
* Guard against presence of likely older third party libraries which (re)define Date.now, e.g. datejs/Datejs#92

* Apply formatting changes

* (remove nowTimestamp import where Date.now() is not used)

* Add a PURE marker so an empty `ìf` statement doesn't show up in the rrweb-replay output

* Update packages/rrweb/src/utils.ts

Fix typing issue with regex against `Date.now()`

Co-authored-by: Justin Halsall <[email protected]>

* Create little-radios-thank.md

* Apply formatting changes

* Update .changeset/little-radios-thank.md

* Apply formatting changes

---------

Co-authored-by: eoghanmurray <[email protected]>
Co-authored-by: Justin Halsall <[email protected]>
  • Loading branch information
3 people authored Jun 2, 2023
1 parent 325a9f0 commit 490b3e2
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 3 deletions.
5 changes: 5 additions & 0 deletions .changeset/date-now-guard.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'rrweb': patch
---

Guard against presence of older 3rd party javascript libraries which redefine Date.now()
5 changes: 5 additions & 0 deletions .changeset/little-radios-thank.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'rrweb': patch
---

Guard against redefinition of Date.now by third party libraries which are also present on a page alongside rrweb
3 changes: 2 additions & 1 deletion packages/rrweb/src/record/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
hasShadowRoot,
isSerializedIframe,
isSerializedStylesheet,
nowTimestamp,
} from '../utils';
import type { recordOptions } from '../types';
import {
Expand Down Expand Up @@ -42,7 +43,7 @@ import {
function wrapEvent(e: event): eventWithTime {
return {
...e,
timestamp: Date.now(),
timestamp: nowTimestamp(),
};
}

Expand Down
5 changes: 3 additions & 2 deletions packages/rrweb/src/record/observer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
legacy_isTouchEvent,
patch,
StyleSheetMirror,
nowTimestamp,
} from '../utils';
import type { observerParam, MutationBufferParam } from '../types';
import {
Expand Down Expand Up @@ -181,13 +182,13 @@ function initMoveObserver({
? evt.changedTouches[0]
: evt;
if (!timeBaseline) {
timeBaseline = Date.now();
timeBaseline = nowTimestamp();
}
positions.push({
x: clientX,
y: clientY,
id: mirror.getId(target as Node),
timeOffset: Date.now() - timeBaseline,
timeOffset: nowTimestamp() - timeBaseline,
});
// it is possible DragEvent is undefined even on devices
// that support event 'drag'
Expand Down
9 changes: 9 additions & 0 deletions packages/rrweb/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,15 @@ export function patch(
}
}

// guard against old third party libraries which redefine Date.now
let nowTimestamp = Date.now;

if (!(/*@__PURE__*/ /[1-9][0-9]{12}/.test(Date.now().toString()))) {
// they have already redefined it! use a fallback
nowTimestamp = () => new Date().getTime();
}
export { nowTimestamp };

export function getWindowScroll(win: Window) {
const doc = win.document;
return {
Expand Down

0 comments on commit 490b3e2

Please sign in to comment.