Skip to content

Commit

Permalink
[fizz][external-runtime] Fix: process mutation records before disconn…
Browse files Browse the repository at this point in the history
…ecting (#26169)

> All notifications of mutations that have already been detected, but
not yet reported to the observer, are discarded. To hold on to and
handle the detected but unreported mutations, use the takeRecords()
method.
>    -- ([Mozilla docs for disconnect](

https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver/disconnect))

Fizz external runtime needs to process mutation records (representing
potential Fizz instructions) before calling `disconnect()`. We currently
do not do this (and might drop some instructions).
  • Loading branch information
mofeiZ committed Feb 21, 2023
1 parent c7967b1 commit 70b0bbd
Showing 1 changed file with 7 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ if (document.readyState === 'loading') {
installFizzInstrObserver(document.body);
}
handleExistingNodes();
// We can call disconnect without takeRecord here,
// since we only expect a single document.body
domBodyObserver.disconnect();
}
});
Expand All @@ -54,7 +56,7 @@ function handleExistingNodes() {
}

function installFizzInstrObserver(target /*: Node */) {
const fizzInstrObserver = new MutationObserver(mutations => {
const handleMutations = (mutations /*: Array<MutationRecord> */) => {
for (let i = 0; i < mutations.length; i++) {
const addedNodes = mutations[i].addedNodes;
for (let j = 0; j < addedNodes.length; j++) {
Expand All @@ -63,13 +65,16 @@ function installFizzInstrObserver(target /*: Node */) {
}
}
}
});
};

const fizzInstrObserver = new MutationObserver(handleMutations);
// We assume that instruction data nodes are eventually appended to the
// body, even if Fizz is streaming to a shell / subtree.
fizzInstrObserver.observe(target, {
childList: true,
});
window.addEventListener('DOMContentLoaded', () => {
handleMutations(fizzInstrObserver.takeRecords());
fizzInstrObserver.disconnect();
});
}
Expand Down

0 comments on commit 70b0bbd

Please sign in to comment.