1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/tests/js1_8_5/extensions/mutable-proto-special-form.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,89 @@ 1.4 +// Any copyright is dedicated to the Public Domain. 1.5 +// http://creativecommons.org/licenses/publicdomain/ 1.6 + 1.7 +//----------------------------------------------------------------------------- 1.8 +var BUGNUMBER = 948583; 1.9 +var summary = 1.10 + "Make __proto__ in object literals a special form not influenced by " + 1.11 + "|Object.prototype|"; 1.12 + 1.13 +print(BUGNUMBER + ": " + summary); 1.14 + 1.15 +/************** 1.16 + * BEGIN TEST * 1.17 + **************/ 1.18 + 1.19 +var passed = true; 1.20 + 1.21 +function performProtoTests(msg) 1.22 +{ 1.23 + print("Testing " + msg); 1.24 + assertEq(passed, true, "passed wrong at start of test set"); 1.25 + 1.26 + assertEq(Object.getPrototypeOf({ __proto__: null }), null); 1.27 + assertEq(Object.getPrototypeOf({ __proto__: undefined }), Object.prototype); 1.28 + assertEq(Object.getPrototypeOf({ __proto__: 17 }), Object.prototype); 1.29 + 1.30 + var obj = {}; 1.31 + assertEq(Object.getPrototypeOf({ __proto__: obj }), obj); 1.32 + 1.33 + assertEq(passed, true, "passed wrong at end of test set"); 1.34 + print("Tests of " + msg + " passed!"); 1.35 +} 1.36 + 1.37 +function poisonProto(obj) 1.38 +{ 1.39 + Object.defineProperty(obj, "__proto__", 1.40 + { 1.41 + configurable: true, 1.42 + enumerable: true, 1.43 + set: function(v) { passed = false; }, 1.44 + }); 1.45 +} 1.46 + 1.47 +performProtoTests("initial behavior"); 1.48 + 1.49 +var desc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"); 1.50 +var setProto = desc.set; 1.51 +delete Object.prototype.__proto__; 1.52 + 1.53 +performProtoTests("behavior after Object.prototype.__proto__ deletion"); 1.54 + 1.55 +Object.defineProperty(Object.prototype, "__proto__", 1.56 + { 1.57 + configurable: true, 1.58 + enumerable: false, 1.59 + set: function(v) { passed = false; }, 1.60 + }); 1.61 + 1.62 +performProtoTests("behavior after making Object.prototype.__proto__ a " + 1.63 + "custom setter"); 1.64 + 1.65 +Object.defineProperty(Object.prototype, "__proto__", { set: undefined }); 1.66 + 1.67 +performProtoTests("behavior after making Object.prototype.__proto__'s " + 1.68 + "[[Set]] === undefined"); 1.69 + 1.70 + 1.71 +var superProto = Object.create(null); 1.72 +poisonProto(superProto); 1.73 +setProto.call(Object.prototype, superProto); 1.74 + 1.75 +performProtoTests("behavior after mutating Object.prototype.[[Prototype]]"); 1.76 + 1.77 +// Note: The handler below will have to be updated to exempt a scriptable 1.78 +// getPrototypeOf trap (to instead consult the target whose [[Prototype]] 1.79 +// is safely non-recursive), if we ever implement one. 1.80 +var death = new Proxy(Object.create(null), 1.81 + new Proxy({}, { get: function() { passed = false; } })); 1.82 + 1.83 +setProto.call(Object.prototype, death); 1.84 + 1.85 +performProtoTests("behavior after making Object.prototype.[[Prototype]] a " + 1.86 + "proxy that throws for any access"); 1.87 + 1.88 + 1.89 +if (typeof reportCompare === "function") 1.90 + reportCompare(true, true); 1.91 + 1.92 +print("Tests complete");