js/src/tests/js1_8_5/extensions/mutable-proto-special-form.js

branch
TOR_BUG_3246
changeset 7
129ffea94266
equal deleted inserted replaced
-1:000000000000 0:3b4d00d92571
1 // Any copyright is dedicated to the Public Domain.
2 // http://creativecommons.org/licenses/publicdomain/
3
4 //-----------------------------------------------------------------------------
5 var BUGNUMBER = 948583;
6 var summary =
7 "Make __proto__ in object literals a special form not influenced by " +
8 "|Object.prototype|";
9
10 print(BUGNUMBER + ": " + summary);
11
12 /**************
13 * BEGIN TEST *
14 **************/
15
16 var passed = true;
17
18 function performProtoTests(msg)
19 {
20 print("Testing " + msg);
21 assertEq(passed, true, "passed wrong at start of test set");
22
23 assertEq(Object.getPrototypeOf({ __proto__: null }), null);
24 assertEq(Object.getPrototypeOf({ __proto__: undefined }), Object.prototype);
25 assertEq(Object.getPrototypeOf({ __proto__: 17 }), Object.prototype);
26
27 var obj = {};
28 assertEq(Object.getPrototypeOf({ __proto__: obj }), obj);
29
30 assertEq(passed, true, "passed wrong at end of test set");
31 print("Tests of " + msg + " passed!");
32 }
33
34 function poisonProto(obj)
35 {
36 Object.defineProperty(obj, "__proto__",
37 {
38 configurable: true,
39 enumerable: true,
40 set: function(v) { passed = false; },
41 });
42 }
43
44 performProtoTests("initial behavior");
45
46 var desc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__");
47 var setProto = desc.set;
48 delete Object.prototype.__proto__;
49
50 performProtoTests("behavior after Object.prototype.__proto__ deletion");
51
52 Object.defineProperty(Object.prototype, "__proto__",
53 {
54 configurable: true,
55 enumerable: false,
56 set: function(v) { passed = false; },
57 });
58
59 performProtoTests("behavior after making Object.prototype.__proto__ a " +
60 "custom setter");
61
62 Object.defineProperty(Object.prototype, "__proto__", { set: undefined });
63
64 performProtoTests("behavior after making Object.prototype.__proto__'s " +
65 "[[Set]] === undefined");
66
67
68 var superProto = Object.create(null);
69 poisonProto(superProto);
70 setProto.call(Object.prototype, superProto);
71
72 performProtoTests("behavior after mutating Object.prototype.[[Prototype]]");
73
74 // Note: The handler below will have to be updated to exempt a scriptable
75 // getPrototypeOf trap (to instead consult the target whose [[Prototype]]
76 // is safely non-recursive), if we ever implement one.
77 var death = new Proxy(Object.create(null),
78 new Proxy({}, { get: function() { passed = false; } }));
79
80 setProto.call(Object.prototype, death);
81
82 performProtoTests("behavior after making Object.prototype.[[Prototype]] a " +
83 "proxy that throws for any access");
84
85
86 if (typeof reportCompare === "function")
87 reportCompare(true, true);
88
89 print("Tests complete");

mercurial