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 function f(arr)
2 {
3 assertEq(arr.push(4), 5); // if it doesn't throw :-)
4 }
6 function test(out)
7 {
8 // Create an array of arrays, to be iterated over for [].push-calling. We
9 // can't just loop on push on a single array with non-writable length because
10 // push throws when called on an array with non-writable length.
11 var arrs = out.arrs = [];
12 for (var i = 0; i < 100; i++)
13 arrs.push([0, 1, 2, 3]);
15 // Use a much-greater capacity than the eventual non-writable length, so that
16 // the inline-push will work.
17 var a = [0, 1, 2, 3, 4, 5, 6, 7];
18 Object.defineProperty(a, "length", { writable: false, value: 4 });
20 arrs.push(a);
22 for (var i = 0, sz = arrs.length; i < sz; i++)
23 {
24 var arr = arrs[i];
25 f(arr);
26 }
27 }
29 var obj = {};
30 var a, arrs;
32 try
33 {
34 test(obj);
35 throw new Error("didn't throw!");
36 }
37 catch (e)
38 {
39 assertEq(e instanceof TypeError, true, "expected TypeError, got " + e);
41 arrs = obj.arrs;
42 assertEq(arrs.length, 101);
43 for (var i = 0; i < 100; i++)
44 {
45 assertEq(arrs[i].length, 5, "unexpected length for arrs[" + i + "]");
46 assertEq(arrs[i][0], 0, "bad element for arrs[" + i + "][0]");
47 assertEq(arrs[i][1], 1, "bad element for arrs[" + i + "][1]");
48 assertEq(arrs[i][2], 2, "bad element for arrs[" + i + "][2]");
49 assertEq(arrs[i][3], 3, "bad element for arrs[" + i + "][3]");
50 assertEq(arrs[i][4], 4, "bad element for arrs[" + i + "][4]");
51 }
53 a = arrs[100];
54 assertEq(a[0], 0, "bad element for a[" + i + "]");
55 assertEq(a[1], 1, "bad element for a[" + i + "]");
56 assertEq(a[2], 2, "bad element for a[" + i + "]");
57 assertEq(a[3], 3, "bad element for a[" + i + "]");
58 assertEq(a.hasOwnProperty(4), false, "element addition should have thrown");
59 assertEq(a[4], undefined);
60 assertEq(a.length, 4, "length shouldn't have been changed");
61 }