- From: Claudia Meadows <notifications@github.com>
- Date: Tue, 29 Apr 2025 12:22:06 -0700
- To: whatwg/dom <dom@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/dom/issues/533/2839983366@github.com>
dead-claudia left a comment (whatwg/dom#533)
> Why would we need a separate observer for connectedness? It seems to fit right in the scope of `MutationObserver`.
Simply doing `.observe(document.documentElement, {childList: true, subtree: true})` and similar for shadow roots is sufficient for detecting connectedness changes. And that paired with a weak map would even let you put together your own unsubscribe mechanism.
This code implements liveness observers for all but children of declarative shadow roots:
```js
let observeShadow
const observers = new Set()
const registry = new FinalizationRegistry(held => {
observers.delete(held)
})
const oldAttachShadow = Element.prototype.attachShadow
Object.defineProperty(Element.prototype, "attachShadow", {
value() {
const root = oldAttachShadow.apply(this, arguments)
for (const weak of observers) {
const observer = weak.get()
if (observer) observeShadow(observer, root)
}
return root
},
})
class LivenessObserver {
#callback
#observed = new WeakSet()
#observer = new MutationObserver(records => {
this.#check(records)
})
static {
observeShadow = (observer, root) => {
observer.#observer.observe(root, {
childList: true,
subtree: true,
})
}
}
constructor(callback) {
this.#callback = callback
observeShadow(this.#observer, document.documentElement)
const weak = new WeakRef(this)
observers.add(weak)
registry.register(this, weak)
}
#check(records) {
for (const r of records) {
for (const n of r.removedNodes) {
if (!this.#observed.has(n)) continue
try {
this.#callback.removed?.(n)
} catch (e) {
reportError(e)
}
}
for (const n of r.addedNodes) {
if (!this.#observed.has(n)) continue
try {
this.#callback.added?.(n)
} catch (e) {
reportError(e)
}
}
}
}
observe(node) {
this.#observed.add(node)
}
disconnect() {
this.#observed.clear()
}
}
```
Will note that this is probably not as fast as it could be.
--
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/dom/issues/533#issuecomment-2839983366
You are receiving this because you are subscribed to this thread.
Message ID: <whatwg/dom/issues/533/2839983366@github.com>
Received on Tuesday, 29 April 2025 19:22:11 UTC