Index: third_party/polymer/v0_8/components/polymer/src/lib/array-observe.html |
diff --git a/third_party/polymer/v0_8/components/polymer/src/lib/array-observe.html b/third_party/polymer/v0_8/components/polymer/src/lib/array-observe.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..998f59fc16a52b10db30cf5aef849529922e6629 |
--- /dev/null |
+++ b/third_party/polymer/v0_8/components/polymer/src/lib/array-observe.html |
@@ -0,0 +1,118 @@ |
+<!-- |
+@license |
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved. |
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt |
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt |
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt |
+Code distributed by Google as part of the polymer project is also |
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt |
+--> |
+<link rel="import" href="debounce.html"> |
+ |
+<script> |
+ |
+(function() { |
+ |
+ var callbacks = new WeakMap(); |
+ |
+ function observe(array, cb) { |
+ if (Array.observe) { |
+ var ncb = function(changes) { |
+ changes = changes.filter(function(o) { return o.type == 'splice'; }); |
+ if (changes.length) { |
+ cb(changes); |
+ } |
+ }; |
+ callbacks.set(cb, ncb); |
+ Array.observe(array, ncb); |
+ } else { |
+ if (!array.__polymerObservable) { |
+ makeObservable(array); |
+ } |
+ callbacks.get(array).push(cb); |
+ } |
+ } |
+ |
+ function unobserve(array, cb) { |
+ if (Array.observe) { |
+ var ncb = callbacks.get(cb); |
+ callbacks.delete(cb); |
+ Array.unobserve(array, ncb); |
+ } else { |
+ var cbs = callbacks.get(array); |
+ var idx = cbs.indexOf(cb); |
+ if (idx >= 0) { |
+ cbs.splice(idx, 1); |
+ } |
+ } |
+ } |
+ |
+ function makeObservable(array) { |
+ var splices = []; |
+ var debounce; |
+ var orig = { |
+ push: array.push, |
+ pop: array.pop, |
+ splice: array.splice, |
+ shift: array.shift, |
+ unshift: array.unshift, |
+ sort: array.sort |
+ }; |
+ var addSplice = function(index, added, removed) { |
+ splices.push({ |
+ index: index, |
+ addedCount: added, |
+ removed: removed, |
+ object: array, |
+ type: 'splice' |
+ }); |
+ }; |
+ callbacks.set(array, []); |
+ array.push = function() { |
+ debounce = Polymer.Debounce(debounce, fin); |
+ addSplice(array.length, 1, []); |
+ return orig.push.apply(this, arguments); |
+ }; |
+ array.pop = function() { |
+ debounce = Polymer.Debounce(debounce, fin); |
+ addSplice(array.length - 1, 0, array.slice(-1)); |
+ return orig.pop.apply(this, arguments); |
+ }; |
+ array.splice = function(start, deleteCount) { |
+ debounce = Polymer.Debounce(debounce, fin); |
+ addSplice(start, arguments.length - 2, array.slice(start, start + deleteCount)); |
+ return orig.splice.apply(this, arguments); |
+ }; |
+ array.shift = function() { |
+ debounce = Polymer.Debounce(debounce, fin); |
+ addSplice(0, 0, [array[0]]); |
+ return orig.shift.apply(this, arguments); |
+ }; |
+ array.unshift = function() { |
+ debounce = Polymer.Debounce(debounce, fin); |
+ addSplice(0, 1, []); |
+ return orig.unshift.apply(this, arguments); |
+ }; |
+ array.sort = function() { |
+ debounce = Polymer.Debounce(debounce, fin); |
+ console.warn('[ArrayObserve]: sort not observable'); |
+ return orig.sort.apply(this, arguments); |
+ }; |
+ var fin = function() { |
+ var cbs = callbacks.get(array); |
+ for (var i=0; i<cbs.length; i++) { |
+ cbs[i](splices); |
+ } |
+ splices = []; |
+ }; |
+ array.__polymerObservable = true; |
+ } |
+ |
+ Polymer.ArrayObserve = { |
+ observe: observe, |
+ unobserve: unobserve |
+ }; |
+ |
+})(); |
+ |
+</script> |