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 d88c24eac5bcd87c98ecf0e7b6899ada76c0e050..ffb1e2451c4f5356f61b0a9c7335d66d3f37e855 100644 |
| --- a/test/mjsunit/harmony/object-observe.js |
| +++ b/test/mjsunit/harmony/object-observe.js |
| @@ -447,7 +447,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); |
| @@ -457,10 +457,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 }, |
| @@ -537,8 +537,6 @@ function blacklisted(obj, prop) { |
| (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") || |
| // TODO(observe): global object |
| obj === this; |
| } |
| @@ -552,7 +550,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); |
| } |
| @@ -810,3 +808,33 @@ observer.assertCallbackRecords([ |
| { object: array, name: '0', type: 'deleted', oldValue: 0 }, |
| { object: array, name: 'length', type: 'updated', oldValue: 1}, |
| ]); |
| + |
| +// 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.deliverChangeRecords(observer.callback); |
| +observer.assertRecordCount(2); |
| +assertSame(fun, observer.records[0].object); |
|
rossberg
2012/12/05 12:02:29
What is the reason you check the first record outs
adamk
2012/12/05 17:38:17
Because of line 827: the only handle to the oldVal
rossberg
2012/12/06 09:50:01
Well, you can save the old fun.prototype before re
|
| +assertEquals('prototype', observer.records[0].name); |
| +assertEquals('updated', observer.records[0].type); |
| +// The oldValue should be the same object it would have been if |
| +// it had been accessed before being set. |
| +assertSame(fun, observer.records[0].oldValue.constructor); |
| +observer.records.splice(0, 1); |
| +observer.assertCallbackRecords([ |
| + { object: fun, name: 'prototype', type: 'updated', oldValue: myproto }, |
| +]); |
| + |
| +// 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(); |