111 lines
3.0 KiB
JavaScript
111 lines
3.0 KiB
JavaScript
/*
|
|
* 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 a 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");
|
|
}
|