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(); |