Sat, 03 Jan 2015 20:18:00 +0100
Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
3 /*
4 * Any copyright is dedicated to the Public Domain.
5 * http://creativecommons.org/licenses/publicdomain/
6 */
8 /*
9 * In strict mode, it is a syntax error for an identifier to appear
10 * more than once in a function's argument list.
11 */
13 /*
14 * The parameters of ordinary function definitions should not contain
15 * duplicate identifiers.
16 */
17 assertEq(testLenientAndStrict('function f(x,y) {}',
18 parsesSuccessfully,
19 parsesSuccessfully),
20 true);
21 assertEq(testLenientAndStrict('function f(x,x) {}',
22 parsesSuccessfully,
23 parseRaisesException(SyntaxError)),
24 true);
25 assertEq(testLenientAndStrict('function f(x,y,z,y) {}',
26 parsesSuccessfully,
27 parseRaisesException(SyntaxError)),
28 true);
30 /* Exercise the hashed local name map case. */
31 assertEq(testLenientAndStrict('function f(a,b,c,d,e,f,g,h,d) {}',
32 parsesSuccessfully,
33 parseRaisesException(SyntaxError)),
34 true);
36 /*
37 * SpiderMonkey has always treated duplicates in destructuring
38 * patterns as an error. Strict mode should not affect this.
39 */
40 assertEq(testLenientAndStrict('function f([x,y]) {}',
41 parsesSuccessfully,
42 parsesSuccessfully),
43 true);
44 assertEq(testLenientAndStrict('function f([x,x]){}',
45 parseRaisesException(SyntaxError),
46 parseRaisesException(SyntaxError)),
47 true);
48 assertEq(testLenientAndStrict('function f(x,[x]){}',
49 parseRaisesException(SyntaxError),
50 parseRaisesException(SyntaxError)),
51 true);
53 /*
54 * Strict rules apply to the parameters if the function's body is
55 * strict.
56 */
57 assertEq(testLenientAndStrict('function f(x,x) { "use strict" };',
58 parseRaisesException(SyntaxError),
59 parseRaisesException(SyntaxError)),
60 true);
62 /*
63 * Calls to the function constructor should not be affected by the
64 * strictness of the calling code, but should be affected by the
65 * strictness of the function body.
66 */
67 assertEq(testLenientAndStrict('Function("x","x","")',
68 completesNormally,
69 completesNormally),
70 true);
71 assertEq(testLenientAndStrict('Function("x","y","")',
72 completesNormally,
73 completesNormally),
74 true);
75 assertEq(testLenientAndStrict('Function("x","x","\'use strict\'")',
76 raisesException(SyntaxError),
77 raisesException(SyntaxError)),
78 true);
79 assertEq(testLenientAndStrict('Function("x","y","\'use strict\'")',
80 completesNormally,
81 completesNormally),
82 true);
85 /*
86 * The parameter lists of function expressions should not contain
87 * duplicate identifiers.
88 */
89 assertEq(testLenientAndStrict('(function (x,x) 2)',
90 parsesSuccessfully,
91 parseRaisesException(SyntaxError)),
92 true);
93 assertEq(testLenientAndStrict('(function (x,y) 2)',
94 parsesSuccessfully,
95 parsesSuccessfully),
96 true);
98 /*
99 * All permutations of:
100 * - For the two magic identifiers 'arguments' or 'eval'
101 * - For function definitions, function expressions, expression closures,
102 * and getter and setter property definitions,
103 * - For forms that inherit their context's strictness, and forms that
104 * include their own strictness directives,
105 * - For ordinary parameters, array destructuring parameters, and
106 * object destructuring parameters,
107 * - the magic identifiers may be used to name such parameters
108 * in lenient code, but not in strict code
109 * - the magic identifiers may be used as function names in lenient code,
110 * but not in strict code
111 */
112 assertEq(testLenientAndStrict('function f(eval){}',
113 parsesSuccessfully,
114 parseRaisesException(SyntaxError)),
115 true);
116 assertEq(testLenientAndStrict('function f([eval]){}',
117 parsesSuccessfully,
118 parseRaisesException(SyntaxError)),
119 true);
120 assertEq(testLenientAndStrict('function f({x:eval}){}',
121 parsesSuccessfully,
122 parseRaisesException(SyntaxError)),
123 true);
124 assertEq(testLenientAndStrict('function eval(){}',
125 parsesSuccessfully,
126 parseRaisesException(SyntaxError)),
127 true);
128 assertEq(testLenientAndStrict('function f(eval){"use strict";}',
129 parseRaisesException(SyntaxError),
130 parseRaisesException(SyntaxError)),
131 true);
132 assertEq(testLenientAndStrict('function f([eval]){"use strict";}',
133 parseRaisesException(SyntaxError),
134 parseRaisesException(SyntaxError)),
135 true);
136 assertEq(testLenientAndStrict('function f({x:eval}){"use strict";}',
137 parseRaisesException(SyntaxError),
138 parseRaisesException(SyntaxError)),
139 true);
140 assertEq(testLenientAndStrict('function eval(){"use strict";}',
141 parseRaisesException(SyntaxError),
142 parseRaisesException(SyntaxError)),
143 true);
144 assertEq(testLenientAndStrict('(function f(eval){})',
145 parsesSuccessfully,
146 parseRaisesException(SyntaxError)),
147 true);
148 assertEq(testLenientAndStrict('(function f([eval]){})',
149 parsesSuccessfully,
150 parseRaisesException(SyntaxError)),
151 true);
152 assertEq(testLenientAndStrict('(function f({x:eval}){})',
153 parsesSuccessfully,
154 parseRaisesException(SyntaxError)),
155 true);
156 assertEq(testLenientAndStrict('(function eval(){})',
157 parsesSuccessfully,
158 parseRaisesException(SyntaxError)),
159 true);
160 assertEq(testLenientAndStrict('(function f(eval){"use strict";})',
161 parseRaisesException(SyntaxError),
162 parseRaisesException(SyntaxError)),
163 true);
164 assertEq(testLenientAndStrict('(function f([eval]){"use strict";})',
165 parseRaisesException(SyntaxError),
166 parseRaisesException(SyntaxError)),
167 true);
168 assertEq(testLenientAndStrict('(function f({x:eval}){"use strict";})',
169 parseRaisesException(SyntaxError),
170 parseRaisesException(SyntaxError)),
171 true);
172 assertEq(testLenientAndStrict('(function eval(){"use strict";})',
173 parseRaisesException(SyntaxError),
174 parseRaisesException(SyntaxError)),
175 true);
176 assertEq(testLenientAndStrict('(function f(eval) 2)',
177 parsesSuccessfully,
178 parseRaisesException(SyntaxError)),
179 true);
180 assertEq(testLenientAndStrict('(function f([eval]) 2)',
181 parsesSuccessfully,
182 parseRaisesException(SyntaxError)),
183 true);
184 assertEq(testLenientAndStrict('(function f({x:eval}) 2)',
185 parsesSuccessfully,
186 parseRaisesException(SyntaxError)),
187 true);
188 assertEq(testLenientAndStrict('(function eval() 2)',
189 parsesSuccessfully,
190 parseRaisesException(SyntaxError)),
191 true);
192 assertEq(testLenientAndStrict('({set x(eval){}})',
193 parsesSuccessfully,
194 parseRaisesException(SyntaxError)),
195 true);
196 assertEq(testLenientAndStrict('({set x([eval]){}})',
197 parsesSuccessfully,
198 parseRaisesException(SyntaxError)),
199 true);
200 assertEq(testLenientAndStrict('({set x({x:eval}){}})',
201 parsesSuccessfully,
202 parseRaisesException(SyntaxError)),
203 true);
204 assertEq(testLenientAndStrict('({set x(eval){"use strict";}})',
205 parseRaisesException(SyntaxError),
206 parseRaisesException(SyntaxError)),
207 true);
208 assertEq(testLenientAndStrict('({set x([eval]){"use strict";}})',
209 parseRaisesException(SyntaxError),
210 parseRaisesException(SyntaxError)),
211 true);
212 assertEq(testLenientAndStrict('({set x({x:eval}){"use strict";}})',
213 parseRaisesException(SyntaxError),
214 parseRaisesException(SyntaxError)),
215 true);
216 assertEq(testLenientAndStrict('function f(arguments){}',
217 parsesSuccessfully,
218 parseRaisesException(SyntaxError)),
219 true);
220 assertEq(testLenientAndStrict('function f([arguments]){}',
221 parsesSuccessfully,
222 parseRaisesException(SyntaxError)),
223 true);
224 assertEq(testLenientAndStrict('function f({x:arguments}){}',
225 parsesSuccessfully,
226 parseRaisesException(SyntaxError)),
227 true);
228 assertEq(testLenientAndStrict('function arguments(){}',
229 parsesSuccessfully,
230 parseRaisesException(SyntaxError)),
231 true);
232 assertEq(testLenientAndStrict('function f(arguments){"use strict";}',
233 parseRaisesException(SyntaxError),
234 parseRaisesException(SyntaxError)),
235 true);
236 assertEq(testLenientAndStrict('function f([arguments]){"use strict";}',
237 parseRaisesException(SyntaxError),
238 parseRaisesException(SyntaxError)),
239 true);
240 assertEq(testLenientAndStrict('function f({x:arguments}){"use strict";}',
241 parseRaisesException(SyntaxError),
242 parseRaisesException(SyntaxError)),
243 true);
244 assertEq(testLenientAndStrict('function arguments(){"use strict";}',
245 parseRaisesException(SyntaxError),
246 parseRaisesException(SyntaxError)),
247 true);
248 assertEq(testLenientAndStrict('(function f(arguments){})',
249 parsesSuccessfully,
250 parseRaisesException(SyntaxError)),
251 true);
252 assertEq(testLenientAndStrict('(function f([arguments]){})',
253 parsesSuccessfully,
254 parseRaisesException(SyntaxError)),
255 true);
256 assertEq(testLenientAndStrict('(function f({x:arguments}){})',
257 parsesSuccessfully,
258 parseRaisesException(SyntaxError)),
259 true);
260 assertEq(testLenientAndStrict('(function arguments(){})',
261 parsesSuccessfully,
262 parseRaisesException(SyntaxError)),
263 true);
264 assertEq(testLenientAndStrict('(function f(arguments){"use strict";})',
265 parseRaisesException(SyntaxError),
266 parseRaisesException(SyntaxError)),
267 true);
268 assertEq(testLenientAndStrict('(function f([arguments]){"use strict";})',
269 parseRaisesException(SyntaxError),
270 parseRaisesException(SyntaxError)),
271 true);
272 assertEq(testLenientAndStrict('(function f({x:arguments}){"use strict";})',
273 parseRaisesException(SyntaxError),
274 parseRaisesException(SyntaxError)),
275 true);
276 assertEq(testLenientAndStrict('(function arguments(){"use strict";})',
277 parseRaisesException(SyntaxError),
278 parseRaisesException(SyntaxError)),
279 true);
280 assertEq(testLenientAndStrict('(function f(arguments) 2)',
281 parsesSuccessfully,
282 parseRaisesException(SyntaxError)),
283 true);
284 assertEq(testLenientAndStrict('(function f([arguments]) 2)',
285 parsesSuccessfully,
286 parseRaisesException(SyntaxError)),
287 true);
288 assertEq(testLenientAndStrict('(function f({x:arguments}) 2)',
289 parsesSuccessfully,
290 parseRaisesException(SyntaxError)),
291 true);
292 assertEq(testLenientAndStrict('(function arguments() 2)',
293 parsesSuccessfully,
294 parseRaisesException(SyntaxError)),
295 true);
296 assertEq(testLenientAndStrict('({set x(arguments){}})',
297 parsesSuccessfully,
298 parseRaisesException(SyntaxError)),
299 true);
300 assertEq(testLenientAndStrict('({set x([arguments]){}})',
301 parsesSuccessfully,
302 parseRaisesException(SyntaxError)),
303 true);
304 assertEq(testLenientAndStrict('({set x({x:arguments}){}})',
305 parsesSuccessfully,
306 parseRaisesException(SyntaxError)),
307 true);
308 assertEq(testLenientAndStrict('({set x(arguments){"use strict";}})',
309 parseRaisesException(SyntaxError),
310 parseRaisesException(SyntaxError)),
311 true);
312 assertEq(testLenientAndStrict('({set x([arguments]){"use strict";}})',
313 parseRaisesException(SyntaxError),
314 parseRaisesException(SyntaxError)),
315 true);
316 assertEq(testLenientAndStrict('({set x({x:arguments}){"use strict";}})',
317 parseRaisesException(SyntaxError),
318 parseRaisesException(SyntaxError)),
319 true);
321 /*
322 * Functions produced using the Function constructor may not use
323 * 'eval' or 'arguments' as a parameter name if their body is strict
324 * mode code. The strictness of the calling code does not affect the
325 * constraints applied to the parameters.
326 */
327 assertEq(testLenientAndStrict('Function("eval","")',
328 completesNormally,
329 completesNormally),
330 true);
331 assertEq(testLenientAndStrict('Function("eval","\'use strict\';")',
332 raisesException(SyntaxError),
333 raisesException(SyntaxError)),
334 true);
335 assertEq(testLenientAndStrict('Function("arguments","")',
336 completesNormally,
337 completesNormally),
338 true);
339 assertEq(testLenientAndStrict('Function("arguments","\'use strict\';")',
340 raisesException(SyntaxError),
341 raisesException(SyntaxError)),
342 true);
345 reportCompare(true, true);