proxy-proto-setter.js (1850B)
1 // |reftest| skip-if(!xulRuntime.shell) 2 // Any copyright is dedicated to the Public Domain. 3 // http://creativecommons.org/licenses/publicdomain/ 4 // Contributor: Blake Kaplan 5 6 function expect(actual, arg) { 7 reportCompare(expect.expected, actual, arg); 8 } 9 10 var window = { set x(y) { expect(this, y) }, y: 4 }; 11 expect.expected = window; 12 window.x = "setting through a setter directly"; 13 window.y = 5; 14 reportCompare(5, window.y, "setting properties works"); 15 var easy = { easy: 'yes', __proto__: window } 16 expect.expected = easy; 17 easy.x = "setting through a setter all-native on prototype"; 18 easy.y = 6; 19 reportCompare(5, window.y, "window.y remains as it was"); 20 reportCompare(6, easy.y, "shadowing works properly"); 21 22 var sandbox = evalcx(''); 23 sandbox.window = window; 24 sandbox.print = print; 25 sandbox.expect = expect; 26 var hard = evalcx('Object.create(window)', sandbox); 27 expect.expected = hard; 28 hard.x = "a setter through proxy -> native"; 29 hard.y = 6; 30 reportCompare(5, window.y, "window.y remains as it was through a proxy"); 31 reportCompare(6, hard.y, "shadowing works on proxies"); 32 33 hard.__proto__ = { 'passed': true } 34 reportCompare(true, hard.passed, "can set proxy.__proto__ through a native"); 35 36 var inverse = evalcx('({ set x(y) { expect(this, y); }, y: 4 })', sandbox); 37 expect.expected = inverse; 38 inverse.x = "setting through a proxy directly"; 39 inverse.y = 5; 40 reportCompare(5, inverse.y, "setting properties works on proxies"); 41 42 var inversehard = Object.create(inverse); 43 expect.expected = inversehard; 44 inversehard.x = "setting through a setter with a proxy on the proto chain"; 45 inversehard.y = 6; 46 reportCompare(5, inverse.y, "inverse.y remains as it was"); 47 reportCompare(6, inversehard.y, "shadowing works native -> proxy"); 48 49 inversehard.__proto__ = { 'passed': true } 50 reportCompare(true, inversehard.passed, "can set native.__proto__ through a proxy");