Bug 742781 - Chrome mochitest for WEBGL_debug_renderer_info extension - r=bz
authorBenoit Jacob <bjacob@mozilla.com>
Wed, 17 Oct 2012 15:11:59 -0400
changeset 110570 e78db739d5896d2b023f3c05f64169ff4470db47
parent 110569 756d555fc3bfab21090da03c6a7e4ed66b573761
child 110575 e85d04cf1ed522c22da04a793af6110bd1cbb166
push id16615
push userbjacob@mozilla.com
push dateWed, 17 Oct 2012 19:12:23 +0000
treeherdermozilla-inbound@e78db739d589 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbz
bugs742781
milestone19.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 742781 - Chrome mochitest for WEBGL_debug_renderer_info extension - r=bz
content/canvas/test/Makefile.in
content/canvas/test/chrome/Makefile.in
content/canvas/test/chrome/nonchrome_webgl_debug_renderer_info.html
content/canvas/test/chrome/test_webgl_debug_renderer_info.html
--- a/content/canvas/test/Makefile.in
+++ b/content/canvas/test/Makefile.in
@@ -3,17 +3,17 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DEPTH		= @DEPTH@
 topsrcdir	= @top_srcdir@
 srcdir		= @srcdir@
 VPATH		= @srcdir@
 relativesrcdir  = @relativesrcdir@
-DIRS		+= webgl crossorigin
+DIRS		+= webgl crossorigin chrome
 
 # TEST_DIRS += compiled
 
 include $(DEPTH)/config/autoconf.mk
 MOCHITEST_FILES = \
 	test_canvas.html \
 	image_transparent50.png \
 	image_redtransparent.png \
