read __rrMutationObserver from window

This commit is contained in:
Yanzhen Yu
2021-02-04 15:00:14 +08:00
parent 289956b43d
commit 34c74445ba
5 changed files with 22 additions and 7 deletions

2
.gitignore vendored
View File

@@ -9,3 +9,5 @@ es
lib lib
temp temp
*.log

View File

@@ -62,6 +62,6 @@
"@xstate/fsm": "^1.4.0", "@xstate/fsm": "^1.4.0",
"fflate": "^0.4.4", "fflate": "^0.4.4",
"mitt": "^1.1.3", "mitt": "^1.1.3",
"rrweb-snapshot": "^1.0.3" "rrweb-snapshot": "^1.0.4"
} }
} }

View File

@@ -112,6 +112,7 @@ function isINode(n: Node | INode): n is INode {
*/ */
export default class MutationBuffer { export default class MutationBuffer {
private frozen: boolean = false; private frozen: boolean = false;
private locked: boolean = false;
private texts: textCursor[] = []; private texts: textCursor[] = [];
private attributes: attributeCursor[] = []; private attributes: attributeCursor[] = [];
@@ -195,7 +196,6 @@ export default class MutationBuffer {
}; };
public emit = () => { public emit = () => {
if (this.frozen || this.locked) { if (this.frozen || this.locked) {
return; return;
} }

View File

@@ -44,6 +44,9 @@ import {
import MutationBuffer from './mutation'; import MutationBuffer from './mutation';
import { stringify } from './stringify'; import { stringify } from './stringify';
type WindowWithStoredMutationObserver = Window & {
__rrMutationObserver?: MutationObserver;
};
type WindowWithAngularZone = Window & { type WindowWithAngularZone = Window & {
Zone?: { Zone?: {
__symbol__?: (key: string) => string; __symbol__?: (key: string) => string;
@@ -71,7 +74,17 @@ function initMutationObserver(
recordCanvas, recordCanvas,
slimDOMOptions, slimDOMOptions,
); );
let mutationBufferCtor = window.MutationObserver; let mutationBufferCtor =
window.MutationObserver ||
/**
* Some websites may disable MutationObserver by removing it from the window object.
* If someone is using rrweb to build a browser extention or things like it, they
* could not change the website's code but can have an opportunity to inject some
* code before the website executing its JS logic.
* Then they can do this to store the native MutationObserver:
* window.__rrMutationObserver = MutationObserver
*/
(window as WindowWithStoredMutationObserver).__rrMutationObserver;
const angularZoneSymbol = (window as WindowWithAngularZone)?.Zone?.__symbol__?.( const angularZoneSymbol = (window as WindowWithAngularZone)?.Zone?.__symbol__?.(
'MutationObserver', 'MutationObserver',
); );

View File

@@ -2749,10 +2749,10 @@ rollup@^2.3.3:
optionalDependencies: optionalDependencies:
fsevents "~2.1.2" fsevents "~2.1.2"
rrweb-snapshot@^1.0.1: rrweb-snapshot@^1.0.4:
version "1.0.2" version "1.0.4"
resolved "https://registry.npmjs.org/rrweb-snapshot/-/rrweb-snapshot-1.0.2.tgz#0338c9e00e24e86f8efb56cbdb293def7287f53c" resolved "https://registry.yarnpkg.com/rrweb-snapshot/-/rrweb-snapshot-1.0.4.tgz#608acf0f066e4f72213109ee6bfe25d291e7eb0b"
integrity sha512-QtWwK9fqNLn1wn7nupyy/BcTnMfl8rrtG6uQ0pC3xeXskVQ9GXuh/ulEpuzyVIVPszF/AvT4DjfWmwC5K6xusA== integrity sha512-I9oeK+LPeFE8N8MT011gBLEb+3VjnU3TJNHphzqDu5XJLna8bvMx9tkTiyD9MOlVCX80Le/MwSBxoJMpCX9uQA==
run-async@^2.2.0: run-async@^2.2.0:
version "2.4.1" version "2.4.1"