aboutsummaryrefslogtreecommitdiffstats
path: root/src/shared/observe-dom.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/observe-dom.ts')
-rw-r--r--src/shared/observe-dom.ts27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/shared/observe-dom.ts b/src/shared/observe-dom.ts
index e82ce1e..ee6a51f 100644
--- a/src/shared/observe-dom.ts
+++ b/src/shared/observe-dom.ts
@@ -1,17 +1,20 @@
type ObserveDOMCallback = () => boolean;
-let callbacks: (ObserveDOMCallback | null)[] = [];
-let callbacksCalledCount = 0;
+const callbacks: ObserveDOMCallback[] = [];
+/**
+ * Starts a MutationObserver on the document that invokes each
+ * registered callback. A callback should return `true` when it
+ * has completed its work; once all callbacks are done the observer
+ * disconnects.
+ */
const observer = new MutationObserver(() => {
for (let i = 0; i < callbacks.length; i++) {
const callback = callbacks[i];
- if (callback && callback()) {
- callbacksCalledCount++;
- callbacks[i] = null;
- }
+ if (callback())
+ callbacks.splice(i, 1);
- if (callbacksCalledCount >= callbacks.length) {
+ if (callbacks.length <= 0) {
observer.disconnect();
break;
@@ -24,6 +27,14 @@ observer.observe(document, {
subtree: true
});
-export function observeDOM(callback: ObserveDOMCallback) {
+/**
+ * Registers a callback to run on DOM mutations.
+ * The callback is invoked on each mutation tick and should return `true`
+ * when its work is finished. When all callbacks have completed the
+ * observer stops.
+ *
+ * @param callback - Function that returns `true` when done.
+ */
+export function observeDOM(callback: ObserveDOMCallback): void {
callbacks.push(callback);
};