new file mode 100644
--- /dev/null
+++ b/content/canvas/test/chrome/Makefile.in
@@ -0,0 +1,19 @@
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DEPTH           = @DEPTH@
+topsrcdir       = @top_srcdir@
+srcdir          = @srcdir@
+VPATH           = @srcdir@
+relativesrcdir  = @relativesrcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+MOCHITEST_CHROME_FILES = \
+	test_webgl_debug_renderer_info.html \
+	nonchrome_webgl_debug_renderer_info.html \
+	$(NULL)
+
+include $(topsrcdir)/config/rules.mk
new file mode 100644
--- /dev/null
+++ b/content/canvas/test/chrome/nonchrome_webgl_debug_renderer_info.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML>
+<html>
+<script>
+
+// This file has the portion of the test_webgl_renderer_info chrome mochitest
+// that has to run as non-chrome to check that this WebGL extension is not exposed to content
+
+// we can't call the chrome Mochitest ok() function ourselves from non-chrome code.
+// So we remote it to the chrome test.
+
+function ok(res, msg) {
+  // Note we post to ourselves as posting to the chrome code doesn't seem to work here.
+  // This works by having the chrome code put an event handler on our own window.
+  window.postMessage({ subTestFinished: true, result: res, message: msg }, "*");
+}
+
+function messageListener(e) {
+  // This is how the chrome test tells us to start running -- we have to wait for this
+  // message to avoid running before it's set up its event handler.
+  if (e.data == "run") {
+    run();
+  }
+}
+
+window.addEventListener("message", messageListener, true);
+
+function run() {
+  const UNMASKED_VENDOR_WEBGL = 0x9245;
+  const UNMASKED_RENDERER_WEBGL = 0x9246;
+
+  var canvas = document.createElement("canvas");
+  var gl = canvas.getContext("experimental-webgl");
+
+  ok(!gl.getError(), "getError on newly created WebGL context should return NO_ERROR");
+
+  ok(!gl.getParameter(UNMASKED_VENDOR_WEBGL) && gl.getError() == gl.INVALID_ENUM,
+      "Should not be able to query UNMASKED_VENDOR_WEBGL without having enabled the WEBGL_debug_renderer_info extension");
+  ok(!gl.getParameter(UNMASKED_RENDERER_WEBGL) && gl.getError() == gl.INVALID_ENUM,
+      "Should not be able to query UNMASKED_RENDERER_WEBGL without having enabled the WEBGL_debug_renderer_info extension");
+
+  var exts = gl.getSupportedExtensions();
+  ok(exts.indexOf("WEBGL_debug_renderer_info") == -1,
+      "WEBGL_debug_renderer_info should not be listed by getSupportedExtensions in non-chrome contexts");
+  var debugRendererInfoExtension = gl.getExtension("WEBGL_debug_renderer_info");
+  ok(!debugRendererInfoExtension,
+      "WEBGL_debug_renderer_info should not be available through getExtension in non-chrome contexts");
+
+  ok(!gl.getParameter(UNMASKED_VENDOR_WEBGL) && gl.getError() == gl.INVALID_ENUM,
+      "Should not be able to query UNMASKED_VENDOR_WEBGL if enabling WEBGL_debug_renderer_info failed");
+  ok(!gl.getParameter(UNMASKED_RENDERER_WEBGL) && gl.getError() == gl.INVALID_ENUM,
+      "Should not be able to query UNMASKED_RENDERER_WEBGL if enabling WEBGL_debug_renderer_info failed");
+
+  window.postMessage({allTestsFinished: true}, "*");
+}
+
+</script>
+</html>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/content/canvas/test/chrome/test_webgl_debug_renderer_info.html
@@ -0,0 +1,90 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=666446
+-->
+<head>
+  <title>Test for WEBGL_debug_renderer_info chrome-only extension</title>
+  <script type="application/javascript" src="chrome://mochikit/content/MochiKit/packed.js"></script>
+  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />
+</head>
+<body>
+
+<pre id="test">
+<script>
+
+const UNMASKED_VENDOR_WEBGL = 0x9245;
+const UNMASKED_RENDERER_WEBGL = 0x9246;
+
+function isNonEmptyString(s)
+{
+  return s && (typeof s) == "string";
+}
+
+function messageListener(e) {
+  if (e.data.allTestsFinished) {
+    SimpleTest.finish();
+  } else if (e.data.subTestFinished) {
+    ok(e.data.result, "content iframe: " + e.data.message);
+  }
+}
+
+function checkChromeCase(canvas) {
+
+  var gl = canvas.getContext("experimental-webgl");
+  ok(!gl.getError(), "getError on newly created WebGL context should return NO_ERROR");
+
+  ok(!gl.getParameter(UNMASKED_VENDOR_WEBGL) && gl.getError() == gl.INVALID_ENUM,
+     "Should not be able to query UNMASKED_VENDOR_WEBGL without having enabled the WEBGL_debug_renderer_info extension");
+  ok(!gl.getParameter(UNMASKED_RENDERER_WEBGL) && gl.getError() == gl.INVALID_ENUM,
+     "Should not be able to query UNMASKED_RENDERER_WEBGL without having enabled the WEBGL_debug_renderer_info extension");
+
+  var exts = gl.getSupportedExtensions();
+  ok(exts.indexOf("WEBGL_debug_renderer_info") != -1,
+     "WEBGL_debug_renderer_info should be listed by getSupportedExtensions in chrome contexts");
+  var debugRendererInfoExtension = gl.getExtension("WEBGL_debug_renderer_info");
+  ok(debugRendererInfoExtension,
+     "WEBGL_debug_renderer_info should be available through getExtension in chrome contexts");
+
+  ok(debugRendererInfoExtension.UNMASKED_VENDOR_WEBGL == UNMASKED_VENDOR_WEBGL,
+     "UNMASKED_VENDOR_WEBGL has the correct value");
+  ok(debugRendererInfoExtension.UNMASKED_RENDERER_WEBGL == UNMASKED_RENDERER_WEBGL,
+     "UNMASKED_RENDERER_WEBGL has the correct value");
+
+  ok(isNonEmptyString(gl.getParameter(UNMASKED_VENDOR_WEBGL)) && gl.getError() == gl.NO_ERROR,
+     "Should be able to query UNMASKED_VENDOR_WEBGL in chrome context with WEBGL_debug_renderer_info enabled");
+  ok(isNonEmptyString(gl.getParameter(UNMASKED_RENDERER_WEBGL)) && gl.getError() == gl.NO_ERROR,
+     "Should be able to query UNMASKED_RENDERER_WEBGL in chrome context with WEBGL_debug_renderer_info enabled");
+}
+
+function main()
+{
+  SimpleTest.waitForExplicitFinish();
+
+  checkChromeCase(document.createElement("canvas"));
+
+  // Now run the non-chrome code to verify the security of this WebGL chrome-only extension.
+
+  var iframe = document.createElement("iframe");
+  iframe.src = "http://mochi.test:8888/chrome/content/canvas/test/chrome/nonchrome_webgl_debug_renderer_info.html";
+
+  iframe.onload = function () {
+
+    // test that chrome can get WEBGL_debug_renderer_info on a canvas on the iframe...
+    // this is useful to check in itself, and is also useful so the subsequent non-chrome test
+    // will also test that doing so doesn't confuse our chrome-only check.
+    checkChromeCase(iframe.contentDocument.createElement("canvas"));
+
+    iframe.contentWindow.addEventListener("message", messageListener, false);
+    iframe.contentWindow.postMessage("run", "*");
+  };
+
+  document.body.appendChild(iframe);
+}
+
+window.onload = main;
+</script>
+</pre>
+</body>
+</html>