(poly)
| 143 | |
| 144 | /*! (c) Andrea Giammarchi */ |
| 145 | function disconnected(poly) { |
| 146 | |
| 147 | var Event = poly.Event; |
| 148 | var WeakSet = poly.WeakSet; |
| 149 | var notObserving = true; |
| 150 | var observer = null; |
| 151 | return function observe(node) { |
| 152 | if (notObserving) { |
| 153 | notObserving = !notObserving; |
| 154 | observer = new WeakSet(); |
| 155 | startObserving(node.ownerDocument); |
| 156 | } |
| 157 | |
| 158 | observer.add(node); |
| 159 | return node; |
| 160 | }; |
| 161 | |
| 162 | function startObserving(document) { |
| 163 | var connected = new WeakSet(); |
| 164 | var disconnected = new WeakSet(); |
| 165 | |
| 166 | try { |
| 167 | new MutationObserver(changes).observe(document, { |
| 168 | subtree: true, |
| 169 | childList: true |
| 170 | }); |
| 171 | } catch (o_O) { |
| 172 | var timer = 0; |
| 173 | var records = []; |
| 174 | |
| 175 | var reschedule = function reschedule(record) { |
| 176 | records.push(record); |
| 177 | clearTimeout(timer); |
| 178 | timer = setTimeout(function () { |
| 179 | changes(records.splice(timer = 0, records.length)); |
| 180 | }, 0); |
| 181 | }; |
| 182 | |
| 183 | document.addEventListener('DOMNodeRemoved', function (event) { |
| 184 | reschedule({ |
| 185 | addedNodes: [], |
| 186 | removedNodes: [event.target] |
| 187 | }); |
| 188 | }, true); |
| 189 | document.addEventListener('DOMNodeInserted', function (event) { |
| 190 | reschedule({ |
| 191 | addedNodes: [event.target], |
| 192 | removedNodes: [] |
| 193 | }); |
| 194 | }, true); |
| 195 | } |
| 196 | |
| 197 | function changes(records) { |
| 198 | for (var record, length = records.length, i = 0; i < length; i++) { |
| 199 | record = records[i]; |
| 200 | dispatchAll(record.removedNodes, 'disconnected', disconnected, connected); |
| 201 | dispatchAll(record.addedNodes, 'connected', connected, disconnected); |
| 202 | } |
no test coverage detected