Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Unified Diff: test/mjsunit/harmony/object-observe.js

Issue 11416353: Object.observe support for Function 'prototype' property (Closed) Base URL: git://github.com/v8/v8.git@bleeding_edge
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/objects.cc ('K') | « src/objects.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
« src/objects.cc ('K') | « src/objects.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698