Index: src/object-observe.js |
diff --git a/src/object-observe.js b/src/object-observe.js |
index f5e0d9d563a08e0507d01b03cc519370e49d0215..f722df2276d2101d0b76166e9a7f9faea573f307 100644 |
--- a/src/object-observe.js |
+++ b/src/object-observe.js |
@@ -275,15 +275,25 @@ function EnqueueToCallback(callback, changeRecord) { |
%SetObserverDeliveryPending(); |
} |
-function EnqueueChangeRecord(changeRecord, observers) { |
+function EnqueueChangeRecord(changeRecord, observers, skipAccessCheck) { |
// TODO(rossberg): adjust once there is a story for symbols vs proxies. |
if (IS_SYMBOL(changeRecord.name)) return; |
+ var object = changeRecord.object; |
+ var needsAccessCheck = !skipAccessCheck && %IsAccessCheckNeeded(object); |
for (var i = 0; i < observers.length; i++) { |
var observer = observers[i]; |
if (IS_UNDEFINED(observer.accept[changeRecord.type])) |
continue; |
+ if (needsAccessCheck && |
+ // Drop all splice records on the floor for access-checked objects |
+ (changeRecord.type == 'splice' || |
+ !%GetAccessAllowedForObserver( |
+ observer.callback, object, changeRecord.name))) { |
+ continue; |
+ } |
+ |
EnqueueToCallback(observer.callback, changeRecord); |
} |
} |
@@ -354,7 +364,8 @@ function ObjectNotifierNotify(changeRecord) { |
} |
ObjectFreeze(newRecord); |
- EnqueueChangeRecord(newRecord, objectInfo.changeObservers); |
+ EnqueueChangeRecord(newRecord, objectInfo.changeObservers, |
+ true /* skip access check */); |
} |
function ObjectNotifierPerformChange(changeType, changeFn, receiver) { |