1/*
2* The contents of this file are subject to the Netscape Public
3* License Version 1.1 (the "License"); you may not use this file
4* except in compliance with the License. You may obtain a copy of
5* the License at http://www.mozilla.org/NPL/
6*
7* Software distributed under the License is distributed on an "AS
8* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
9* implied. See the License for the specific language governing
10* rights and limitations under the License.
11*
12* The Original Code is mozilla.org code.
13*
14* The Initial Developer of the Original Code is Netscape
15* Communications Corporation.  Portions created by Netscape are
16* Copyright (C) 1998 Netscape Communications Corporation. All
17* Rights Reserved.
18*
19* Contributor(s): pschwartau@netscape.com
20*
21*
22* The idea behind bug 53268 is as follows. The item 'five' below is defined
23* as const, hence is a read-only property of the global object. So if we set
24* obj.__proto__  = this,  'five' should become a read-only propery of obj.
25*
26* If we then change obj.__proto__  to null, obj.five should initially be
27* undefined. We should be able to define obj.five to whatever we want,
28* and be able to access this value as obj.five.
29*
30* Bug 53268 was filed because obj.five could not be set or accessed after
31* obj.__proto__  had been set to the global object and then to null.
32*/
33//-----------------------------------------------------------------------------
34var bug = '53268';
35var status = 'Testing scope after changing obj.__proto__';
36var expect= '';
37var actual = '';
38var obj = {};
39const five = 5;
40
41
42//-----------------------------------------------------------------------------
43test();
44//-----------------------------------------------------------------------------
45
46
47function test()
48{
49   enterFunc ("test");
50   printBugNumber (bug);
51   printStatus (status);
52
53
54   status= 'Step 1:  setting obj.__proto__ = global object';
55   obj.__proto__ = this;
56
57   actual = obj.five;
58   expect=5;
59   reportCompare (expect, actual, status);
60
61   obj.five=1;
62   actual = obj.five;
63   expect=5;
64   reportCompare (expect, actual, status);
65
66
67
68   status= 'Step 2:  setting obj.__proto__ = null';
69   obj.__proto__ = null;
70
71   actual = obj.five;
72   expect=undefined;
73   reportCompare (expect, actual, status);
74
75   obj.five=2;
76   actual = obj.five;
77   expect=2;
78   reportCompare (expect, actual, status);
79
80
81
82   status= 'Step 3:  setting obj.__proto__  to global object again';
83   obj.__proto__ = this;
84
85   actual = obj.five;
86   expect=2;  //<--- (FROM STEP 2 ABOVE)
87   reportCompare (expect, actual, status);
88
89   obj.five=3;
90   actual = obj.five;
91   expect=3;
92   reportCompare (expect, actual, status);
93
94
95
96   status= 'Step 4:  setting obj.__proto__   to  null again';
97   obj.__proto__ = null;
98
99   actual = obj.five;
100   expect=3;  //<--- (FROM STEP 3 ABOVE)
101   reportCompare (expect, actual, status);
102
103   obj.five=4;
104   actual = obj.five;
105   expect=4;
106   reportCompare (expect, actual, status);
107
108
109   exitFunc ("test");
110}
111