Chromium Code Reviews| Index: src/object-observe.js |
| diff --git a/src/object-observe.js b/src/object-observe.js |
| index c4c6c14a3ada5c740bdd19623bc3f949dabf359b..d82370f20d2f01c0ac16d1a013d126cd75fd7311 100644 |
| --- a/src/object-observe.js |
| +++ b/src/object-observe.js |
| @@ -166,7 +166,7 @@ function EndPerformChange(objectInfo, type) { |
| objectInfo); |
| } |
| -function ensureObserverRemoved(objectInfo, callback) { |
| +function EnsureObserverRemoved(objectInfo, callback) { |
| function remove(observerList) { |
| for (var i = 0; i < observerList.length; i++) { |
| if (observerList[i].callback === callback) { |
| @@ -219,7 +219,7 @@ function ObjectObserve(object, callback, accept) { |
| if (IS_UNDEFINED(objectInfo)) objectInfo = CreateObjectInfo(object); |
| %SetIsObserved(object, true); |
| - ensureObserverRemoved(objectInfo, callback); |
| + EnsureObserverRemoved(objectInfo, callback); |
| var observer = CreateObserver(callback, accept); |
| if (ObserverIsActive(observer, objectInfo)) |
| @@ -240,7 +240,7 @@ function ObjectUnobserve(object, callback) { |
| if (IS_UNDEFINED(objectInfo)) |
| return object; |
| - ensureObserverRemoved(objectInfo, callback); |
| + EnsureObserverRemoved(objectInfo, callback); |
| if (objectInfo.changeObservers.length === 0 && |
| objectInfo.inactiveObservers.length === 0) { |
| @@ -250,6 +250,17 @@ function ObjectUnobserve(object, callback) { |
| return object; |
| } |
| +function ArrayObserve(object, callback) { |
| + return ObjectObserve(object, callback, ['new', |
| + 'updated', |
| + 'deleted', |
| + 'splice']); |
| +} |
| + |
| +function ArrayUnobserve(object, callback) { |
| + return ObjectUnobserve(object, callback); |
| +} |
| + |
| function EnqueueChangeRecord(changeRecord, observers) { |
| // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
| if (IS_SYMBOL(changeRecord.name)) return; |
| @@ -271,6 +282,38 @@ function EnqueueChangeRecord(changeRecord, observers) { |
| } |
| } |
| +function BeginPerformSplice(array) { |
| + var objectInfo = objectInfoMap.get(array); |
| + if (!IS_UNDEFINED(objectInfo)) |
| + BeginPerformChange(objectInfo, 'splice'); |
| +} |
| + |
| +function EndPerformSplice(array) { |
| + var objectInfo = objectInfoMap.get(array); |
| + if (!IS_UNDEFINED(objectInfo)) |
| + EndPerformChange(objectInfo, 'splice'); |
| +} |
| + |
| +function EnqueueSpliceRecord(array, index, removed, deleteCount, addedCount) { |
| + var objectInfo = objectInfoMap.get(array); |
| + if (IS_UNDEFINED(objectInfo) || objectInfo.changeObservers.length === 0) |
| + return; |
| + |
| + var changeRecord = { |
| + type: 'splice', |
| + object: array, |
| + index: index, |
| + removed: removed, |
|
adamk
2013/05/16 00:45:30
Spec question: are we OK with the 'removed' array
rafaelw
2013/05/16 01:10:48
I think the answer is probably yes. Arv?
The free
|
| + addedCount: addedCount |
| + }; |
| + |
| + changeRecord.removed.length = deleteCount; |
| + // TODO(rafaelw): This breaks spec-compliance. Re-enable when freezing isn't |
| + // slow. |
| + // ObjectFreeze(changeRecord); |
| + EnqueueChangeRecord(changeRecord, objectInfo.changeObservers); |
| +} |
| + |
| function NotifyChange(type, object, name, oldValue) { |
| var objectInfo = objectInfoMap.get(object); |
| if (objectInfo.changeObservers.length === 0) |
| @@ -405,6 +448,10 @@ function SetupObjectObserve() { |
| "observe", ObjectObserve, |
| "unobserve", ObjectUnobserve |
| )); |
| + InstallFunctions($Array, DONT_ENUM, $Array( |
| + "observe", ArrayObserve, |
| + "unobserve", ArrayUnobserve |
| + )); |
| InstallFunctions(notifierPrototype, DONT_ENUM, $Array( |
| "notify", ObjectNotifierNotify, |
| "performChange", ObjectNotifierPerformChange |