Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 /*
7 *
8 * Date: 06 February 2003
9 * SUMMARY: Using |instanceof| to check if function is called as a constructor
10 *
11 * See http://bugzilla.mozilla.org/show_bug.cgi?id=192105
12 *
13 */
14 //-----------------------------------------------------------------------------
15 var UBound = 0;
16 var BUGNUMBER = 192105;
17 var summary = 'Using |instanceof| to check if f() is called as constructor';
18 var status = '';
19 var statusitems = [];
20 var actual = '';
21 var actualvalues = [];
22 var expect= '';
23 var expectedvalues = [];
26 /*
27 * This function is the heart of the test. It sets the result
28 * variable |actual|, which we will compare against |expect|.
29 *
30 * Note |actual| will be set to |true| or |false| according
31 * to whether or not this function is called as a constructor;
32 * i.e. whether it is called via the |new| keyword or not -
33 */
34 function f()
35 {
36 actual = (this instanceof f);
37 }
40 /*
41 * Call f as a constructor from global scope
42 */
43 status = inSection(1);
44 new f(); // sets |actual|
45 expect = true;
46 addThis();
48 /*
49 * Now, not as a constructor
50 */
51 status = inSection(2);
52 f(); // sets |actual|
53 expect = false;
54 addThis();
57 /*
58 * Call f as a constructor from function scope
59 */
60 function F()
61 {
62 new f();
63 }
64 status = inSection(3);
65 F(); // sets |actual|
66 expect = true;
67 addThis();
69 /*
70 * Now, not as a constructor
71 */
72 function G()
73 {
74 f();
75 }
76 status = inSection(4);
77 G(); // sets |actual|
78 expect = false;
79 addThis();
82 /*
83 * Now make F() and G() methods of an object
84 */
85 var obj = {F:F, G:G};
86 status = inSection(5);
87 obj.F(); // sets |actual|
88 expect = true;
89 addThis();
91 status = inSection(6);
92 obj.G(); // sets |actual|
93 expect = false;
94 addThis();
97 /*
98 * Now call F() and G() from yet other functions, and use eval()
99 */
100 function A()
101 {
102 eval('F();');
103 }
104 status = inSection(7);
105 A(); // sets |actual|
106 expect = true;
107 addThis();
110 function B()
111 {
112 eval('G();');
113 }
114 status = inSection(8);
115 B(); // sets |actual|
116 expect = false;
117 addThis();
122 //-----------------------------------------------------------------------------
123 test();
124 //-----------------------------------------------------------------------------
128 function addThis()
129 {
130 statusitems[UBound] = status;
131 actualvalues[UBound] = actual;
132 expectedvalues[UBound] = expect;
133 UBound++;
134 }
137 function test()
138 {
139 enterFunc('test');
140 printBugNumber(BUGNUMBER);
141 printStatus(summary);
143 for (var i=0; i<UBound; i++)
144 {
145 reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
146 }
148 exitFunc ('test');
149 }