| Index: third_party/polymer/v0_8/components-chromium/polymer/src/lib/array-observe-extracted.js
|
| diff --git a/third_party/polymer/v0_8/components-chromium/polymer/src/lib/array-observe-extracted.js b/third_party/polymer/v0_8/components-chromium/polymer/src/lib/array-observe-extracted.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e89ce32024c6ed130772ff778ad7fbded337b26c
|
| --- /dev/null
|
| +++ b/third_party/polymer/v0_8/components-chromium/polymer/src/lib/array-observe-extracted.js
|
| @@ -0,0 +1,106 @@
|
| +
|
| +
|
| +(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
|
| + };
|
| +
|
| +})();
|
| +
|
|
|