Chromium Code Reviews| Index: src/object-observe.js |
| diff --git a/src/object-observe.js b/src/object-observe.js |
| index bd621d85e41421f17c2abf581c5b921eab6ab3a2..b93275a834568b90a8153f89830be91b6e272c07 100644 |
| --- a/src/object-observe.js |
| +++ b/src/object-observe.js |
| @@ -34,6 +34,8 @@ var observationState = %GetObservationState(); |
| if (IS_UNDEFINED(observationState.observerInfoMap)) { |
| observationState.observerInfoMap = %CreateObjectHashTable(); |
| observationState.objectInfoMap = %CreateObjectHashTable(); |
| + observationState.activeObservers = new InternalArray; |
| + observationState.observerPriority = 0; |
| } |
| function InternalObjectHashTable(table) { |
| @@ -65,9 +67,9 @@ function ObjectObserve(object, callback) { |
| throw MakeTypeError("observe_callback_frozen"); |
| if (!observerInfoMap.has(callback)) { |
| - // TODO: setup observerInfo.priority. |
| observerInfoMap.set(callback, { |
| - pendingChangeRecords: null |
| + pendingChangeRecords: null, |
| + priority: observationState.observerPriority++, |
| }); |
| } |
| @@ -109,11 +111,11 @@ function EnqueueChangeRecord(changeRecord, observers) { |
| for (var i = 0; i < observers.length; i++) { |
| var observer = observers[i]; |
| var observerInfo = observerInfoMap.get(observer); |
| - |
| - // TODO: "activate" the observer |
| - |
| - if (IS_NULL(observerInfo.pendingChangeRecords)) { |
| - observerInfo.pendingChangeRecords = new InternalArray(changeRecord); |
| + observationState.activeObservers[observerInfo.priority] = observer; |
| + %SetHasActiveObjectObservers(); |
| + var pendingChangeRecords = observerInfo.pendingChangeRecords; |
|
rossberg
2012/11/06 16:45:57
What is this variable used for?
adamk
2012/11/06 17:00:09
Good question...removed.
|
| + if (IS_NULL(pendingChangeRecords)) { |
| + pendingChangeRecords = observerInfo.pendingChangeRecords = new InternalArray(changeRecord); |
|
rossberg
2012/11/06 16:45:57
Line length
adamk
2012/11/06 17:00:09
Done.
|
| } else { |
| observerInfo.pendingChangeRecords.push(changeRecord); |
| } |
| @@ -151,11 +153,8 @@ function ObjectNotify(object, changeRecord) { |
| EnqueueChangeRecord(newRecord, objectInfo.changeObservers); |
| } |
| -function ObjectDeliverChangeRecords(callback) { |
| - if (!IS_SPEC_FUNCTION(callback)) |
| - throw MakeTypeError("observe_non_function", ["deliverChangeRecords"]); |
| - |
| - var observerInfo = observerInfoMap.get(callback); |
| +function DeliverChangeRecordsForObserver(observer) { |
| + var observerInfo = observerInfoMap.get(observer); |
| if (IS_UNDEFINED(observerInfo)) |
| return; |
| @@ -167,10 +166,27 @@ function ObjectDeliverChangeRecords(callback) { |
| var delivered = []; |
| %MoveArrayContents(pendingChangeRecords, delivered); |
| try { |
| - %Call(void 0, delivered, callback); |
| + %Call(void 0, delivered, observer); |
| } catch (ex) {} |
| } |
| +function ObjectDeliverChangeRecords(callback) { |
| + if (!IS_SPEC_FUNCTION(callback)) |
| + throw MakeTypeError("observe_non_function", ["deliverChangeRecords"]); |
| + |
| + DeliverChangeRecordsForObserver(callback); |
| +} |
| + |
| +function DeliverChangeRecords() { |
| + while (observationState.activeObservers.length) { |
| + var activeObservers = observationState.activeObservers; |
| + observationState.activeObservers = new InternalArray; |
| + for (var i in activeObservers) { |
| + DeliverChangeRecordsForObserver(activeObservers[i]); |
| + } |
| + } |
| +} |
| + |
| function SetupObjectObserve() { |
| %CheckIsBootstrapping(); |
| InstallFunctions($Object, DONT_ENUM, $Array( |