fix #469 try to get original MutationObserver

We found Angular's zone module will patch MutationObserver which
make the browser hang in some scenarios.
Reference: angular/angular#26948
This commit is contained in:
Yanzhen Yu
2021-01-22 12:50:54 +08:00
parent d518c08ad2
commit 13f1a61743

View File

@@ -44,6 +44,12 @@ import {
import MutationBuffer from './mutation'; import MutationBuffer from './mutation';
import { stringify } from './stringify'; import { stringify } from './stringify';
type WindowWithAngularZone = Window & {
Zone?: {
__symbol__?: (key: string) => string;
};
};
export const mutationBuffer = new MutationBuffer(); export const mutationBuffer = new MutationBuffer();
function initMutationObserver( function initMutationObserver(
@@ -65,7 +71,22 @@ function initMutationObserver(
recordCanvas, recordCanvas,
slimDOMOptions, slimDOMOptions,
); );
const observer = new MutationObserver( let mutationBufferCtor = window.MutationObserver;
const angularZoneSymbol = (window as WindowWithAngularZone)?.Zone?.__symbol__?.(
'MutationObserver',
);
if (
angularZoneSymbol &&
((window as unknown) as Record<string, typeof MutationObserver>)[
angularZoneSymbol
]
) {
mutationBufferCtor = ((window as unknown) as Record<
string,
typeof MutationObserver
>)[angularZoneSymbol];
}
const observer = new mutationBufferCtor(
mutationBuffer.processMutations.bind(mutationBuffer), mutationBuffer.processMutations.bind(mutationBuffer),
); );
observer.observe(document, { observer.observe(document, {