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
2026-04-01 12:00:00 +08:00
parent a8ad8d1c58
commit faa2ec79fa

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, {