Chromium Code Reviews| 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..49822d251540e697f3a356b4417aad143465b6c0 100644 |
| --- a/test/mjsunit/harmony/object-observe.js |
| +++ b/test/mjsunit/harmony/object-observe.js |
| @@ -975,16 +975,26 @@ 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, do not update it, but create an |
| + // own property with the descriptor that [[Put]] mandates |
| + // for a new property (ES-5.1, 8.12.5.6) |
| + // |
| + // (Q: do this unconditionally?) |
| + if (Object.getPrototypeOf(obj) && (prop in Object.getPrototypeOf(obj))) |
|
rossberg
2014/01/09 12:26:39
Only do this fall-back when really necessary, i.e.
sof
2014/01/09 14:04:51
Done, I think (but it feels counterintuitive to "r
|
| + Object.defineProperty(obj, prop, {value: 4, writable: true, enumerable: true, configurable: true}); |
|
rossberg
2014/01/09 12:26:39
Nit: line length
|
| + else |
| + obj[prop] = 4; |
| obj[prop] = 4; // ignored |
| obj[prop] = 5; |
| Object.defineProperty(obj, prop, {value: 6}); |
| @@ -1014,34 +1024,40 @@ 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 }, |
| - { object: obj, name: prop, type: "add" }, |
| - { object: obj, name: prop, type: "update", oldValue: 4 }, |
| - { object: obj, name: prop, type: "update", oldValue: 5 }, |
| - { object: obj, name: prop, type: "reconfigure" }, |
| - { object: obj, name: prop, type: "update", oldValue: 6 }, |
| - { object: obj, name: prop, type: "reconfigure", oldValue: 8 }, |
| - { object: obj, name: prop, type: "reconfigure", oldValue: 7 }, |
| - { object: obj, name: prop, type: "reconfigure" }, |
| - { object: obj, name: prop, type: "reconfigure" }, |
| - { object: obj, name: prop, type: "reconfigure" }, |
| - { object: obj, name: prop, type: "reconfigure" }, |
| - { object: obj, name: prop, type: "reconfigure" }, |
| - { object: obj, name: prop, type: "delete" }, |
| - { object: obj, name: prop, type: "add" }, |
| - { object: obj, name: prop, type: "delete" }, |
| - { object: obj, name: prop, type: "add" }, |
| - { object: obj, name: prop, type: "reconfigure" }, |
| - { object: obj, name: prop, type: "update", oldValue: 9 }, |
| - { object: obj, name: prop, type: "update", oldValue: 10 }, |
| - { object: obj, name: prop, type: "update", oldValue: 11 }, |
| - { object: obj, name: prop, type: "update", oldValue: 12 }, |
| - { object: obj, name: prop, type: "delete", oldValue: 36 }, |
| - { object: obj, name: prop, type: "add" }, |
| - ]); |
| + |
| + 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 }, |
| + { object: obj, name: prop, type: "reconfigure" }, |
| + { object: obj, name: prop, type: "update", oldValue: 6 }, |
| + { object: obj, name: prop, type: "reconfigure", oldValue: 8 }, |
| + { object: obj, name: prop, type: "reconfigure", oldValue: 7 }, |
| + { object: obj, name: prop, type: "reconfigure" }, |
| + { object: obj, name: prop, type: "reconfigure" }, |
| + { object: obj, name: prop, type: "reconfigure" }, |
| + { object: obj, name: prop, type: "reconfigure" }, |
| + { object: obj, name: prop, type: "reconfigure" }, |
| + { object: obj, name: prop, type: "delete" }, |
| + { object: obj, name: prop, type: "add" }, |
| + { object: obj, name: prop, type: "delete" }, |
| + { object: obj, name: prop, type: "add" }, |
| + { object: obj, name: prop, type: "reconfigure" }, |
| + { object: obj, name: prop, type: "update", oldValue: 9 }, |
| + { object: obj, name: prop, type: "update", oldValue: 10 }, |
| + { object: obj, name: prop, type: "update", oldValue: 11 }, |
| + { 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 +1159,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); |
| } |