Index: pkg/web_components/lib/platform.concat.js |
diff --git a/pkg/web_components/lib/platform.concat.js b/pkg/web_components/lib/platform.concat.js |
index c78254b965db32c4aeb1b5d63c2925d52f559cb2..dccbcc9246c1c8a4aaf3786ca2ea16b3a480bba5 100644 |
--- a/pkg/web_components/lib/platform.concat.js |
+++ b/pkg/web_components/lib/platform.concat.js |
@@ -2317,13 +2317,7 @@ window.ShadowDOMPolyfill = {}; |
var globalMutationObservers = []; |
var isScheduled = false; |
- function scheduleCallback(observer) { |
- if (observer.scheduled_) |
- return; |
- |
- observer.scheduled_ = true; |
- globalMutationObservers.push(observer); |
- |
+ function scheduleCallback() { |
if (isScheduled) |
return; |
setEndOfMicrotask(notifyObservers); |
@@ -2343,7 +2337,6 @@ window.ShadowDOMPolyfill = {}; |
for (var i = 0; i < notifyList.length; i++) { |
var mo = notifyList[i]; |
- mo.scheduled_ = false; |
var queue = mo.takeRecords(); |
removeTransientObserversFor(mo); |
if (queue.length) { |
@@ -2459,6 +2452,8 @@ window.ShadowDOMPolyfill = {}; |
} |
} |
+ var anyObserversEnqueued = false; |
+ |
// 4. |
for (var uid in interestedObservers) { |
var observer = interestedObservers[uid]; |
@@ -2491,9 +2486,15 @@ window.ShadowDOMPolyfill = {}; |
record.oldValue = associatedStrings[uid]; |
// 8. |
- scheduleCallback(observer); |
+ if (!observer.records_.length) { |
+ globalMutationObservers.push(observer); |
+ anyObserversEnqueued = true; |
+ } |
observer.records_.push(record); |
} |
+ |
+ if (anyObserversEnqueued) |
+ scheduleCallback(); |
} |
var slice = Array.prototype.slice; |
@@ -2556,7 +2557,6 @@ window.ShadowDOMPolyfill = {}; |
this.nodes_ = []; |
this.records_ = []; |
this.uid_ = ++uidCounter; |
- this.scheduled_ = false; |
} |
MutationObserver.prototype = { |
@@ -2642,10 +2642,6 @@ window.ShadowDOMPolyfill = {}; |
if (node === this.target) |
return; |
- // Make sure we remove transient observers at the end of microtask, even |
- // if we didn't get any change records. |
- scheduleCallback(this.observer); |
- |
this.transientObservedNodes.push(node); |
var registrations = registrationsTable.get(node); |
if (!registrations) |
@@ -11377,7 +11373,10 @@ function watchShadow(node) { |
} |
function watchRoot(root) { |
- observe(root); |
+ if (!root.__watched) { |
+ observe(root); |
+ root.__watched = true; |
+ } |
} |
function handler(mutations) { |
@@ -11422,32 +11421,18 @@ function handler(mutations) { |
logFlags.dom && console.groupEnd(); |
}; |
-function takeRecords(node) { |
- // If the optional node is not supplied, assume we mean the whole document. |
- if (node === undefined) node = document; |
- |
- // Find the root of the tree, which will be an Document or ShadowRoot. |
- while (node.parentNode) { |
- node = node.parentNode; |
- } |
+var observer = new MutationObserver(handler); |
- var observer = node.__observer; |
- if (observer) { |
- handler(observer.takeRecords()); |
- takeMutations(); |
- } |
+function takeRecords() { |
+ // TODO(sjmiles): ask Raf why we have to call handler ourselves |
+ handler(observer.takeRecords()); |
+ takeMutations(); |
} |
var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach); |
function observe(inRoot) { |
- if (inRoot.__observer) return; |
- |
- // For each ShadowRoot, we create a new MutationObserver, so the root can be |
- // garbage collected once all references to the `inRoot` node are gone. |
- var observer = new MutationObserver(handler); |
observer.observe(inRoot, {childList: true, subtree: true}); |
- inRoot.__observer = observer; |
} |
function observeDocument(doc) { |