update in-tree webgl conformance tests copy; r=npotb
authorVladimir Vukicevic <vladimir@pobox.com>
Fri, 03 Dec 2010 14:44:01 -0800
changeset 58585 ac07899a5faf56faf6134657054d0db2a2ca5bec
parent 58584 3bb7e1a3cb223816f3a47d3df321f8471e389463
child 58586 0ebee0d30b04fd23507fd6ae46db34075ff02342
push id1
push usershaver@mozilla.com
push dateTue, 04 Jan 2011 17:58:04 +0000
reviewersnpotb
milestone2.0b8pre
update in-tree webgl conformance tests copy; r=npotb
content/canvas/test/webgl/README.mozilla
content/canvas/test/webgl/conformance/gl-teximage.html
content/canvas/test/webgl/conformance/glsl-conformance.html
content/canvas/test/webgl/conformance/read-pixels-test.html
content/canvas/test/webgl/conformance/renderbuffer-initialization.html
content/canvas/test/webgl/conformance/resources/green-2x2-16bit.png
content/canvas/test/webgl/conformance/resources/small-square-with-cie-rgb-profile.png
content/canvas/test/webgl/conformance/resources/small-square-with-colormatch-profile.png
content/canvas/test/webgl/conformance/resources/small-square-with-colorspin-profile.jpg
content/canvas/test/webgl/conformance/resources/small-square-with-colorspin-profile.png
content/canvas/test/webgl/conformance/resources/small-square-with-e-srgb-profile.png
content/canvas/test/webgl/conformance/resources/small-square-with-smpte-c-profile.png
content/canvas/test/webgl/conformance/resources/small-square-with-srgb-iec61966-2.1-profile.png
content/canvas/test/webgl/conformance/resources/webgl-test-utils.js
content/canvas/test/webgl/conformance/resources/webgl-test.js
content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-video.html
content/canvas/test/webgl/conformance/uninitialized-test.html
content/canvas/test/webgl/extra/big-fbos-example.html
content/canvas/test/webgl/extra/canvas-compositing-test.html
content/canvas/test/webgl/extra/fbo-lost-context.html
content/canvas/test/webgl/extra/lots-of-polys-example.html
content/canvas/test/webgl/extra/out-of-memory.html
content/canvas/test/webgl/extra/out-of-resources.html
content/canvas/test/webgl/extra/slow-shader-example.html
content/canvas/test/webgl/more/util.js
content/canvas/test/webgl/resources/js-test-pre.js
content/canvas/test/webgl/webgl-conformance-tests.html
--- a/content/canvas/test/webgl/README.mozilla
+++ b/content/canvas/test/webgl/README.mozilla
@@ -1,11 +1,11 @@
 This is a local copy of the WebGL conformance suite.
 
-  SVN revision: 12905
+  SVN revision: 13113
 
 The canonical location for this testsuite is:
 
   https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/tests/
 
 All files and directories in this directory, with the exceptions listed below, come from
 upstream and should not be modified without corresponding upstream fixes and/or a
 patch file in the "patches" directory. The exceptions (the Mozilla-specific files) are:
--- a/content/canvas/test/webgl/conformance/gl-teximage.html
+++ b/content/canvas/test/webgl/conformance/gl-teximage.html
@@ -34,17 +34,25 @@ var imgURLs = [
   'resources/gray-ramp-gamma1.0.png',
   'resources/gray-ramp-gamma2.0.png',
   'resources/gray-ramp-gamma4.0.png',
   'resources/gray-ramp-gamma9.0.png',
   'resources/gray-ramp.png',
   'resources/zero-alpha.png',
   'resources/3x3.png',
   'resources/blue-1x1.jpg',
-  'resources/green-2x2-16bit.png'];
+  'resources/green-2x2-16bit.png',
+  'resources/small-square-with-colorspin-profile.jpg',
+  'resources/small-square-with-colorspin-profile.png',
+  'resources/small-square-with-cie-rgb-profile.png',
+  'resources/small-square-with-colormatch-profile.png',
+  'resources/small-square-with-e-srgb-profile.png',
+  'resources/small-square-with-smpte-c-profile.png',
+  'resources/small-square-with-srgb-iec61966-2.1-profile.png'];
+
 
 wtu.loadImagesAsync(imgURLs, runTests);
 
 function runTests(imgs) {
   var loc = gl.getUniformLocation(program, "tex");
   gl.uniform1i(loc, 0);
 
   gl.disable(gl.BLEND);
@@ -281,34 +289,77 @@ function runTests(imgs) {
   debug("check uploading of images with no alpha channel works");
   gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
   gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
   gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE,
                 imgs['resources/blue-1x1.jpg']);
   glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors from setup");
   wtu.drawQuad(gl);
   gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, buf);
-
   checkPixelRange(buf, middle, center, [   0,   0, 255, 255], 10);
-
   glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors");
 
   debug("");
   debug("check uploading of 16-bit images");
   gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
   gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
   gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE,
                 imgs['resources/green-2x2-16bit.png']);
   glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors from setup");
   wtu.drawQuad(gl);
   gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, buf);
+  checkPixelRange(buf, middle, center, [   15, 121,   0, 255], 10);
+  glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors");
 
-  checkPixelRange(buf, middle, center, [   15, 121,   0, 255], 10);
+  debug("");
+  debug("check uploading of images with ICC profiles");
+  gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
+  gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
+  gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);
+
+  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE,
+                imgs['resources/small-square-with-colorspin-profile.jpg']);
+  glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors from setup");
+  wtu.drawQuad(gl);
+  gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, buf);
+  // The image is red.  However, if we ignore the color profile, it is blue.
+  checkPixelRange(buf, middle, center, [ 0, 0, 255, 255], 10);
+
+  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE,
+                imgs['resources/small-square-with-colorspin-profile.png']);
+  glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors from setup");
+  wtu.drawQuad(gl);
+  gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, buf);
+  // The image is red.  However, if we ignore the color profile, it is blue.
+  checkPixelRange(buf, middle, center, [ 0, 0, 255, 255], 10);
 
-  glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors");
+  var iccPNGs = [
+    'resources/small-square-with-cie-rgb-profile.png',
+    'resources/small-square-with-colormatch-profile.png',
+    'resources/small-square-with-e-srgb-profile.png',
+    'resources/small-square-with-smpte-c-profile.png',
+    'resources/small-square-with-srgb-iec61966-2.1-profile.png'];
+  for (var ii = 0; ii < iccPNGs.length; ++ii) {
+    var buf2 = new Uint8Array(width * height * 4);
+    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE,
+                  imgs[iccPNGs[ii]]);
+    glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors from setup");
+    wtu.drawQuad(gl);
+    gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, buf2);
+    glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors");
+    var same = true;
+    for (var jj = 0; jj < buf.length; ++jj) {
+      if (buf[jj] != buf2[jj]) {
+        same = false;
+        break;
+      }
+    }
+    assertMsg(same, "uploading PNGs with same data but various ICC profiles should generate the same results");
+  }
+
   debug("");
   successfullyParsed = true;
   shouldBeTrue("successfullyParsed");
   debug('<br /><span class="pass">TEST COMPLETE</span>');
   notifyFinishedToHarness();
 }
 </script>
 </body>
--- a/content/canvas/test/webgl/conformance/glsl-conformance.html
+++ b/content/canvas/test/webgl/conformance/glsl-conformance.html
@@ -456,30 +456,33 @@ if (!gl) {
     { vShaderId: 'vshaderWithLineDirective',
       vShaderSuccess: false,
       vShaderTest: (function() { return wtu.getLastError().indexOf("124") >= 0; }),
       fShaderId: 'fshader',
       fShaderSuccess: true,
       linkSuccess: false,
       passMsg: 'vertex shader uses #line directive should report correct line',
     },
+// TODO(zmo): adding these tests back once the limit is added to WebGL spec.
+/*
     { vShaderId: 'vshader',
       vShaderSuccess: true,
       fShaderId: 'fshaderWith256CharacterIdentifier',
       fShaderSuccess: true,
       linkSuccess: true,
       passMsg: 'shared that uses 256 character identifier should succeed',
     },
     { vShaderId: 'vshader',
       vShaderSuccess: true,
       fShaderId: 'fshaderWith257CharacterIdentifier',
       fShaderSuccess: false,
       linkSuccess: false,
       passMsg: 'shared that uses 257 character identifier should fail',
     },
+*/
   ];
 
   // Read in all the shader source.
   for (var ii = 0; ii < shaderInfo.length; ++ii) {
     var si = shaderInfo[ii];
     si.vShaderSource = document.getElementById(si.vShaderId).text;
     si.fShaderSource = document.getElementById(si.fShaderId).text;
   }
--- a/content/canvas/test/webgl/conformance/read-pixels-test.html
+++ b/content/canvas/test/webgl/conformance/read-pixels-test.html
@@ -1,25 +1,25 @@
 <!--
 Copyright (c) 2009 The Chromium Authors. All rights reserved.
 Use of this source code is governed by a BSD-style license that can be
 found in the LICENSE file.
  -->
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
 <html>
