| Index: test/mjsunit/harmony/object-observe.js
|
| diff --git a/test/mjsunit/harmony/object-observe.js b/test/mjsunit/harmony/object-observe.js
|
| index e2df0ee57ecb9d4ebf7f1d9f1ec6d4cd7829b9df..04dfb967b3b477bdbd737d2e3a644c8c6aeffcad 100644
|
| --- a/test/mjsunit/harmony/object-observe.js
|
| +++ b/test/mjsunit/harmony/object-observe.js
|
| @@ -455,7 +455,7 @@ function TestObserveConfigurable(obj, prop) {
|
| delete obj[prop];
|
| }
|
|
|
| -function TestObserveNonConfigurable(obj, prop) {
|
| +function TestObserveNonConfigurable(obj, prop, desc) {
|
| reset();
|
| obj[prop] = 1;
|
| Object.observe(obj, observer.callback);
|
| @@ -465,10 +465,10 @@ function TestObserveNonConfigurable(obj, prop) {
|
| Object.defineProperty(obj, prop, {value: 6});
|
| Object.defineProperty(obj, prop, {value: 6}); // ignored
|
| Object.defineProperty(obj, prop, {value: 7});
|
| - Object.defineProperty(obj, prop, {enumerable: true}); // ignored
|
| + Object.defineProperty(obj, prop,
|
| + {enumerable: desc.enumerable}); // ignored
|
| Object.defineProperty(obj, prop, {writable: false});
|
| obj[prop] = 7; // ignored
|
| - Object.defineProperty(obj, prop, {get: function() {}}); // ignored
|
| Object.deliverChangeRecords(observer.callback);
|
| observer.assertCallbackRecords([
|
| { object: obj, name: prop, type: "updated", oldValue: 1 },
|
| @@ -544,9 +544,7 @@ function blacklisted(obj, prop) {
|
| (obj instanceof Int32Array && prop === "length") ||
|
| (obj instanceof ArrayBuffer && prop == 1) ||
|
| // TODO(observe): oldValue when reconfiguring array length
|
| - (obj instanceof Array && prop === "length") ||
|
| - // TODO(observe): prototype property on functions
|
| - (obj instanceof Function && prop === "prototype")
|
| + (obj instanceof Array && prop === "length")
|
| }
|
|
|
| for (var i in objects) for (var j in properties) {
|
| @@ -558,7 +556,7 @@ for (var i in objects) for (var j in properties) {
|
| if (!desc || desc.configurable)
|
| TestObserveConfigurable(obj, prop);
|
| else if (desc.writable)
|
| - TestObserveNonConfigurable(obj, prop);
|
| + TestObserveNonConfigurable(obj, prop, desc);
|
| }
|
|
|
|
|
| @@ -817,6 +815,7 @@ observer.assertCallbackRecords([
|
| { object: array, name: 'length', type: 'updated', oldValue: 1},
|
| ]);
|
|
|
| +
|
| // __proto__
|
| reset();
|
| var obj = {};
|
| @@ -836,3 +835,39 @@ observer.assertCallbackRecords([
|
| { object: obj, name: '__proto__', type: 'prototype', oldValue: p },
|
| { object: obj, name: '__proto__', type: 'prototype', oldValue: null },
|
| ]);
|
| +
|
| +// Function.prototype
|
| +reset();
|
| +var fun = function(){};
|
| +Object.observe(fun, observer.callback);
|
| +var myproto = {foo: 'bar'};
|
| +fun.prototype = myproto;
|
| +fun.prototype = 7;
|
| +fun.prototype = 7; // ignored
|
| +Object.defineProperty(fun, 'prototype', {value: 8});
|
| +Object.deliverChangeRecords(observer.callback);
|
| +observer.assertRecordCount(3);
|
| +// Manually examine the first record in order to test
|
| +// lazy creation of oldValue
|
| +assertSame(fun, observer.records[0].object);
|
| +assertEquals('prototype', observer.records[0].name);
|
| +assertEquals('updated', observer.records[0].type);
|
| +// The only existing reference to the oldValue object is in this
|
| +// record, so to test that lazy creation happened correctly
|
| +// we compare its constructor to our function (one of the invariants
|
| +// ensured when creating an object via AllocateFunctionPrototype).
|
| +assertSame(fun, observer.records[0].oldValue.constructor);
|
| +observer.records.splice(0, 1);
|
| +observer.assertCallbackRecords([
|
| + { object: fun, name: 'prototype', type: 'updated', oldValue: myproto },
|
| + { object: fun, name: 'prototype', type: 'updated', oldValue: 7 },
|
| +]);
|
| +
|
| +// Function.prototype should not be observable except on the object itself
|
| +reset();
|
| +var fun = function(){};
|
| +var obj = { __proto__: fun };
|
| +Object.observe(obj, observer.callback);
|
| +obj.prototype = 7;
|
| +Object.deliverChangeRecords(observer.callback);
|
| +observer.assertNotCalled();
|
|
|