| Index: test/mjsunit/harmony/object-observe.js
|
| diff --git a/test/mjsunit/harmony/object-observe.js b/test/mjsunit/harmony/object-observe.js
|
| index 72a9cadbf8ecb9df05a37593055e58e3c44f7efc..02244fb1234f0f65d1a7affd93b1fe63a43021f0 100644
|
| --- a/test/mjsunit/harmony/object-observe.js
|
| +++ b/test/mjsunit/harmony/object-observe.js
|
| @@ -975,16 +975,40 @@ observer.assertNotCalled();
|
|
|
|
|
| // Test all kinds of objects generically.
|
| -function TestObserveConfigurable(obj, prop) {
|
| +function TestObserveConfigurable(obj, prop, is_writable) {
|
| reset();
|
| + var valueWhenDeleted = is_writable ? 3 : obj[prop];
|
| Object.observe(obj, observer.callback);
|
| Object.unobserve(obj, observer.callback);
|
| obj[prop] = 1;
|
| Object.observe(obj, observer.callback);
|
| obj[prop] = 2;
|
| - obj[prop] = 3;
|
| + obj[prop] = valueWhenDeleted;
|
| delete obj[prop];
|
| - obj[prop] = 4;
|
| + // If the deleted obj[prop] exposed another 'prop' along the
|
| + // prototype chain, only update it if it doesn't have an
|
| + // (inheritable) accessor or it is a read-only data property. If
|
| + // either of those is true, then instead create an own property with
|
| + // the descriptor that [[Put]] mandates for a new property (ES-5.1,
|
| + // 8.12.5.6)
|
| + var createOwnProperty = false;
|
| + for (var o = Object.getPrototypeOf(obj); o; o = Object.getPrototypeOf(o)) {
|
| + var desc = Object.getOwnPropertyDescriptor(o, prop);
|
| + if (desc) {
|
| + if (!desc.writable)
|
| + createOwnProperty = true;
|
| + break;
|
| + }
|
| + }
|
| + if (createOwnProperty)
|
| + Object.defineProperty(obj, prop, {
|
| + value: 4,
|
| + writable: true,
|
| + enumerable: true,
|
| + configurable: true
|
| + });
|
| + else
|
| + obj[prop] = 4;
|
| obj[prop] = 4; // ignored
|
| obj[prop] = 5;
|
| Object.defineProperty(obj, prop, {value: 6});
|
| @@ -1014,10 +1038,9 @@ function TestObserveConfigurable(obj, prop) {
|
| delete obj[prop];
|
| Object.defineProperty(obj, prop, {value: 11, configurable: true});
|
| Object.deliverChangeRecords(observer.callback);
|
| - observer.assertCallbackRecords([
|
| - { object: obj, name: prop, type: "update", oldValue: 1 },
|
| - { object: obj, name: prop, type: "update", oldValue: 2 },
|
| - { object: obj, name: prop, type: "delete", oldValue: 3 },
|
| +
|
| + var expected = [
|
| + { object: obj, name: prop, type: "delete", oldValue: valueWhenDeleted },
|
| { object: obj, name: prop, type: "add" },
|
| { object: obj, name: prop, type: "update", oldValue: 4 },
|
| { object: obj, name: prop, type: "update", oldValue: 5 },
|
| @@ -1041,7 +1064,15 @@ function TestObserveConfigurable(obj, prop) {
|
| { object: obj, name: prop, type: "update", oldValue: 12 },
|
| { object: obj, name: prop, type: "delete", oldValue: 36 },
|
| { object: obj, name: prop, type: "add" },
|
| - ]);
|
| + ];
|
| +
|
| + if (is_writable) {
|
| + expected.unshift(
|
| + { object: obj, name: prop, type: "update", oldValue: 1 },
|
| + { object: obj, name: prop, type: "update", oldValue: 2 });
|
| + }
|
| +
|
| + observer.assertCallbackRecords(expected);
|
| Object.unobserve(obj, observer.callback);
|
| delete obj[prop];
|
| }
|
| @@ -1143,7 +1174,7 @@ for (var i in objects) for (var j in properties) {
|
| var desc = Object.getOwnPropertyDescriptor(obj, prop);
|
| print("***", typeof obj, stringifyNoThrow(obj), prop);
|
| if (!desc || desc.configurable)
|
| - TestObserveConfigurable(obj, prop);
|
| + TestObserveConfigurable(obj, prop, !desc || desc.writable);
|
| else if (desc.writable)
|
| TestObserveNonConfigurable(obj, prop, desc);
|
| }
|
|
|