| /* |
| * The contents of this file are subject to the Netscape Public |
| * License Version 1.1 (the "License"); you may not use this file |
| * except in compliance with the License. You may obtain a copy of |
| * the License at http://www.mozilla.org/NPL/ |
| * |
| * Software distributed under the License is distributed on an "AS |
| * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or |
| * implied. See the License for the specific language governing |
| * rights and limitations under the License. |
| * |
| * The Original Code is mozilla.org code. |
| * |
| * The Initial Developer of the Original Code is Netscape |
| * Communications Corporation. Portions created by Netscape are |
| * Copyright (C) 1998 Netscape Communications Corporation. All |
| * Rights Reserved. |
| * |
| * Contributor(s): pschwartau@netscape.com |
| * |
| * |
| * The idea behind bug 53268 is as follows. The item 'five' below is defined |
| * as const, hence is a read-only property of the global object. So if we set |
| * obj.__proto__ = this, 'five' should become a read-only propery of obj. |
| * |
| * If we then change obj.__proto__ to null, obj.five should initially be |
| * undefined. We should be able to define obj.five to whatever we want, |
| * and be able to access this value as obj.five. |
| * |
| * Bug 53268 was filed because obj.five could not be set or accessed after |
| * obj.__proto__ had been set to the global object and then to null. |
| */ |
| //----------------------------------------------------------------------------- |
| var bug = '53268'; |
| var status = 'Testing scope after changing obj.__proto__'; |
| var expect= ''; |
| var actual = ''; |
| var obj = {}; |
| const five = 5; |
| |
| |
| //----------------------------------------------------------------------------- |
| test(); |
| //----------------------------------------------------------------------------- |
| |
| |
| function test() |
| { |
| enterFunc ("test"); |
| printBugNumber (bug); |
| printStatus (status); |
| |
| |
| status= 'Step 1: setting obj.__proto__ = global object'; |
| obj.__proto__ = this; |
| |
| actual = obj.five; |
| expect=5; |
| reportCompare (expect, actual, status); |
| |
| obj.five=1; |
| actual = obj.five; |
| expect=5; |
| reportCompare (expect, actual, status); |
| |
| |
| |
| status= 'Step 2: setting obj.__proto__ = null'; |
| obj.__proto__ = null; |
| |
| actual = obj.five; |
| expect=undefined; |
| reportCompare (expect, actual, status); |
| |
| obj.five=2; |
| actual = obj.five; |
| expect=2; |
| reportCompare (expect, actual, status); |
| |
| |
| |
| status= 'Step 3: setting obj.__proto__ to global object again'; |
| obj.__proto__ = this; |
| |
| actual = obj.five; |
| expect=2; //<--- (FROM STEP 2 ABOVE) |
| reportCompare (expect, actual, status); |
| |
| obj.five=3; |
| actual = obj.five; |
| expect=3; |
| reportCompare (expect, actual, status); |
| |
| |
| |
| status= 'Step 4: setting obj.__proto__ to null again'; |
| obj.__proto__ = null; |
| |
| actual = obj.five; |
| expect=3; //<--- (FROM STEP 3 ABOVE) |
| reportCompare (expect, actual, status); |
| |
| obj.five=4; |
| actual = obj.five; |
| expect=4; |
| reportCompare (expect, actual, status); |
| |
| |
| exitFunc ("test"); |
| } |