-  <head>
-    <title>WebGL ReadPixels conformance test.</title>
-    <link rel="stylesheet" href="../resources/js-test-style.css"/>
-    <script src="../resources/js-test-pre.js"></script>
-    <script src="resources/webgl-test.js"> </script>
-    <script src="resources/webgl-test-utils.js"> </script>
+<head>
+<title>WebGL ReadPixels conformance test.</title>
+<link rel="stylesheet" href="../resources/js-test-style.css"/>
+<script src="../resources/js-test-pre.js"></script>
+<script src="resources/webgl-test.js"> </script>
+<script src="resources/webgl-test-utils.js"> </script>
 </head>
 <body>
-<canvas id="example" width="200" height="200"></canvas>
+<canvas id="example" width="200" height="200" style="width: 20px; height: 20px"></canvas>
 <div id="description"></div>
 <div id="console"></div>
 <script>
 description("Checks that ReadPixels works as expected.");
 
 var wtu = WebGLTestUtils;
 var canvas = document.getElementById("example");
 var gl = create3DContext(canvas);
@@ -65,33 +65,31 @@ var tests = [
 for (var tt = 0; tt < tests.length; ++tt) {
   var test = tests[tt];
   debug("");
   debug("checking: " + test.msg);
   checkBuffer(test.checkColor, test.x, test.y,
               test.oneColor, test.oneX, test.oneY);
 }
 
-glErrorShouldBe(gl, gl.NO_ERROR,
-          "there should be no GL errors");
+glErrorShouldBe(gl, gl.NO_ERROR, "there should be no GL errors");
 
 function checkBuffer(checkColor, x, y, oneColor, oneX, oneY) {
   var buf = new Uint8Array(width * height * 4);
   gl.readPixels(x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, buf);
   for (var yy = 0; yy < height; ++yy) {
     for (var xx = 0; xx < width; ++xx) {
       var offset = (yy * width + xx) * 4;
       var expectedColors = (oneX == xx && oneY == yy) ? oneColor : checkColor;
       for (var cc = 0; cc < 4; ++cc) {
         var expectedColor = expectedColors[cc] * 255;
         var color = buf[offset + cc];
         var diff = Math.abs(expectedColor - color);
         assertMsg(diff < 3,
-                  "color pixel at " + xx + ", " + yy + " should be about " +
-                  expectedColor + " was " + color);
+                  "color pixel at " + xx + ", " + yy + " should be about " + expectedColor);
       }
     }
   }
 }
 
 var badFormats = [
   {
     format: gl.RGB,
@@ -123,34 +121,75 @@ var badFormats = [
     type: gl.UNSIGNED_BYTE,
     dest: new Uint8Array(1) },
   {
     format: gl.LUMINANCE_ALPHA,
     type: gl.UNSIGNED_BYTE,
     dest: new Uint8Array(2)
   }
 ];
+debug("");
+debug("check disallowed formats");
 for (var tt = 0; tt < badFormats.length; ++ tt) {
   var info = badFormats[tt]
   var format = info.format;
   var type = info.type;
   var dest = info.dest;
   gl.readPixels(0, 0, 1, 1, format, type, dest);
   // note that the GL error is INVALID_OPERATION if both format and type are invalid, but
   // INVALID_ENUM if only one is.
   glErrorShouldBe(
       gl, (format == gl.RGBA || type == gl.UNSIGNED_BYTE) ? gl.INVALID_ENUM : gl.INVALID_OPERATION,
       "Should not be able to read as " + wtu.glEnumToString(gl, format) +
       " / " + wtu.glEnumToString(gl, type));
 }
 
 debug("");
+debug("check reading with lots of drawing");
+width = 1024;
+height = 1024;
+canvas.width = width;
+canvas.height = height;
+gl.viewport(0, 0, 1024, 1024);
+var program = wtu.setupTexturedQuad(gl);
+var loc = gl.getUniformLocation(program, "tex");
+gl.disable(gl.BLEND);
+gl.disable(gl.DEPTH_TEST);
+var colors = [[255, 0, 0, 1], [0, 255, 0, 1], [0, 0, 255, 1]];
+var textures = [];
+var results = [];
+for (var ii = 0; ii < colors.length; ++ii) {
+  gl.activeTexture(gl.TEXTURE0 + ii);
+  var tex = gl.createTexture();
+  wtu.fillTexture(gl, tex, 1, 1, colors[ii]);
+  textures.push(tex);
+}
+for (var ii = 0; ii < colors.length; ++ii) {
+  for (var jj = 0; jj < 300 + ii + 1; ++jj) {
+    gl.uniform1i(loc, jj % 3);
+    gl.drawArrays(gl.TRIANGLES, 0, 6);
+  }
+  var buf = new Uint8Array(4);
+  gl.readPixels(512, 512, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, buf);
+  results.push(buf);
+  for (var kk = 0; kk < 99; ++kk) {
+    gl.uniform1i(loc, (jj + kk) % 3);
+    gl.drawArrays(gl.TRIANGLES, 0, 6);
+  }
+}
+var actual;
+var expected;
+for (var ii = 0; ii < colors.length; ++ii) {
+  var buf = results[ii];
+  var color = colors[ii];
+  actual = [buf[0], buf[1], buf[2], buf[3]];
+  expected = [color[0], color[1], color[2], color[3] * 255];
+  shouldBe("actual", "expected");
+}
+glErrorShouldBe(gl, gl.NO_ERROR, "there should be no GL errors");
+
+debug("");
 successfullyParsed = true;
 </script>
-</body>
 <script src="../resources/js-test-post.js"></script>
-
-<script>
-</script>
-
 </body>
 </html>
 
--- a/content/canvas/test/webgl/conformance/renderbuffer-initialization.html
+++ b/content/canvas/test/webgl/conformance/renderbuffer-initialization.html
@@ -4,57 +4,51 @@ Use of this source code is governed by a
 found in the LICENSE file.
  -->
 <html>
 <head>
 <link rel="stylesheet" href="../resources/js-test-style.css"/>
 <script src="../resources/js-test-pre.js"></script>
 <script src="resources/webgl-test.js"></script>
 <script>
-function runTest()
+function runTest(gl, width, height)
 {
-    var canvas = document.getElementById("testbed");
-    var gl = create3DContext(canvas);
-    if (!gl) {
-        testFailed('canvas.getContext() failed');
-        return false;
-    }
 
     debug('Test whether the WebGL internal buffers have been initialized to 0.');
-    var buf = new Uint8Array(500 * 500 * 4);
-    gl.readPixels(0, 0, 500, 500, gl.RGBA, gl.UNSIGNED_BYTE, buf);
+    var totalBytes = width * height * 4;
+    var buf = new Uint8Array(totalBytes);
+    gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, buf);
     if (gl.getError() != gl.NO_ERROR) {
         testFailed('GL error detected after readPixels().');
         return false;
     }
-    var totalBytes = 500 * 500 * 4;
     for (var i = 0; i < totalBytes; ++i) {
         if (buf[i] != 0) {
             testFailed('WebGL internal buffers are dirty.');
             return false;
         }
     }
     testPassed('Buffers have been initialized to 0.');
 
     debug('Test whether user created buffers have been initialized to 0.');
     var fbo = gl.createFramebuffer();
     gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
     var colorbuffer = gl.createRenderbuffer();
     gl.bindRenderbuffer(gl.RENDERBUFFER, colorbuffer);
-    gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 500, 500);
+    gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, width, height);
     if (gl.getError() != gl.NO_ERROR) {
         testFailed('GL error detected after renderbufferStorage(internalformat = RGBA4).');
         return false;
     }
     gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorbuffer);
     if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE) {
         testFailed('Framebuffer incomplete.');
         return false;
     }
-    gl.readPixels(0, 0, 500, 500, gl.RGBA, gl.UNSIGNED_BYTE, buf);
+    gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, buf);
     if (gl.getError() != gl.NO_ERROR) {
         testFailed('GL error detected after readPixels().');
         return false;
     }
     for (var i = 0; i < totalBytes; ++i) {
         if (buf[i] != 0) {
             testFailed('User created buffers are dirty.');
             return false;
@@ -62,23 +56,39 @@ function runTest()
     }
 
     testPassed('Buffers have been initialized to 0.');
     return true;
 }
 </script>
 </head>
 <body>
-<canvas id="testbed" width="500px" height="500px"></canvas>
+<canvas id="testbed" width="400px" height="400px"></canvas>
 <div id="description"></div>
 <div id="console"></div>
 <script>
 var successfullyParsed = false;
 
 description('Verify renderbuffers are initialized to 0 before being read in WebGL');
 
