| // |reftest| skip-if(!xulRuntime.shell) |
| // Any copyright is dedicated to the Public Domain. |
| // http://creativecommons.org/licenses/publicdomain/ |
| // Contributor: Blake Kaplan |
| |
| function expect(actual, arg) { |
| reportCompare(expect.expected, actual, arg); |
| } |
| |
| var window = { set x(y) { expect(this, y) }, y: 4 }; |
| expect.expected = window; |
| window.x = "setting through a setter directly"; |
| window.y = 5; |
| reportCompare(5, window.y, "setting properties works"); |
| var easy = { easy: 'yes', __proto__: window } |
| expect.expected = easy; |
| easy.x = "setting through a setter all-native on prototype"; |
| easy.y = 6; |
| reportCompare(5, window.y, "window.y remains as it was"); |
| reportCompare(6, easy.y, "shadowing works properly"); |
| |
| var sandbox = evalcx(''); |
| sandbox.window = window; |
| sandbox.print = print; |
| sandbox.expect = expect; |
| var hard = evalcx('Object.create(window)', sandbox); |
| expect.expected = hard; |
| hard.x = "a setter through proxy -> native"; |
| hard.y = 6; |
| reportCompare(5, window.y, "window.y remains as it was through a proxy"); |
| reportCompare(6, hard.y, "shadowing works on proxies"); |
| |
| hard.__proto__ = { 'passed': true } |
| reportCompare(true, hard.passed, "can set proxy.__proto__ through a native"); |
| |
| var inverse = evalcx('({ set x(y) { expect(this, y); }, y: 4 })', sandbox); |
| expect.expected = inverse; |
| inverse.x = "setting through a proxy directly"; |
| inverse.y = 5; |
| reportCompare(5, inverse.y, "setting properties works on proxies"); |
| |
| var inversehard = Object.create(inverse); |
| expect.expected = inversehard; |
| inversehard.x = "setting through a setter with a proxy on the proto chain"; |
| inversehard.y = 6; |
| reportCompare(5, inverse.y, "inverse.y remains as it was"); |
| reportCompare(6, inversehard.y, "shadowing works native -> proxy"); |
| |
| inversehard.__proto__ = { 'passed': true } |
| reportCompare(true, inversehard.passed, "can set native.__proto__ through a proxy"); |