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 <!DOCTYPE html>
2 <head>
3 <!--
4 Copyright (C) 2007 Apple Inc. All rights reserved.
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions
8 are met:
9 1. Redistributions of source code must retain the above copyright
10 notice, this list of conditions and the following disclaimer.
11 2. Redistributions in binary form must reproduce the above copyright
12 notice, this list of conditions and the following disclaimer in the
13 documentation and/or other materials provided with the distribution.
15 THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
16 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
19 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23 OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 -->
28 <title>SunSpider 3d-cube</title>
30 </head>
32 <body>
33 <h3>3d-cube</h3>
34 <div id="console">
35 </div>
37 <script>
39 var _sunSpiderStartDate = new Date();
41 // 3D Cube Rotation
42 // http://www.speich.net/computer/moztesting/3d.htm
43 // Created by Simon Speich
45 var Q = new Array();
46 var MTrans = new Array(); // transformation matrix
47 var MQube = new Array(); // position information of qube
48 var I = new Array(); // entity matrix
49 var Origin = new Object();
50 var Testing = new Object();
51 var LoopTimer;
53 var DisplArea = new Object();
54 DisplArea.Width = 300;
55 DisplArea.Height = 300;
57 function DrawLine(From, To) {
58 var x1 = From.V[0];
59 var x2 = To.V[0];
60 var y1 = From.V[1];
61 var y2 = To.V[1];
62 var dx = Math.abs(x2 - x1);
63 var dy = Math.abs(y2 - y1);
64 var x = x1;
65 var y = y1;
66 var IncX1, IncY1;
67 var IncX2, IncY2;
68 var Den;
69 var Num;
70 var NumAdd;
71 var NumPix;
73 if (x2 >= x1) { IncX1 = 1; IncX2 = 1; }
74 else { IncX1 = -1; IncX2 = -1; }
75 if (y2 >= y1) { IncY1 = 1; IncY2 = 1; }
76 else { IncY1 = -1; IncY2 = -1; }
77 if (dx >= dy) {
78 IncX1 = 0;
79 IncY2 = 0;
80 Den = dx;
81 Num = dx / 2;
82 NumAdd = dy;
83 NumPix = dx;
84 }
85 else {
86 IncX2 = 0;
87 IncY1 = 0;
88 Den = dy;
89 Num = dy / 2;
90 NumAdd = dx;
91 NumPix = dy;
92 }
94 NumPix = Math.round(Q.LastPx + NumPix);
96 var i = Q.LastPx;
97 for (; i < NumPix; i++) {
98 Num += NumAdd;
99 if (Num >= Den) {
100 Num -= Den;
101 x += IncX1;
102 y += IncY1;
103 }
104 x += IncX2;
105 y += IncY2;
106 }
107 Q.LastPx = NumPix;
108 }
110 function CalcCross(V0, V1) {
111 var Cross = new Array();
112 Cross[0] = V0[1]*V1[2] - V0[2]*V1[1];
113 Cross[1] = V0[2]*V1[0] - V0[0]*V1[2];
114 Cross[2] = V0[0]*V1[1] - V0[1]*V1[0];
115 return Cross;
116 }
118 function CalcNormal(V0, V1, V2) {
119 var A = new Array(); var B = new Array();
120 for (var i = 0; i < 3; i++) {
121 A[i] = V0[i] - V1[i];
122 B[i] = V2[i] - V1[i];
123 }
124 A = CalcCross(A, B);
125 var Length = Math.sqrt(A[0]*A[0] + A[1]*A[1] + A[2]*A[2]);
126 for (var i = 0; i < 3; i++) A[i] = A[i] / Length;
127 A[3] = 1;
128 return A;
129 }
131 function CreateP(X,Y,Z) {
132 this.V = [X,Y,Z,1];
133 }
135 // multiplies two matrices
136 function MMulti(M1, M2) {
137 var M = [[],[],[],[]];
138 var i = 0;
139 var j = 0;
140 for (; i < 4; i++) {
141 j = 0;
142 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];
143 }
144 return M;
145 }
147 //multiplies matrix with vector
148 function VMulti(M, V) {
149 var Vect = new Array();
150 var i = 0;
151 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];
152 return Vect;
153 }
155 function VMulti2(M, V) {
156 var Vect = new Array();
157 var i = 0;
158 for (;i < 3; i++) Vect[i] = M[i][0] * V[0] + M[i][1] * V[1] + M[i][2] * V[2];
159 return Vect;
160 }
162 // add to matrices
163 function MAdd(M1, M2) {
164 var M = [[],[],[],[]];
165 var i = 0;
166 var j = 0;
167 for (; i < 4; i++) {
168 j = 0;
169 for (; j < 4; j++) M[i][j] = M1[i][j] + M2[i][j];
170 }
171 return M;
172 }
174 function Translate(M, Dx, Dy, Dz) {
175 var T = [
176 [1,0,0,Dx],
177 [0,1,0,Dy],
178 [0,0,1,Dz],
179 [0,0,0,1]
180 ];
181 return MMulti(T, M);
182 }
184 function RotateX(M, Phi) {
185 var a = Phi;
186 a *= Math.PI / 180;
187 var Cos = Math.cos(a);
188 var Sin = Math.sin(a);
189 var R = [
190 [1,0,0,0],
191 [0,Cos,-Sin,0],
192 [0,Sin,Cos,0],
193 [0,0,0,1]
194 ];
195 return MMulti(R, M);
196 }
198 function RotateY(M, Phi) {
199 var a = Phi;
200 a *= Math.PI / 180;
201 var Cos = Math.cos(a);
202 var Sin = Math.sin(a);
203 var R = [
204 [Cos,0,Sin,0],
205 [0,1,0,0],
206 [-Sin,0,Cos,0],
207 [0,0,0,1]
208 ];
209 return MMulti(R, M);
210 }
212 function RotateZ(M, Phi) {
213 var a = Phi;
214 a *= Math.PI / 180;
215 var Cos = Math.cos(a);
216 var Sin = Math.sin(a);
217 var R = [
218 [Cos,-Sin,0,0],
219 [Sin,Cos,0,0],
220 [0,0,1,0],
221 [0,0,0,1]
222 ];
223 return MMulti(R, M);
224 }
226 function DrawQube() {
227 // calc current normals
228 var CurN = new Array();
229 var i = 5;
230 Q.LastPx = 0;
231 for (; i > -1; i--) CurN[i] = VMulti2(MQube, Q.Normal[i]);
232 if (CurN[0][2] < 0) {
233 if (!Q.Line[0]) { DrawLine(Q[0], Q[1]); Q.Line[0] = true; };
234 if (!Q.Line[1]) { DrawLine(Q[1], Q[2]); Q.Line[1] = true; };
235 if (!Q.Line[2]) { DrawLine(Q[2], Q[3]); Q.Line[2] = true; };
236 if (!Q.Line[3]) { DrawLine(Q[3], Q[0]); Q.Line[3] = true; };
237 }
238 if (CurN[1][2] < 0) {
239 if (!Q.Line[2]) { DrawLine(Q[3], Q[2]); Q.Line[2] = true; };
240 if (!Q.Line[9]) { DrawLine(Q[2], Q[6]); Q.Line[9] = true; };
241 if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; };
242 if (!Q.Line[10]) { DrawLine(Q[7], Q[3]); Q.Line[10] = true; };
243 }
244 if (CurN[2][2] < 0) {
245 if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; };
246 if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; };
247 if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; };
248 if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; };
249 }
250 if (CurN[3][2] < 0) {
251 if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; };
252 if (!Q.Line[8]) { DrawLine(Q[5], Q[1]); Q.Line[8] = true; };
253 if (!Q.Line[0]) { DrawLine(Q[1], Q[0]); Q.Line[0] = true; };
254 if (!Q.Line[11]) { DrawLine(Q[0], Q[4]); Q.Line[11] = true; };
255 }
256 if (CurN[4][2] < 0) {
257 if (!Q.Line[11]) { DrawLine(Q[4], Q[0]); Q.Line[11] = true; };
258 if (!Q.Line[3]) { DrawLine(Q[0], Q[3]); Q.Line[3] = true; };
259 if (!Q.Line[10]) { DrawLine(Q[3], Q[7]); Q.Line[10] = true; };
260 if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; };
261 }
262 if (CurN[5][2] < 0) {
263 if (!Q.Line[8]) { DrawLine(Q[1], Q[5]); Q.Line[8] = true; };
264 if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; };
265 if (!Q.Line[9]) { DrawLine(Q[6], Q[2]); Q.Line[9] = true; };
266 if (!Q.Line[1]) { DrawLine(Q[2], Q[1]); Q.Line[1] = true; };
267 }
268 Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false];
269 Q.LastPx = 0;
270 }
272 function Loop() {
273 if (Testing.LoopCount > Testing.LoopMax) return;
274 var TestingStr = String(Testing.LoopCount);
275 while (TestingStr.length < 3) TestingStr = "0" + TestingStr;
276 MTrans = Translate(I, -Q[8].V[0], -Q[8].V[1], -Q[8].V[2]);
277 MTrans = RotateX(MTrans, 1);
278 MTrans = RotateY(MTrans, 3);
279 MTrans = RotateZ(MTrans, 5);
280 MTrans = Translate(MTrans, Q[8].V[0], Q[8].V[1], Q[8].V[2]);
281 MQube = MMulti(MTrans, MQube);
282 var i = 8;
283 for (; i > -1; i--) {
284 Q[i].V = VMulti(MTrans, Q[i].V);
285 }
286 DrawQube();
287 Testing.LoopCount++;
288 Loop();
289 }
291 function Init(CubeSize) {
292 // init/reset vars
293 Origin.V = [150,150,20,1];
294 Testing.LoopCount = 0;
295 Testing.LoopMax = 50;
296 Testing.TimeMax = 0;
297 Testing.TimeAvg = 0;
298 Testing.TimeMin = 0;
299 Testing.TimeTemp = 0;
300 Testing.TimeTotal = 0;
301 Testing.Init = false;
303 // transformation matrix
304 MTrans = [
305 [1,0,0,0],
306 [0,1,0,0],
307 [0,0,1,0],
308 [0,0,0,1]
309 ];
311 // position information of qube
312 MQube = [
313 [1,0,0,0],
314 [0,1,0,0],
315 [0,0,1,0],
316 [0,0,0,1]
317 ];
319 // entity matrix
320 I = [
321 [1,0,0,0],
322 [0,1,0,0],
323 [0,0,1,0],
324 [0,0,0,1]
325 ];
327 // create qube
328 Q[0] = new CreateP(-CubeSize,-CubeSize, CubeSize);
329 Q[1] = new CreateP(-CubeSize, CubeSize, CubeSize);
330 Q[2] = new CreateP( CubeSize, CubeSize, CubeSize);
331 Q[3] = new CreateP( CubeSize,-CubeSize, CubeSize);
332 Q[4] = new CreateP(-CubeSize,-CubeSize,-CubeSize);
333 Q[5] = new CreateP(-CubeSize, CubeSize,-CubeSize);
334 Q[6] = new CreateP( CubeSize, CubeSize,-CubeSize);
335 Q[7] = new CreateP( CubeSize,-CubeSize,-CubeSize);
337 // center of gravity
338 Q[8] = new CreateP(0, 0, 0);
340 // anti-clockwise edge check
341 Q.Edge = [[0,1,2],[3,2,6],[7,6,5],[4,5,1],[4,0,3],[1,5,6]];
343 // calculate squad normals
344 Q.Normal = new Array();
345 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);
347 // line drawn ?
348 Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false];
350 // create line pixels
351 Q.NumPx = 9 * 2 * CubeSize;
352 for (var i = 0; i < Q.NumPx; i++) CreateP(0,0,0);
354 MTrans = Translate(MTrans, Origin.V[0], Origin.V[1], Origin.V[2]);
355 MQube = MMulti(MTrans, MQube);
357 var i = 0;
358 for (; i < 9; i++) {
359 Q[i].V = VMulti(MTrans, Q[i].V);
360 }
361 DrawQube();
362 Testing.Init = true;
363 Loop();
364 }
366 for ( var i = 20; i <= 160; i *= 2 ) {
367 Init(i);
368 }
370 Q = null;
371 MTrans = null;
372 MQube = null;
373 I = null;
374 Origin = null;
375 Testing = null;
376 LoopTime = null;
377 DisplArea = null;
380 var _sunSpiderInterval = new Date() - _sunSpiderStartDate;
382 document.getElementById("console").innerHTML = _sunSpiderInterval;
383 </script>
386 </body>
387 </html>