-runTest();
+var canvas = document.getElementById("testbed");
+var gl = canvas.getContext("experimental-webgl");
+if (!gl) {
+    testFailed('canvas.getContext() failed');
+} else {
+    runTest(gl, canvas.width, canvas.height);
 
-successfullyParsed = true;
+    // Testing that canvas resizing will clear the buffers with 0 instead of the current clear values.
+    gl.clearColor(1, 0, 0, 1);
+    canvas.width += 1;
+    canvas.height += 1;
+    runTest(gl, canvas.width, canvas.height);
+
+    // Testing buffer clearing won't change the clear values.
+    var clearColor = gl.getParameter(gl.COLOR_CLEAR_VALUE);
+    shouldBe("clearColor", "[1, 0, 0, 1]");
+
+    successfullyParsed = true;
+}
 </script>
 <script src="../resources/js-test-post.js"></script>
 </body>
 </html>
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..7fcb96960e142ccca49f44755d6294352caf0e42
GIT binary patch
literal 134
zc%17D@N?(olHy`uVBq!ia0vp^Odu=(BG<aO82~BH0*}aIAngIhZYQ(tK!Rljj_EMf
z3|TsL4M2vnr;B3<$MxhVA}j75KXBl~?1${k%)+M=`}}!$a?0xKjDf~QGO@e!7o<o5
Pl{0v{`njxgN@xNAnL-{h
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..aa8bf377179eb9abb443514c73e1c1fb02ec71e5
GIT binary patch
literal 868
zc$@)b1DpJbP)<h;3K|Lk000e1NJLTq001ih001Hg0ssI2Nierx00009a7bBm001r{
z001r{0eGc9b^rhYGHF9YP*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-pOzze>YU6o<bX
z1dBouybo}ff}ldEZca&CN<pMVha_8*hA7e`++6<@d<@^f#l_Xh*-20+IQa<9PC^}G
ztxh8N!GZ7mhQr|;u-2Tm+p$()lo{=HUF8R%T706$GOKK}Gl<K=>GyX5vOG)piGa6f
z1i)m|X}cZ%#!_5p1H1#xVN%8*Y#=%_g#mF1$mqB*Ag%$a54;wLJD{Fc{s7dY%3pxG
z_Ja__D<D%p2*Co7QRNblCOJ0%t-KiPqx8_Irfu8G8Rk)<_Q$13My2XyajuJ84@@!y
zs{H_{wR#=pbzS}&KM2+AvY#ctvTwvE`gHaKYwP!ZKI7sFHg2cW>CHUb8^NRj3*kIl
zzXuxd*!Td+*iNkt{rC?6001CkNK#Dz0D>_90D>_90UsOy0B3^$0BZ;U0T>ei06{wd
z00V@F<r`7}00FE?L_t(|+O$_kmc=j#lX%|E{jY1y0w-}xarxe)ycjSNf{=d#AfZ?>
zyB7dZxIT;NfifuqJijGCl7}@CCIKMmj{xLvND}}UMwXi(nZNt8@jRgFvyMctve$!X
z-2(_?Rs=*hLu^{%DP`3?R5&J7e^3E*!9?gTg11Z(AfPLMg%5UJjxFnZ?J}^T65|FG
z>>ULiBsBJzp&vxhqCg&Xn5A8Nm}sA>7?&t*U*RPIb;5bcLa!EnfWjL_dupL36Z?9T
zoFzWWN&3vh6F6l?e3_;+v2`#3!VxrwBhV%$rd(>A2i(*OB<0vGF;QGg!)kZtWG(oX
zNC*-XhEPz`HYZg1oRNHRTFQZ8G6w|;>QhX8CR#Ba=v5CI!q~CJu38v6L)^o}c~vH}
z_Q*Xga!Qe6OraB`Esh9NisUTbBv4@#1;3<YYr~8*g@Uw)gcS;}g<Vvm3!?T#@Z?@u
z;YE*wK36>F%6jq=iF`Qth5`#;^3hp+HAss4J0@l);+Nk4<@a{DJM+sSZNP9?r_$MG
u&dMCB&~V?0@23(Kzp#}gNE&K3{{sM`l)Htd=@Xy;0000<MNUMnLSTY%)Np?Q
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..63454ec0dd7ced88d82c82ae7a72c86993da4342
GIT binary patch
literal 871
zc$@)e1DO1YP)<h;3K|Lk000e1NJLTq001ih001Hg0ssI2Nierx00009a7bBm001r{
z001r{0eGc9b^rhYHEBabP*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-pOzze>YU6o<cC
zp^8IP$fm<ZaTKb9P`9M5RZu9=A<5RHp)Iw!;pY0MtIy#BIO;pNii4tyqmLk+92}wq
zClUOn@BD_t;ryUdbDD0evIyhUXs_)`KM3XQ165`Kpd06z)9D-lq$*ALiGb-d0^o7O
zX}T@`#(bP<1AG8my(Eu8)PUi+$qa}qz>Y?l0dWJ^`q*oLxC5+y;ZJ}S75)ZT+7Chy
z?||L+gAginfE^XS0@x<GFaQmeP4uuoFmkhAuS=(=qC_4|a+8d6xu3>LXG(WX(gTY7
z09a_K6QvKkCLTzy?eg#VK`0BGzJC38r_4&?Q+@W`g}DEHE_YmxU^j;9cA0r=a6N(L
zmoi)3gQa!2m7hvQQbYs9dSw6r03c&XQcVB=hYA1yj0yk%_7(sDgwFr~b2|V4>{9>$
zI+p+d9ZUN2WtRW|0jx<xK~#9!v{y%##V`nyc;3zZuWQW$Cvi)0`QD_w7%&ookbeRo
zp;$4y7XVPWK8xvrGARN)za>DDhcyx=0U+p)0OW5-695=SmYX1%zx%TBJfP~cjzqAs
z*Mn%?0|;YQ1VlGOY+B(dWz{`YI3`qoPyuwoMCdMpw@eZspeuic4|ZLSE$e&jGO(c%
z;|3J$9R(dEH1?RGA4JfiKpu6NrCocNXrHPWmndyt;Uxie!g<L;uNHoQ!W%|=YM~|*
z`+Ad{B|geY`pm==IAunBnWi+cbua<K5j2M*&?Y9PTxy&L+|&vr<=8DTQCv&IYIo*j
zE%=s52oe;AP*Br0Csg^Ik$iAk%7I}r2L%f1Q%rp(S}`5yRSz1%*s;Z~S{OP*+{46q
zRVK6c$UQA`N|9nrp%bJnjtEnV<SgDKP+=4WzocVp!;CbAg0zQ(6$-C~T~wnBqV`4b
z<X&0fMUR6%S3Kv+dh!y9d^q@q0t;XA(OG>pNQ(PACT1t%m)`&7_jb5D^UEP^z;IZn
x(%ELt${ecDaNmjVrxF#vu$3f88frHG0|26wyM?Cd6QBS9002ovPDHLkV1gW|c8CA~
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a9186968fbd03385fde3d278ca80a5b1d8166ac3
GIT binary patch
literal 9145
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
A5dZ)H
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..59226273768e5095f230a39dcbc35df973bdec1a
GIT binary patch
literal 841
zc$@)A1GfB$P)<h;3K|Lk000e1NJLTq001ih001Hg0ssI2Nierx00009a7bBm001r{
z001r{0eGc9b^rhY7imL7P*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-pOzy-LGS07lQP
zg4jWe1nGDOadIev;HrV@V4x%!l59;HVnCB{bK?&<3a;JU1i@!ech@?Jf<A>HIy(eO
z9R<&HIMW9oh&RjWyR8l!W?I=h+tTv`IrmJPB|5a29Y$rbH5lvxWO)|z8v$Q02!N+G
z%jvuPjrpih8h8g*M{yZ}=mMi-U1$(zfT27;05JxPr1l%Y2y4Fw4CUG;hzYQeOnErv
zIzG_=W?r1CG}+g3z1Q22yK$z{s4As3OtPwkdItb)Ge5|cQ=}RHi{}TjwhtQth~-Js
z!b`ZjfbMJ4R<2<29Bv<)mS4l>C(MkaN*(=tA|Ag1K&wZ`UA-Xi0000WV@Og>004R=
z004l4004C`008P=0026d000+n008;{004mKpl}9*00053Nkl<Zc-pjAN0!Af2$Oi;
z&Hb-y%>pNJOL6($q`Vj~5`vI_0wAGSF}oK4P`Eye>47pS0zAJZK$3?w5+(s4=#K#8
zZ%7jW7)F+xAeq1Wvhh5i>a&hSu(H>KXx#${V^#!2H$!Y%;VEU+JybX*RDVzbbiqXE
zE`qmA5+I-}e}xZrU5+j5d+jo?p%UW;6zm-Z9V9gNn4up;(4s&db(p1HdzfgSsu-6j
zZC~Lf0d>N8$wIFdet^OoMtf?ZCKLO5lbj_!%1Qdn#1lAWMtqs3G_iFs0m2b9ha=D?
zCZ=3!oCn<03MA#&EiqACOT%h+=437SmPiN^6oybx(>5nm`J9n_a9YZNVKN5=3hGl#
zeI{Bl9q3gL8p7DI#jaWyIz!yU#CcUFv-Ze6EpkecVoaeEq%DpJQ;Os)-Xu_A6a~Me
zV{5~VG=+k+hlCXhuZ3MyqYI+;MeyWaS>Z*GgFaV0=gNBW5{Y~`_=W-tU-HpeeKkmm
z`#UCPC*qgh|K;~~xI6R9A#K2LSf|q2X3okSs?c!XiSMTp6~C~RBuE-+Hva<vqLjOZ
Trs)%)00000NkvXXu0mjf2dG;$
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2792b0ac5703f306856d228f135f4ac92ff97371
GIT binary patch
literal 1985
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
Trs)%)00000NkvXXu0mjfce|p_
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2904e895235c885a2fdaab2469751e873a9df243
GIT binary patch
literal 871
zc$@)e1DO1YP)<h;3K|Lk000e1NJLTq001ih001Hg0ssI2Nierx00009a7bBm001r{
z001r{0eGc9b^rhYHEBabP*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-pOzJ4?f06hO}x
z2TO$@H0b(mx)ef{;+j4XL8Z1Gl5EX``k+bp^7-h}A0cl30o@%O9Q*+t1i{Il;3haZ
zI0Ok!B6y~A&v3bL!B}@Xt*)^QlSHfjc1yaRFBhMvutbd}o1-w#oL+AiAW4&$p9uJP
zK>$40oldLE->8O}(!eLsh~hj1VFSUr&NPTCzzR+>4dMo{)Ue+M@c@|P!smb)6#fdB
z%JqB@Z-6y+Js%7JD=6FoEFE8HfOeWq)zSD+%Z6>+(uvX_mV;@o<4G=ek}y?Sszy4F
zfZ{#?Ducb=uv>5Q-?*MH3wu960AgicwvzBvoqhkn*!X=ecN|~B)*~#;$`;+iT@_YG
zWm~(3S`+T~zW{l7P3hm<SepO<03c&XQcVB=dL;k=fP(-4_80&FgwX&1c^Loz=xhK0
zJc|GT8(6zMik<)f0jx<xK~#9!v{y%##V`nyc;3zZuWQW$Cvi)0`QD_w7%&ookbeRo
zp;$4y7XVPWK8xvrGARN)za>DDhcyx=0U+p)0OW5-695=SmYX1%zx%TBJfP~cjzqAs
z*Mn%?0|;YQ1VlGOY+B(dWz{`YI3`qoPyuwoMCdMpw@eZspeuic4|ZLSE$e&jGO(c%
z;|3J$9R(dEH1?RGA4JfiKpu6NrCocNXrHPWmndyt;Uxie!g<L;uNHoQ!W%|=YM~|*
z`+Ad{B|geY`pm==IAunBnWi+cbua<K5j2M*&?Y9PTxy&L+|&vr<=8DTQCv&IYIo*j
zE%=s52oe;AP*Br0Csg^Ik$iAk%7I}r2L%f1Q%rp(S}`5yRSz1%*s;Z~S{OP*+{46q
zRVK6c$UQA`N|9nrp%bJnjtEnV<SgDKP+=4WzocVp!;CbAg0zQ(6$-C~T~wnBqV`4b
z<X&0fMUR6%S3Kv+dh!y9d^q@q0t;XA(OG>pNQ(PACT1t%m)`&7_jb5D^UEP^z;IZn
x(%ELt${ecDaNmjVrxF#vu$3f88frHG0|26wyM?Cd6QBS9002ovPDHLkV1g?RZ~_1T
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a0201f113fdc8e971faa17dbff8954192ea866fd
GIT binary patch
literal 3201
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
--- a/content/canvas/test/webgl/conformance/resources/webgl-test-utils.js
+++ b/content/canvas/test/webgl/conformance/resources/webgl-test-utils.js
@@ -279,17 +279,17 @@ var fillTexture = function(gl, tex, widt
  * @param {number} width The width of the texture to create.
  * @param {number} height The height of the texture to create.
  * @param {!Array.<number>} color The color to fill with. A 4 element array
  *        where each element is in the range 0 to 255.
  * @return {!WebGLTexture}
  */
 var createColoredTexture = function(gl, width, height, color) {
   var tex = gl.createTexture();
-  fillTexture(gl, text, width, height, color);
+  fillTexture(gl, tex, width, height, color);
   return tex;
 };
 
 /**
  * Draws a previously setup quad.
  * @param {!WebGLContext} gl The WebGLContext to use.
  * @param {!Array.<number>} opt_color The color to fill clear with before
  *        drawing. A 4 element array where each element is in the range 0 to
@@ -373,30 +373,25 @@ var loadTexture = function(gl, url, call
 };
 
 /**
  * Creates a webgl context.
  * @param {!Canvas} opt_canvas The canvas tag to get context from. If one is not
  *     passed in one will be created.
  * @return {!WebGLContext} The created context.
  */
-var create3DContext = function(opt_canvas) {
+var create3DContext = function(opt_canvas, opt_attributes) {
   opt_canvas = opt_canvas || document.createElement("canvas");
   var context = null;
   try {
-    context = opt_canvas.getContext("experimental-webgl");
+    context = opt_canvas.getContext("webgl", opt_attributes);
   } catch(e) {}
   if (!context) {
     try {
-      context = opt_canvas.getContext("webkit-3d");
-    } catch(e) {}
-  }
-  if (!context) {
-    try {
-      context = opt_canvas.getContext("moz-webgl");
+      context = opt_canvas.getContext("experimental-webgl", opt_attributes);
     } catch(e) {}
   }
   if (!context) {
     testFailed("Unable to fetch WebGL rendering context for Canvas");
   }
   return context;
 }
 
--- a/content/canvas/test/webgl/conformance/resources/webgl-test.js
+++ b/content/canvas/test/webgl/conformance/resources/webgl-test.js
@@ -39,26 +39,21 @@ function webglTestLog(msg) {
 // Returns the WebGLRenderingContext for any known implementation.
 //
 function create3DContext(canvas, attributes)
 {
     if (!canvas)
         canvas = document.createElement("canvas");
     var context = null;
     try {
-        context = canvas.getContext("experimental-webgl", attributes);
+        context = canvas.getContext("webgl", attributes);
     } catch(e) {}
     if (!context) {
         try {
-            context = canvas.getContext("webkit-3d", attributes);
-        } catch(e) {}
-    }
-    if (!context) {
-        try {
-            context = canvas.getContext("moz-webgl", attributes);
+            context = canvas.getContext("experimental-webgl", attributes);
         } catch(e) {}
     }
     if (!context) {
         throw "Unable to fetch WebGL rendering context for Canvas";
     }
     return context;
 }
 
@@ -146,65 +141,65 @@ function glErrorShouldBe(gl, glError, op
 // createProgram
 //
 // Create and return a program object, attaching each of the given shaders.
 //
 // If attribs are given, bind an attrib with that name at that index.
 //
 function createProgram(gl, vshaders, fshaders, attribs)
 {
-    if (typeof(vshaders) == "string")
-  vshaders = [vshaders];
-    if (typeof(fshaders) == "string")
-  fshaders = [fshaders];
+  if (typeof(vshaders) == "string")
+    vshaders = [vshaders];
+  if (typeof(fshaders) == "string")
+    fshaders = [fshaders];
 
-    var shaders = [];
-    var i;
+  var shaders = [];
+  var i;
 
-    for (i = 0; i < vshaders.length; ++i) {
-  var shader = loadShader(gl, vshaders[i], gl.VERTEX_SHADER);
-  if (!shader)
+  for (i = 0; i < vshaders.length; ++i) {
+    var shader = loadShader(gl, vshaders[i], gl.VERTEX_SHADER);
+    if (!shader)
       return null;
-  shaders.push(shader);
-    }
+    shaders.push(shader);
+  }
 
-    for (i = 0; i < fshaders.length; ++i) {
-  var shader = loadShader(gl, fshaders[i], gl.FRAGMENT_SHADER);
-  if (!shader)
+  for (i = 0; i < fshaders.length; ++i) {
+    var shader = loadShader(gl, fshaders[i], gl.FRAGMENT_SHADER);
+    if (!shader)
       return null;
-  shaders.push(shader);
-    }
+    shaders.push(shader);
+  }
 
-    var prog = gl.createProgram();
-    for (i = 0; i < shaders.length; ++i) {
-  gl.attachShader(prog, shaders[i]);
-    }
+  var prog = gl.createProgram();
+  for (i = 0; i < shaders.length; ++i) {
+    gl.attachShader(prog, shaders[i]);
+  }
 
-    if (attribs) {
-        for (var i in attribs) {
-            gl.bindAttribLocation (prog, i, attribs[i]);
+  if (attribs) {
+    for (var i in attribs) {
+      gl.bindAttribLocation(prog, parseInt(i), attribs[i]);
+    }
   }
-    }
 
-    gl.linkProgram(prog);
+  gl.linkProgram(prog);
 
-    // Check the link status
-    var linked = gl.getProgramParameter(prog, gl.LINK_STATUS);
-    if (!linked) {
-        // something went wrong with the link
-        var error = gl.getProgramInfoLog(prog);
-        webglTestLog("Error in program linking:" + error);
+  // Check the link status
+  var linked = gl.getProgramParameter(prog, gl.LINK_STATUS);
+  if (!linked) {
+    // something went wrong with the link
+    var error = gl.getProgramInfoLog(prog);
+    webglTestLog("Error in program linking:" + error);
 
-        gl.deleteProgram(prog);
-  for (i = 0; i < shaders.length; ++i)
+    gl.deleteProgram(prog);
+    for (i = 0; i < shaders.length; ++i)
       gl.deleteShader(shaders[i]);
-        return null;
-    }
+    return null;
+  }
 
-    return prog;
+  return prog;
 }
 
 //
 // initWebGL
 //
 // Initialize the Canvas element with the passed name as a WebGL object and return the
 // WebGLRenderingContext.
 //
--- a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-video.html
+++ b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-video.html
@@ -52,16 +52,18 @@ function runOneIteration(videoElement, u
     // Disable any writes to the alpha channel
     gl.colorMask(1, 1, 1, 0);
     var texture = gl.createTexture();
     // Bind the texture to texture unit 0
     gl.bindTexture(gl.TEXTURE_2D, texture);
     // Set up texture parameters
     gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
     gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
     // Set up pixel store parameters
     gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipY);
     gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
     // Upload the videoElement into the texture
     if (useTexSubImage2D) {
         // Initialize the texture to black first
         gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,
                       videoElement.videoWidth, videoElement.videoHeight, 0,
@@ -115,17 +117,17 @@ function finish() {
     }
 }
 </script>
 </head>
 <body onload="init()">
 <canvas id="example" width="32px" height="32px"></canvas>
 <div id="description"></div>
 <div id="console"></div>
-<video width="640" height="228" id="vid" controls autoplay>
+<video width="640" height="228" id="vid" controls>
   <source src="resources/red-green.mp4"  type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"' />
   <source src="resources/red-green.webmvp8.webm" type='video/webm; codecs="vp8, vorbis"' />
   <source src="resources/red-green.theora.ogv"  type='video/ogg; codecs="theora, vorbis"' />
 </video>
 </body>
 </html>
 
 
--- a/content/canvas/test/webgl/conformance/uninitialized-test.html
+++ b/content/canvas/test/webgl/conformance/uninitialized-test.html
@@ -1,32 +1,31 @@
 <!doctype html>
 <html>
 <head>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-	<title>WebGL Uninitialized GL Resources Tests</title>
-	<link rel="stylesheet" href="../resources/js-test-style.css"/>
-	<script src="../resources/js-test-pre.js"></script>
-	<script src="resources/webgl-test.js"></script>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>WebGL Uninitialized GL Resources Tests</title>
+<link rel="stylesheet" href="../resources/js-test-style.css"/>
+<script src="../resources/js-test-pre.js"></script>
+<script src="resources/webgl-test.js"></script>
 </head>
 <body>
 <div id="description"></div>
 <div id="console"></div>
 <canvas id="canvas" width="2" height="2"> </canvas>
 <script>
 description("Tests to check user code cannot access uninitialized data from GL resources.");
 
 var canvas = document.getElementById("canvas");
 var gl = create3DContext(canvas);
 if (!gl)
   testFailed("Context created.");
 else
   testPassed("Context created.");
 
-
 debug("Reading an uninitialized texture should succeed with all bytes set to 0.");
 
 var width = 512;
 var height = 512;
 var bpp = 4;
 var expectedDataLength = width*height*bpp;
 
 var tex = gl.createTexture();
@@ -58,39 +57,35 @@ gl.framebufferTexture2D(gl.FRAMEBUFFER, 
 data = new Uint8Array(width * height * 4);
 gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data);
 
 if (data.length != expectedDataLength) {
     testFailed("expected data length " + expectedDataLength + " but got " + data.length + " instead.");
 } else {
     var k = 0;
     for (var i = 0; i < data.length; ++i) {
-	if (data[i] != 0) {
-	    k++;
-	}
+        if (data[i] != 0) {
+            k++;
+        }
     }
 
     if (k) {
-	testFailed("Found " + k + " non-zero bytes");
+        testFailed("Found " + k + " non-zero bytes");
     } else {
-	testPassed("All data initialized");
+        testPassed("All data initialized");
     }
 }
 
 glErrorShouldBe(gl, gl.NO_ERROR);
 
 //TODO: uninitialized vertex array buffer
 //TODO: uninitialized vertex elements buffer
 //TODO: uninitialized framebuffer? (implementations would need to do a GL clear at first binding?)
 //TODO: uninitialized renderbuffer? (implementations would need to do a GL clear at first binding?)
 //TODO: uninitialized uniform arrays?
 
-
 debug("");
 successfullyParsed = true;
 </script>
 <script src="../resources/js-test-post.js"></script>
-<script>
-</script>
-
 </body>
 </html>
 
--- a/content/canvas/test/webgl/extra/big-fbos-example.html
+++ b/content/canvas/test/webgl/extra/big-fbos-example.html
@@ -3,182 +3,195 @@ Copyright (c) 2009 The Chromium Authors.
 Use of this source code is governed by a BSD-style license that can be
 found in the LICENSE file.
  -->
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>WebGL FBO Lost Context Test</title>
+<title>WebGL Big FBO Test</title>
 <link rel="stylesheet" href="../resources/js-test-style.css"/>
 <script src="../resources/desktop-gl-constants.js" type="text/javascript"></script>
 <script src="../../debug/webgl-debug.js"></script>
 <script src="../resources/js-test-pre.js"></script>
 <script src="../conformance/resources/webgl-test.js"></script>
 </head>
 <body>
 <div id="description"></div>
 <div id="console"></div>
-    <script id="vshader" type="x-shader/x-vertex">
-        attribute vec4 vPosition;
-        attribute vec2 texCoord0;
-        uniform mat4 world;
-        varying vec2 texCoord;
-        void main()
-        {
-            gl_Position = vPosition * world;
-            texCoord = texCoord0;
-        }
-    </script>
+<script id="vshader" type="x-shader/x-vertex">
+attribute vec4 vPosition;
+attribute vec2 texCoord0;
+uniform mat4 world;
+varying vec2 texCoord;
+void main()
+{
+    gl_Position = vPosition * world;
+    texCoord = texCoord0;
+}
+</script>
 
-    <script id="fshader" type="x-shader/x-fragment">
-    uniform sampler2D tex;
-        varying vec2 texCoord;
-        void main()
-        {
-            gl_FragColor = texture2D(tex, texCoord);
-        }
-    </script>
+<script id="fshader" type="x-shader/x-fragment">
+precision mediump float;
+uniform sampler2D tex;
+varying vec2 texCoord;
+void main()
+{
+    gl_FragColor = texture2D(tex, texCoord);
+}
+</script>
 <canvas id="canvas" width="1024" height="1024"> </canvas>
 <script>
-description("This test is to help see if an WebGL app *can* get lost context.");
+window.onload = init;
+debug("Tests the performance of using lots of large FBOs");
+
+function init() {
+  if (confirm(
+      "after clicking ok your machine may be come unresponsive or crash")) {
+    main();
+  } else {
+    debug("cancelled");
+  }
+}
 
-debug("");
-debug("Canvas.getContext");
-var g_worldLoc;
-var g_texLoc;
-var g_textures = [];
-gl = initWebGL("canvas", "vshader", "fshader", [ "vPosition", "texCoord0"], [ 0, 0, 0, 1 ], 1);
-if (!gl) {
-  testFailed("context does not exist");
-} else {
-  testPassed("context exists");
+function main() {
+  debug("");
+  debug("Canvas.getContext");
+  var g_worldLoc;
+  var g_texLoc;
+  var g_textures = [];
+  gl = initWebGL("canvas", "vshader", "fshader", [ "vPosition", "texCoord0"], [ 0, 0, 0, 1 ], 1);
+  if (!gl) {
+    testFailed("context does not exist");
+  } else {
+    testPassed("context exists");
 
-  debug("");
-  debug("Checking for out of memory handling.");
+    debug("");
+    debug("Checking for out of memory handling.");
+
+    var size = gl.getParameter(gl.MAX_RENDERBUFFER_SIZE);
+    debug("max render buffer size: " + size);
+    size = size / 2;
+    debug("size used: " + size);
+
+    var allocateFramebuffers = true;
+    var intervalId = 0;
+    var count = 0;
+
+    WebGLDebugUtils.init(gl);
 
-  var size = gl.getParameter(gl.MAX_RENDERBUFFER_SIZE);
-  debug("max render buffer size: " + size);
-  size = size / 2;
-  debug("size used: " + size);
+    function createFBO() {
+      var tex = gl.createTexture();
+      gl.bindTexture(gl.TEXTURE_2D, tex);
+      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
+      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
+      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
+      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
+      gl.texImage2D(gl.TEXTURE_2D,
+                    0,                 // level
+                    gl.RGBA,           // internalFormat
+                    size,              // width
+                    size,              // height
+                    0,                 // border
+                    gl.RGBA,           // format
+                    gl.UNSIGNED_BYTE,  // type
+                    null);             // data
+      var fb = gl.createFramebuffer();
+      gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
+      gl.framebufferTexture2D(
+          gl.FRAMEBUFFER,
+          gl.COLOR_ATTACHMENT0,
+          gl.TEXTURE_2D,
+          tex,
+          0);
+      var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
+      if (status != gl.FRAMEBUFFER_COMPLETE) {
+        testFailed("gl.checkFramebufferStatus() returned " + WebGLDebugUtils.glEnumToString(status));
+        return;
+      }
+      var err = gl.getError();
+      if (err != gl.NO_ERROR) {
+        if (err != gl.OUT_OF_MEMORY) {
+          testFailed("gl.getError returned " + err);
+        }
+        return;
+      }
+      return { fb: fb, tex: tex };
+    }
+
+    gl.disable(gl.DEPTH_TEST);
 
-  var allocateFramebuffers = true;
-  var intervalId = 0;
-  var count = 0;
+    var maxFBOs = 2;
+    for (var ii = 0; ii < maxFBOs; ++ii) {
+      createFBO();
+      var t = createFBO();
+      if (!t) {
+        break;
+      }
+      tex = t.tex;
+      fb = t.fb;
 
-  WebGLDebugUtils.init(gl);
+      gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
+      gl.scissor(0, 0, size, size);
+      gl.clearColor(0, ii / maxFBOs, 1 - ii / maxFBOs, 1);
+      gl.clear(gl.COLOR_BUFFER_BIT);
+      g_textures.push(tex);
+    }
+
+    debug("fbos allocated:" + g_textures.length);
+    gl.scissor(0, 0, 1024, 1024);
+    gl.bindFramebuffer(gl.FRAMEBUFFER, null);
+
+    var vertexObject = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
+    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
+       -1,1,0, 1,1,0, -1,-1,0,
+       -1,-1,0, 1,1,0, 1,-1,0
+     ]), gl.STATIC_DRAW);
+    gl.enableVertexAttribArray(0);
+    gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
 
-  function createFBO() {
-    var tex = gl.createTexture();
-    gl.bindTexture(gl.TEXTURE_2D, tex);
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
+    var vertexObject = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
+    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 0,0, 1,0, 0,1,
+       0,1, 1,0, 1,1
+     ]), gl.STATIC_DRAW);
+    gl.enableVertexAttribArray(1);
+    gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0);
+
+    g_texLoc = gl.getUniformLocation(gl.program, "tex");
+    gl.uniform1i(g_texLoc, 0);
+    g_worldLoc = gl.getUniformLocation(gl.program, "world");
+    gl.uniformMatrix4fv(g_worldLoc, false, [
+       0, 0, 0, 0,
+       0, 0, 0, 0,
+       0, 0, 1, 0,
+       0, 0, 0, 1]);
+
+    setInterval(render, 1000/60);
+  }
+
+  var g_angle = 0;
+  var g_texIndex = 0;
+  function render() {
+    g_angle += 0.1;
+    g_texIndex++;
+    if (g_texIndex >= g_textures.length) {
+      g_texIndex = 0;
+    }
+    gl.bindTexture(gl.TEXTURE_2D, g_textures[g_texIndex]);
     gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
     gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
-    gl.texImage2D(gl.TEXTURE_2D,
-                  0,                 // level
-                  gl.RGBA,           // internalFormat
-                  size,              // width
-                  size,              // height
-                  0,                 // border
-                  gl.RGBA,           // format
-                  gl.UNSIGNED_BYTE,  // type
-                  null);             // data
-    var fb = gl.createFramebuffer();
-    gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
-    gl.framebufferTexture2D(
-        gl.FRAMEBUFFER,
-        gl.COLOR_ATTACHMENT0,
-        gl.TEXTURE_2D,
-        tex,
-        0);
-    var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
-    if (status != gl.FRAMEBUFFER_COMPLETE) {
-      testFailed("gl.checkFramebufferStatus() returned " + WebGLDebugUtils.glEnumToString(status));
-      return;
-    }
-    var err = gl.getError();
-    if (err != gl.NO_ERROR) {
-      if (err != gl.OUT_OF_MEMORY) {
-        testFailed("gl.getError returned " + err);
-      }
-      return;
-    }
-    return { fb: fb, tex: tex };
-  }
-
-  gl.disable(gl.DEPTH_TEST);
-
-  var maxFBOs = 128;
-  for (var ii = 0; ii < maxFBOs; ++ii) {
-    createFBO();
-    var t = createFBO();
-    if (!t) {
-      break;
-    }
-    tex = t.tex;
-    fb = t.fb;
-
-    gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
-    gl.scissor(0, 0, size, size);
-    gl.clearColor(0, ii / maxFBOs, 1 - ii / maxFBOs, 1);
-    gl.clear(gl.COLOR_BUFFER_BIT);
-    g_textures.push(tex);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
+    gl.uniformMatrix4fv(g_worldLoc, false, rotationZ(g_angle));
+    gl.clearColor(1,0,0,1);
+    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
+    gl.drawArrays(gl.TRIANGLES, 0, 6);
   }
-
-  debug("fbos allocated:" + g_textures.length);
-  gl.scissor(0, 0, 1024, 1024);
-  gl.bindFramebuffer(gl.FRAMEBUFFER, null);
-
-  var vertexObject = gl.createBuffer();
-  gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
-  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
-     -1,1,0, 1,1,0, -1,-1,0,
-     -1,-1,0, 1,1,0, 1,-1,0
-   ]), gl.STATIC_DRAW);
-  gl.enableVertexAttribArray(0);
-  gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
-
-  var vertexObject = gl.createBuffer();
-  gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
-  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 0,0, 1,0, 0,1,
-     0,1, 1,0, 1,1
-   ]), gl.STATIC_DRAW);
-  gl.enableVertexAttribArray(1);
-  gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0);
-
-  g_texLoc = gl.getUniformLocation(gl.program, "tex");
-  gl.uniform1i(g_texLoc, 0);
-  g_worldLoc = gl.getUniformLocation(gl.program, "world");
-  gl.uniformMatrix4fv(g_worldLoc, false, [
-     0, 0, 0, 0,
-     0, 0, 0, 0,
-     0, 0, 1, 0,
-     0, 0, 0, 1]);
-
-  setInterval(render, 1000/60);
-}
-
-var g_angle = 0;
-var g_texIndex = 0;
-function render() {
-  g_angle += 0.1;
-  g_texIndex++;
-  if (g_texIndex >= g_textures.length) {
-    g_texIndex = 0;
-  }
-  gl.bindTexture(gl.TEXTURE_2D, g_textures[g_texIndex]);
-  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
-  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
-  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
-  gl.uniformMatrix4fv(g_worldLoc, false, rotationZ(g_angle));
-  gl.clearColor(1,0,0,1);
-  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
-  gl.drawArrays(gl.TRIANGLES, 0, 6);
 }
 
 /**
  * Creates a 4-by-4 matrix which rotates around the z-axis by the given angle.
  * @param {number} angle The angle by which to rotate (in radians).
  * @return {!o3djs.math.Matrix4} The rotation matrix.
  */
 function rotationZ(angle) {
--- a/content/canvas/test/webgl/extra/canvas-compositing-test.html
+++ b/content/canvas/test/webgl/extra/canvas-compositing-test.html
@@ -24,17 +24,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 -->
 
 <!DOCTYPE html>
 <html>
   <head>
     <title>Canvas Compositing Test</title>
     <link rel="stylesheet" href="../resources/js-test-style.css"/>
     <script src="../resources/js-test-pre.js"></script>
-    <script src="../fast/resources/webgl-test.js"> </script>
+    <script src="../conformance/resources/webgl-test.js"> </script>
 </head>
 <body>
 Below are 2 50x50 pixel canvas but using CSS to display them at 100x100 pixels. <br/>
 They are solid black with a red triangle<br/>
 They each have a 10px CSS solid black border around them.<br/>
 Depending on how the browser composites the canvas with the page  they will get
 a white outline<hr/>
 <div>
--- a/content/canvas/test/webgl/extra/fbo-lost-context.html
+++ b/content/canvas/test/webgl/extra/fbo-lost-context.html
@@ -8,41 +8,42 @@ found in the LICENSE file.
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 <title>WebGL FBO Lost Context Test</title>
 <link rel="stylesheet" href="../resources/js-test-style.css"/>
 <script src="../resources/desktop-gl-constants.js" type="text/javascript"></script>
 <script src="../../debug/webgl-debug.js"></script>
 <script src="../resources/js-test-pre.js"></script>
-<script src="../fast/resources/webgl-test.js"></script>
+<script src="../conformance/resources/webgl-test.js"></script>
 </head>
 <body>
 <div id="description"></div>
 <div id="console"></div>
-    <script id="vshader" type="x-shader/x-vertex">
-        attribute vec4 vPosition;
-        attribute vec2 texCoord0;
-        uniform mat4 world;
-        varying vec2 texCoord;
-        void main()
-        {
-            gl_Position = vPosition * world;
-            texCoord = texCoord0;
-        }
-    </script>
+<script id="vshader" type="x-shader/x-vertex">
+attribute vec4 vPosition;
+attribute vec2 texCoord0;
+uniform mat4 world;
+varying vec2 texCoord;
+void main()
+{
+    gl_Position = vPosition * world;
+    texCoord = texCoord0;
+}
+</script>
 
-    <script id="fshader" type="x-shader/x-fragment">
-    uniform sampler2D tex;
-        varying vec2 texCoord;
-        void main()
-        {
-            gl_FragColor = texture2D(tex, texCoord);
-        }
-    </script>
+<script id="fshader" type="x-shader/x-fragment">
+precision mediump float;
+uniform sampler2D tex;
+varying vec2 texCoord;
+void main()
+{
+    gl_FragColor = texture2D(tex, texCoord);
+}
+</script>
 <canvas id="canvas" width="1024" height="1024"> </canvas>
 <script>
 description("This test is to help see if an WebGL app *can* get lost context.");
 
 debug("");
 debug("Canvas.getContext");
 var g_worldLoc;
 var g_texLoc;
--- a/content/canvas/test/webgl/extra/lots-of-polys-example.html
+++ b/content/canvas/test/webgl/extra/lots-of-polys-example.html
@@ -13,64 +13,72 @@ found in the LICENSE file.
 <script src="../conformance/resources/webgl-test-utils.js"> </script>
 </head>
 <body>
 <canvas id="example" width="1024" height="1024" style="width: 40px; height: 40px;">
 </canvas>
 <div id="description"></div>
 <div id="console"></div>
 <script>
-var wtu = WebGLTestUtils;
-var canvas = document.getElementById("example");
-var gl = wtu.create3DContext(canvas);
-var program = wtu.setupTexturedQuad(gl);
+window.onload = init;
+debug("Tests a WebGL program that draws a bunch of large polygons");
 
-assertMsg(gl.getError() == gl.NO_ERROR, "Should be no errors from setup.");
-
-var tex = gl.createTexture();
-gl.enable(gl.BLEND);
-gl.disable(gl.DEPTH_TEST);
+function init() {
+  if (confirm(
+      "after clicking ok your machine may be come unresponsive or crash")) {
+    main();
+  } else {
+    debug("cancelled");
+  }
+}
 
-wtu.fillTexture(gl, tex, 4096, 4096, [0, 192, 128, 255], 0);
-wtu.glErrorShouldBe(gl, gl.NO_ERROR, "after creating texture");
+function main() {
+  var wtu = WebGLTestUtils;
+  var canvas = document.getElementById("example");
+  var gl = wtu.create3DContext(canvas);
+  var program = wtu.setupTexturedQuad(gl);
 
-gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
-gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
-gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
-gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
-wtu.glErrorShouldBe(gl, gl.NO_ERROR, "after setting texture params");
+  assertMsg(gl.getError() == gl.NO_ERROR, "Should be no errors from setup.");
 
-var loc = gl.getUniformLocation(program, "tex");
-wtu.glErrorShouldBe(gl, gl.NO_ERROR, "after getting tex locations");
-gl.uniform1i(loc, 0);
-wtu.glErrorShouldBe(gl, gl.NO_ERROR, "after setting tex uniform");
+  var tex = gl.createTexture();
+  gl.enable(gl.BLEND);
+  gl.disable(gl.DEPTH_TEST);
+
+  wtu.fillTexture(gl, tex, 4096, 4096, [0, 192, 128, 255], 0);
+  wtu.glErrorShouldBe(gl, gl.NO_ERROR, "after creating texture");
 
-var numQuads = 100000;
-var indexBuf = new ArrayBuffer(numQuads * 6);
-var indices = new Uint8Array(indexBuf);
-for (var ii = 0; ii < numQuads; ++ii) {
-  var offset = ii * 6;
-  indices[offset + 0] = 0;
-  indices[offset + 1] = 1;
-  indices[offset + 2] = 2;
-  indices[offset + 3] = 3;
-  indices[offset + 4] = 4;
-  indices[offset + 5] = 5;
+  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
+  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
+  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
+  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
+  wtu.glErrorShouldBe(gl, gl.NO_ERROR, "after setting texture params");
+
+  var loc = gl.getUniformLocation(program, "tex");
+  wtu.glErrorShouldBe(gl, gl.NO_ERROR, "after getting tex locations");
+  gl.uniform1i(loc, 0);
+  wtu.glErrorShouldBe(gl, gl.NO_ERROR, "after setting tex uniform");
+
+  var numQuads = 100000;
+  var indexBuf = new ArrayBuffer(numQuads * 6);
+  var indices = new Uint8Array(indexBuf);
+  for (var ii = 0; ii < numQuads; ++ii) {
+    var offset = ii * 6;
+    indices[offset + 0] = 0;
+    indices[offset + 1] = 1;
+    indices[offset + 2] = 2;
+    indices[offset + 3] = 3;
+    indices[offset + 4] = 4;
+    indices[offset + 5] = 5;
+  }
+  var indexBuffer = gl.createBuffer();
+  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
+  gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);
+  wtu.glErrorShouldBe(gl, gl.NO_ERROR, "after creating index buffer");
+  gl.drawElements(gl.TRIANGLES, numQuads * 6, gl.UNSIGNED_BYTE, 0);
+  wtu.glErrorShouldBe(gl, gl.NO_ERROR, "after drawing");
+
+  successfullyParsed = true;
 }
-var indexBuffer = gl.createBuffer();
-gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
-gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);
-wtu.glErrorShouldBe(gl, gl.NO_ERROR, "after creating index buffer");
-gl.drawElements(gl.TRIANGLES, numQuads * 6, gl.UNSIGNED_BYTE, 0);
-wtu.glErrorShouldBe(gl, gl.NO_ERROR, "after drawing");
-
-successfullyParsed = true;
 </script>
 </body>
-<script src="../resources/js-test-post.js"></script>
-
-<script>
-</script>
-
-</body>
 </html>
 
 
--- a/content/canvas/test/webgl/extra/out-of-memory.html
+++ b/content/canvas/test/webgl/extra/out-of-memory.html
@@ -3,28 +3,28 @@ Copyright (c) 2009 The Chromium Authors.
 Use of this source code is governed by a BSD-style license that can be
 found in the LICENSE file.
 -->
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>WebGL Out Of Memory Conformance Tests</title>
+<title>WebGL Out Of Memory Test</title>
 <link rel="stylesheet" href="../resources/js-test-style.css"/>
 <script src="../resources/desktop-gl-constants.js" type="text/javascript"></script>
 <script src="../resources/js-test-pre.js"></script>
-<script src="../fast/resources/webgl-test.js"></script>
+<script src="../conformance/resources/webgl-test.js"></script>
 </head>
 <body>
 <div id="description"></div>
 <div id="console"></div>
 <canvas id="canvas" width="2" height="2"> </canvas>
 <script>
-description("This tests WebGL running out of memory.");
+debug("This tests WebGL running out of memory.");
 
 debug("");
 debug("Canvas.getContext");
 
 var gl = create3DContext(document.getElementById("canvas"));
 if (!gl) {
   testFailed("context does not exist");
 } else {
--- a/content/canvas/test/webgl/extra/out-of-resources.html
+++ b/content/canvas/test/webgl/extra/out-of-resources.html
@@ -8,94 +8,102 @@ found in the LICENSE file.
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 <title>WebGL Out Of Resources Test</title>
 <link rel="stylesheet" href="../resources/js-test-style.css"/>
 <script src="../resources/desktop-gl-constants.js" type="text/javascript"></script>
 <script src="../../debug/webgl-debug.js"></script>
 <script src="../resources/js-test-pre.js"></script>
-<script src="../fast/resources/webgl-test.js"></script>
+<script src="../conformance/resources/webgl-test.js"></script>
 </head>
 <body>
 <div id="description"></div>
 <div id="console"></div>
 <canvas id="canvas" width="2" height="2"> </canvas>
 <canvas id="canvas2" width="2" height="2"> </canvas>
 <script>
-description("This test is to check what happens if a WebGL program tries to use all of vram.");
-
-debug("");
-debug("Canvas.getContext");
-
-var gl = create3DContext(document.getElementById("canvas"));
-if (!gl) {
-  testFailed("context does not exist");
-} else {
-  testPassed("context exists");
-
-  debug("");
-  debug("Checking for out of memory handling.");
-
-  var size = gl.getParameter(gl.MAX_RENDERBUFFER_SIZE);
-  debug("max render buffer size: " + size);
-
-  var allocateFramebuffers = true;
-  var itervalId;
-  var count = 0;
-
-  gl = WebGLDebugUtils.makeDebugContext(gl, function(err, functionName, args) {
-        window.clearInterval(intervalId);
-        assertMsg(err == gl.OUT_OF_MEMORY,
-                  "correctly returns gl.OUT_OF_MEMORY when out of memory");
-        finish();
-      });
+window.onload = init;
+debug("Tests a WebGL program that tries to use all of vram.");
 
-  intervalId = window.setInterval(function() {
-    ++count;
-    var mem = count * size * size * 4;
-    debug("#" + count + " : memory allocated so far " + (mem / 1024 / 1024) + "MB");
-    var tex = gl.createTexture();
-    gl.bindTexture(gl.TEXTURE_2D, tex);
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
-    gl.texImage2D(gl.TEXTURE_2D,
-                  0,                 // level
-                  gl.RGBA,           // internalFormat
-                  size,              // width
-                  size,              // height
-                  0,                 // border
-                  gl.RGBA,           // format
-                  gl.UNSIGNED_BYTE,  // type
-                  null);             // data
-    if (allocateFrameBuffers) {
-      var fb = gl.createFramebuffer();
-      gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
-      gl.framebufferTexture2D(
-          gl.FRAMEBUFFER,
-          gl.COLOR_ATTACHMENT0,
-          gl.TEXTURE_2D,
-          tex,
-          0);
-      var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
-      if (status != gl.FRAMEBUFFER_COMPLETE) {
-        testFailed("gl.checkFramebufferStatus() returned " + WebGLDebugUtils.glEnumToString(status) +
-                   " should have gotten gl.OUT_OF_MEMORY before getting this.");
-        window.clearInterval(intervalId);
-        finish();
-      }
-    }
-  }, 1000/10);
+function init() {
+  if (confirm(
+      "after clicking ok your machine may be come unresponsive or crash")) {
+    main();
+  } else {
+    debug("cancelled");
+  }
 }
 
-function finish() {
+function main() {
   debug("");
-  successfullyParsed = true;
-}
+  debug("Canvas.getContext");
+
+  var gl = create3DContext(document.getElementById("canvas"));
+  if (!gl) {
+    testFailed("context does not exist");
+  } else {
+    testPassed("context exists");
+
+    debug("");
+    debug("Checking for out of memory handling.");
+
+    var size = gl.getParameter(gl.MAX_RENDERBUFFER_SIZE);
+    debug("max render buffer size: " + size);
+
+    var allocateFramebuffers = true;
+    var itervalId;
+    var count = 0;
+
+    gl = WebGLDebugUtils.makeDebugContext(gl, function(err, functionName, args) {
+          window.clearInterval(intervalId);
+          assertMsg(err == gl.OUT_OF_MEMORY,
+                    "correctly returns gl.OUT_OF_MEMORY when out of memory");
+          finish();
+        });
 
+    intervalId = window.setInterval(function() {
+      ++count;
+      var mem = count * size * size * 4;
+      debug("#" + count + " : memory allocated so far " + (mem / 1024 / 1024) + "MB");
+      var tex = gl.createTexture();
+      gl.bindTexture(gl.TEXTURE_2D, tex);
+      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
+      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
+      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
+      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
+      gl.texImage2D(gl.TEXTURE_2D,
+                    0,                 // level
+                    gl.RGBA,           // internalFormat
+                    size,              // width
+                    size,              // height
+                    0,                 // border
+                    gl.RGBA,           // format
+                    gl.UNSIGNED_BYTE,  // type
+                    null);             // data
+      if (allocateFrameBuffers) {
+        var fb = gl.createFramebuffer();
+        gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
+        gl.framebufferTexture2D(
+            gl.FRAMEBUFFER,
+            gl.COLOR_ATTACHMENT0,
+            gl.TEXTURE_2D,
+            tex,
+            0);
+        var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
+        if (status != gl.FRAMEBUFFER_COMPLETE) {
+          testFailed("gl.checkFramebufferStatus() returned " + WebGLDebugUtils.glEnumToString(status) +
+                     " should have gotten gl.OUT_OF_MEMORY before getting this.");
+          window.clearInterval(intervalId);
+          finish();
+        }
+      }
+    }, 1000/10);
+  }
+
+  function finish() {
+    debug("");
+    successfullyParsed = true;
+  }
+}
 </script>
-<script>
-</script>
-
 </body>
 </html>
--- a/content/canvas/test/webgl/extra/slow-shader-example.html
+++ b/content/canvas/test/webgl/extra/slow-shader-example.html
@@ -23,16 +23,19 @@ precision mediump float;
 #endif
 uniform sampler2D tex;
 varying vec2 texCoord;
 void main() {
   gl_FragColor = texture2D(tex, texture2D(tex, texture2D(tex, texCoord).xy).xy);
 }
 </script>
 <script>
+window.onload = main;
+
+debug("Tests drawing a very slow shader.");
 var wtu = WebGLTestUtils;
 var canvas = document.getElementById("example");
 var gl = wtu.create3DContext(canvas);
 var texSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
 debug("Max Texture size: " + texSize);
 var shaderSource =
     document.getElementById("slow").text.replace(/\$size/g, texSize + ".0");
 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "after getting a context");
@@ -88,24 +91,25 @@ for (var ii = 0; ii < numQuads; ++ii) {
   indices[offset + 3] = 3;
   indices[offset + 4] = 4;
   indices[offset + 5] = 5;
 }
 var indexBuffer = gl.createBuffer();
 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
 gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);
 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "after setting up indices");
-alert("click to draw");
-gl.drawElements(gl.TRIANGLES, numQuads * 6, gl.UNSIGNED_BYTE, 0);
-wtu.glErrorShouldBe(gl, gl.NO_ERROR, "after drawing");
+
+function main () {
+  if (confirm(
+      "after clicking ok your machine may be come unresponsive or crash")) {
+    gl.drawElements(gl.TRIANGLES, numQuads * 6, gl.UNSIGNED_BYTE, 0);
+    wtu.glErrorShouldBe(gl, gl.NO_ERROR, "after drawing");
+  } else {
+    debug("cancelled");
+  }
+}
 
 successfullyParsed = true;
 </script>
 </body>
-<script src="../resources/js-test-post.js"></script>
-
-<script>
-</script>
-
-</body>
 </html>
 
 
--- a/content/canvas/test/webgl/more/util.js
+++ b/content/canvas/test/webgl/more/util.js
@@ -1225,17 +1225,17 @@ Sphere = {
     }
   }
 }
 
 Sphere.create();
 
 initGL_CONTEXT_ID = function(){
   var c = document.createElement('canvas');
-  var contextNames = ['experimental-webgl'];
+  var contextNames = ['webgl', 'experimental-webgl'];
   GL_CONTEXT_ID = null;
   for (var i=0; i<contextNames.length; i++) {
     try {
       if (c.getContext(contextNames[i])) {
         GL_CONTEXT_ID = contextNames[i];
         break;
       }
     } catch (e) {}
--- a/content/canvas/test/webgl/resources/js-test-pre.js
+++ b/content/canvas/test/webgl/resources/js-test-pre.js
@@ -85,21 +85,25 @@ function testPassed(msg)
 function testFailed(msg)
 {
     reportTestResultsToHarness(false, msg);
     debug('<span><span class="fail">FAIL</span> ' + escapeHTML(msg) + '</span>');
 }
 
 function areArraysEqual(_a, _b)
 {
-    if (_a.length !== _b.length)
+    try {
+        if (_a.length !== _b.length)
+            return false;
+        for (var i = 0; i < _a.length; i++)
+            if (_a[i] !== _b[i])
+                return false;
+    } catch (ex) {
         return false;
-    for (var i = 0; i < _a.length; i++)
-        if (_a[i] !== _b[i])
-            return false;
+    }
     return true;
 }
 
 function isMinusZero(n)
 {
     // the only way to tell 0 from -0 in JS is the fact that 1/-0 is
     // -Infinity instead of Infinity
     return n === 0 && 1/n < 0;
@@ -134,16 +138,17 @@ function evalAndLog(_a)
   debug(_a);
 
   var _av;
   try {
      _av = eval(_a);
   } catch (e) {
     testFailed(_a + " threw exception " + e);
   }
+  return _av;
 }
 
 function shouldBe(_a, _b)
 {
   if (typeof _a != "string" || typeof _b != "string")
     debug("WARN: shouldBe() expects string arguments");
   var exception;
   var _av;
@@ -261,16 +266,54 @@ function shouldBeUndefined(_a)
   if (exception)
     testFailed(_a + " should be undefined. Threw exception " + exception);
   else if (typeof _av == "undefined")
     testPassed(_a + " is undefined.");
   else
     testFailed(_a + " should be undefined. Was " + _av);
 }
 
+function shouldBeDefined(_a)
+{
+  var exception;
+  var _av;
+  try {
+     _av = eval(_a);
+  } catch (e) {
+     exception = e;
+  }
+
+  if (exception)
+    testFailed(_a + " should be defined. Threw exception " + exception);
+  else if (_av !== undefined)
+    testPassed(_a + " is defined.");
+  else
+    testFailed(_a + " should be defined. Was " + _av);
+}
+
+function shouldBeGreaterThanOrEqual(_a, _b) {
+    if (typeof _a != "string" || typeof _b != "string")
+        debug("WARN: shouldBeGreaterThanOrEqual expects string arguments");
+
+    var exception;
+    var _av;
+    try {
+        _av = eval(_a);
+    } catch (e) {
+        exception = e;
+    }
+    var _bv = eval(_b);
+
+    if (exception)
+        testFailed(_a + " should be >= " + _b + ". Threw exception " + exception);
+    else if (typeof _av == "undefined" || _av < _bv)
+        testFailed(_a + " should be >= " + _b + ". Was " + _av + " (of type " + typeof _av + ").");
+    else
+        testPassed(_a + " is >= " + _b);
+}
 
 function shouldThrow(_a, _e)
 {
   var exception;
   var _av;
   try {
      _av = eval(_a);
   } catch (e) {
--- a/content/canvas/test/webgl/webgl-conformance-tests.html
+++ b/content/canvas/test/webgl/webgl-conformance-tests.html
@@ -33,28 +33,22 @@ function start() {
 
   function create3DContext(canvas)
   {
     if (!canvas) {
       canvas = document.createElement("canvas");
     }
     var context = null;
     try {
-        context = canvas.getContext("experimental-webgl");
+        context = canvas.getContext("webgl");
     } catch(e) {
     }
-    if (!context) {
+		if (!context) {
       try {
-        context = canvas.getContext("webkit-3d");
-      } catch(e) {
-      }
-    }
-    if (!context) {
-      try {
-        context = canvas.getContext("moz-webgl");
+          context = canvas.getContext("experimental-webgl");
       } catch(e) {
       }
     }
     return context;
   }
 
   var reportType = WebGLTestHarnessModule.TestHarness.reportType;
 
@@ -236,17 +230,17 @@ function start() {
         break;
     };
   };
 
   var reporter = new Reporter();
   var iframe = document.getElementById("testframe");
   var testHarness = new WebGLTestHarnessModule.TestHarness(
       iframe,
-      '00_testFIXME_list.txt',
+      '00_test_list.txt',
       function(type, msg, success) {
         return reporter.reportFunc(type, msg, success);
       });
   window.webglTestHarness = testHarness;
   var button = document.getElementById("runTestsButton");
   button.onclick = function() {
     testHarness.runTests();
   };