Skip shadow-root creation for input element if it is not necessary
[WebKit-https.git] / JSTests / exceptionFuzz / 3d-cube.js
1 try {
2 (function() {
3
4 // 3D Cube Rotation
5 // http://www.speich.net/computer/moztesting/3d.htm
6 // Created by Simon Speich
7
8 var Q = new Array();
9 var MTrans = new Array();  // transformation matrix
10 var MQube = new Array();  // position information of qube
11 var I = new Array();      // entity matrix
12 var Origin = new Object();
13 var Testing = new Object();
14 var LoopTimer;
15
16 var validation = {
17  20: 2889.0000000000045,
18  40: 2889.0000000000055,
19  80: 2889.000000000005,
20  160: 2889.0000000000055
21 };
22
23 var DisplArea = new Object();
24 DisplArea.Width = 300;
25 DisplArea.Height = 300;
26
27 function DrawLine(From, To) {
28   var x1 = From.V[0];
29   var x2 = To.V[0];
30   var y1 = From.V[1];
31   var y2 = To.V[1];
32   var dx = Math.abs(x2 - x1);
33   var dy = Math.abs(y2 - y1);
34   var x = x1;
35   var y = y1;
36   var IncX1, IncY1;
37   var IncX2, IncY2;  
38   var Den;
39   var Num;
40   var NumAdd;
41   var NumPix;
42
43   if (x2 >= x1) {  IncX1 = 1; IncX2 = 1;  }
44   else { IncX1 = -1; IncX2 = -1; }
45   if (y2 >= y1)  {  IncY1 = 1; IncY2 = 1; }
46   else { IncY1 = -1; IncY2 = -1; }
47   if (dx >= dy) {
48     IncX1 = 0;
49     IncY2 = 0;
50     Den = dx;
51     Num = dx / 2;
52     NumAdd = dy;
53     NumPix = dx;
54   }
55   else {
56     IncX2 = 0;
57     IncY1 = 0;
58     Den = dy;
59     Num = dy / 2;
60     NumAdd = dx;
61     NumPix = dy;
62   }
63
64   NumPix = Math.round(Q.LastPx + NumPix);
65
66   var i = Q.LastPx;
67   for (; i < NumPix; i++) {
68     Num += NumAdd;
69     if (Num >= Den) {
70       Num -= Den;
71       x += IncX1;
72       y += IncY1;
73     }
74     x += IncX2;
75     y += IncY2;
76   }
77   Q.LastPx = NumPix;
78 }
79
80 function CalcCross(V0, V1) {
81   var Cross = new Array();
82   Cross[0] = V0[1]*V1[2] - V0[2]*V1[1];
83   Cross[1] = V0[2]*V1[0] - V0[0]*V1[2];
84   Cross[2] = V0[0]*V1[1] - V0[1]*V1[0];
85   return Cross;
86 }
87
88 function CalcNormal(V0, V1, V2) {
89   var A = new Array();   var B = new Array(); 
90   for (var i = 0; i < 3; i++) {
91     A[i] = V0[i] - V1[i];
92     B[i] = V2[i] - V1[i];
93   }
94   A = CalcCross(A, B);
95   var Length = Math.sqrt(A[0]*A[0] + A[1]*A[1] + A[2]*A[2]); 
96   for (var i = 0; i < 3; i++) A[i] = A[i] / Length;
97   A[3] = 1;
98   return A;
99 }
100
101 function CreateP(X,Y,Z) {
102   this.V = [X,Y,Z,1];
103 }
104
105 // multiplies two matrices
106 function MMulti(M1, M2) {
107   var M = [[],[],[],[]];
108   var i = 0;
109   var j = 0;
110   for (; i < 4; i++) {
111     j = 0;
112     for (; j < 4; j++) M[i][j] = M1[i][0] * M2[0][j] + M1[i][1] * M2[1][j] + M1[i][2] * M2[2][j] + M1[i][3] * M2[3][j];
113   }
114   return M;
115 }
116
117 //multiplies matrix with vector
118 function VMulti(M, V) {
119   var Vect = new Array();
120   var i = 0;
121   for (;i < 4; i++) Vect[i] = M[i][0] * V[0] + M[i][1] * V[1] + M[i][2] * V[2] + M[i][3] * V[3];
122   return Vect;
123 }
124
125 function VMulti2(M, V) {
126   var Vect = new Array();
127   var i = 0;
128   for (;i < 3; i++) Vect[i] = M[i][0] * V[0] + M[i][1] * V[1] + M[i][2] * V[2];
129   return Vect;
130 }
131
132 // add to matrices
133 function MAdd(M1, M2) {
134   var M = [[],[],[],[]];
135   var i = 0;
136   var j = 0;
137   for (; i < 4; i++) {
138     j = 0;
139     for (; j < 4; j++) M[i][j] = M1[i][j] + M2[i][j];
140   }
141   return M;
142 }
143
144 function Translate(M, Dx, Dy, Dz) {
145   var T = [
146   [1,0,0,Dx],
147   [0,1,0,Dy],
148   [0,0,1,Dz],
149   [0,0,0,1]
150   ];
151   return MMulti(T, M);
152 }
153
154 function RotateX(M, Phi) {
155   var a = Phi;
156   a *= Math.PI / 180;
157   var Cos = Math.cos(a);
158   var Sin = Math.sin(a);
159   var R = [
160   [1,0,0,0],
161   [0,Cos,-Sin,0],
162   [0,Sin,Cos,0],
163   [0,0,0,1]
164   ];
165   return MMulti(R, M);
166 }
167
168 function RotateY(M, Phi) {
169   var a = Phi;
170   a *= Math.PI / 180;
171   var Cos = Math.cos(a);
172   var Sin = Math.sin(a);
173   var R = [
174   [Cos,0,Sin,0],
175   [0,1,0,0],
176   [-Sin,0,Cos,0],
177   [0,0,0,1]
178   ];
179   return MMulti(R, M);
180 }
181
182 function RotateZ(M, Phi) {
183   var a = Phi;
184   a *= Math.PI / 180;
185   var Cos = Math.cos(a);
186   var Sin = Math.sin(a);
187   var R = [
188   [Cos,-Sin,0,0],
189   [Sin,Cos,0,0],
190   [0,0,1,0],   
191   [0,0,0,1]
192   ];
193   return MMulti(R, M);
194 }
195
196 function DrawQube() {
197   // calc current normals
198   var CurN = new Array();
199   var i = 5;
200   Q.LastPx = 0;
201   for (; i > -1; i--) CurN[i] = VMulti2(MQube, Q.Normal[i]);
202   if (CurN[0][2] < 0) {
203     if (!Q.Line[0]) { DrawLine(Q[0], Q[1]); Q.Line[0] = true; };
204     if (!Q.Line[1]) { DrawLine(Q[1], Q[2]); Q.Line[1] = true; };
205     if (!Q.Line[2]) { DrawLine(Q[2], Q[3]); Q.Line[2] = true; };
206     if (!Q.Line[3]) { DrawLine(Q[3], Q[0]); Q.Line[3] = true; };
207   }
208   if (CurN[1][2] < 0) {
209     if (!Q.Line[2]) { DrawLine(Q[3], Q[2]); Q.Line[2] = true; };
210     if (!Q.Line[9]) { DrawLine(Q[2], Q[6]); Q.Line[9] = true; };
211     if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; };
212     if (!Q.Line[10]) { DrawLine(Q[7], Q[3]); Q.Line[10] = true; };
213   }
214   if (CurN[2][2] < 0) {
215     if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; };
216     if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; };
217     if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; };
218     if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; };
219   }
220   if (CurN[3][2] < 0) {
221     if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; };
222     if (!Q.Line[8]) { DrawLine(Q[5], Q[1]); Q.Line[8] = true; };
223     if (!Q.Line[0]) { DrawLine(Q[1], Q[0]); Q.Line[0] = true; };
224     if (!Q.Line[11]) { DrawLine(Q[0], Q[4]); Q.Line[11] = true; };
225   }
226   if (CurN[4][2] < 0) {
227     if (!Q.Line[11]) { DrawLine(Q[4], Q[0]); Q.Line[11] = true; };
228     if (!Q.Line[3]) { DrawLine(Q[0], Q[3]); Q.Line[3] = true; };
229     if (!Q.Line[10]) { DrawLine(Q[3], Q[7]); Q.Line[10] = true; };
230     if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; };
231   }
232   if (CurN[5][2] < 0) {
233     if (!Q.Line[8]) { DrawLine(Q[1], Q[5]); Q.Line[8] = true; };
234     if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; };
235     if (!Q.Line[9]) { DrawLine(Q[6], Q[2]); Q.Line[9] = true; };
236     if (!Q.Line[1]) { DrawLine(Q[2], Q[1]); Q.Line[1] = true; };
237   }
238   Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false];
239   Q.LastPx = 0;
240 }
241
242 function Loop() {
243   if (Testing.LoopCount > Testing.LoopMax) return;
244   var TestingStr = String(Testing.LoopCount);
245   while (TestingStr.length < 3) TestingStr = "0" + TestingStr;
246   MTrans = Translate(I, -Q[8].V[0], -Q[8].V[1], -Q[8].V[2]);
247   MTrans = RotateX(MTrans, 1);
248   MTrans = RotateY(MTrans, 3);
249   MTrans = RotateZ(MTrans, 5);
250   MTrans = Translate(MTrans, Q[8].V[0], Q[8].V[1], Q[8].V[2]);
251   MQube = MMulti(MTrans, MQube);
252   var i = 8;
253   for (; i > -1; i--) {
254     Q[i].V = VMulti(MTrans, Q[i].V);
255   }
256   DrawQube();
257   Testing.LoopCount++;
258   Loop();
259 }
260
261 function Init(CubeSize) {
262   // init/reset vars
263   Origin.V = [150,150,20,1];
264   Testing.LoopCount = 0;
265   Testing.LoopMax = 50;
266   Testing.TimeMax = 0;
267   Testing.TimeAvg = 0;
268   Testing.TimeMin = 0;
269   Testing.TimeTemp = 0;
270   Testing.TimeTotal = 0;
271   Testing.Init = false;
272
273   // transformation matrix
274   MTrans = [
275   [1,0,0,0],
276   [0,1,0,0],
277   [0,0,1,0],
278   [0,0,0,1]
279   ];
280   
281   // position information of qube
282   MQube = [
283   [1,0,0,0],
284   [0,1,0,0],
285   [0,0,1,0],
286   [0,0,0,1]
287   ];
288   
289   // entity matrix
290   I = [
291   [1,0,0,0],
292   [0,1,0,0],
293   [0,0,1,0],
294   [0,0,0,1]
295   ];
296   
297   // create qube
298   Q[0] = new CreateP(-CubeSize,-CubeSize, CubeSize);
299   Q[1] = new CreateP(-CubeSize, CubeSize, CubeSize);
300   Q[2] = new CreateP( CubeSize, CubeSize, CubeSize);
301   Q[3] = new CreateP( CubeSize,-CubeSize, CubeSize);
302   Q[4] = new CreateP(-CubeSize,-CubeSize,-CubeSize);
303   Q[5] = new CreateP(-CubeSize, CubeSize,-CubeSize);
304   Q[6] = new CreateP( CubeSize, CubeSize,-CubeSize);
305   Q[7] = new CreateP( CubeSize,-CubeSize,-CubeSize);
306   
307   // center of gravity
308   Q[8] = new CreateP(0, 0, 0);
309   
310   // anti-clockwise edge check
311   Q.Edge = [[0,1,2],[3,2,6],[7,6,5],[4,5,1],[4,0,3],[1,5,6]];
312   
313   // calculate squad normals
314   Q.Normal = new Array();
315   for (var i = 0; i < Q.Edge.length; i++) Q.Normal[i] = CalcNormal(Q[Q.Edge[i][0]].V, Q[Q.Edge[i][1]].V, Q[Q.Edge[i][2]].V);
316   
317   // line drawn ?
318   Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false];
319   
320   // create line pixels
321   Q.NumPx = 9 * 2 * CubeSize;
322   for (var i = 0; i < Q.NumPx; i++) CreateP(0,0,0);
323   
324   MTrans = Translate(MTrans, Origin.V[0], Origin.V[1], Origin.V[2]);
325   MQube = MMulti(MTrans, MQube);
326
327   var i = 0;
328   for (; i < 9; i++) {
329     Q[i].V = VMulti(MTrans, Q[i].V);
330   }
331   DrawQube();
332   Testing.Init = true;
333   Loop();
334   
335   // Perform a simple sum-based verification.
336   var sum = 0;
337   for (var i = 0; i < Q.length; ++i) {
338     var vector = Q[i].V;
339     for (var j = 0; j < vector.length; ++j)
340       sum += vector[j];
341   }
342   if (sum != validation[CubeSize])
343     throw "Error: bad vector sum for CubeSize = " + CubeSize + "; expected " + validation[CubeSize] + " but got " + sum;
344 }
345
346 for ( var i = 20; i <= 160; i *= 2 ) {
347   Init(i);
348 }
349
350 Q = null;
351 MTrans = null;
352 MQube = null;
353 I = null;
354 Origin = null;
355 Testing = null;
356 LoopTime = null;
357 DisplArea = null;
358
359 })();
360 } catch (e) {
361     print("JSC EXCEPTION FUZZ: Caught exception: " + e);
362 }