Bug 743615 - Tests. r=bent, a=blassey
authorBobby Holley <bobbyholley@gmail.com>
Tue, 24 Apr 2012 12:58:18 +0200
changeset 95512 bf3d41520582e8c03a4d835750fa548e5143d024
parent 95511 620dde7a187c4416ba2d4aed9590078145ba4084
child 95513 b88fba85586ba81d8709fbcdcc15a0b7e36a025a
push id886
push userlsblakk@mozilla.com
push dateMon, 04 Jun 2012 19:57:52 +0000
treeherdermozilla-beta@bbd8d5efd6d1 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbent, blassey
bugs743615
milestone14.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 743615 - Tests. r=bent, a=blassey
dom/tests/mochitest/bugs/Makefile.in
dom/tests/mochitest/bugs/test_bug743615.html
dom/tests/mochitest/bugs/utils_bug743615.js
dom/tests/mochitest/bugs/worker_bug743615.js
--- a/dom/tests/mochitest/bugs/Makefile.in
+++ b/dom/tests/mochitest/bugs/Makefile.in
@@ -152,12 +152,15 @@ include $(topsrcdir)/config/rules.mk
 		iframe_bug304459-2.html \
 		test_bug38959.html \
 		iframe_bug38959-1.html \
 		iframe_bug38959-2.html \
 		test_onerror_message.html \
 		test_bug735237.html \
 		test_bug739038.html \
 		test_bug740811.html \
+		test_bug743615.html \
+		utils_bug743615.js \
+		worker_bug743615.js \
 		$(NULL)
 
 libs:: 	$(_TEST_FILES)
 	$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)
new file mode 100644
--- /dev/null
+++ b/dom/tests/mochitest/bugs/test_bug743615.html
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=743615
+-->
+<head>
+  <meta charset="utf-8">
+  <title>Test for Bug 743615</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript" src="utils_bug743615.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=743615">Mozilla Bug 743615</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+<canvas id="c" width="200" height="200"><canvas>
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for structured cloning ImageData. **/
+
+SimpleTest.waitForExplicitFinish();
+window.addEventListener('message', windowMessage);
+startTest();
+
+function startTest() {
+  // Make an ImageData.
+  var ctx = document.getElementById('c').getContext('2d');
+  ctx.fillStyle = 'rgb(';
+  ctx.fillRect(30, 30, 50, 50);
+
+  // Make a blank ImageData.
+  var imageData = ctx.createImageData(200, 200);
+  is(imageData.data.length, imageData.width * imageData.height * 4,
+   'right size for data');
+
+  // Write some things into it.
+  var pattern = makePattern(imageData.data.length, 42, 7);
+  setPattern(imageData, pattern);
+  ok(checkPattern(imageData, pattern), 'Can read it back before sending');
+
+  // PostMessage it to ourselves.
+  window.postMessage({ imageData: imageData,
+                       pattern: pattern,
+                       dataRef: imageData.data }, '*');
+}
+
+function windowMessage(evt) {
+  // Check the pattern we received.
+  var imageData = evt.data.imageData;
+  var pattern = evt.data.pattern;
+  ok(checkPattern(imageData, pattern),
+     'postMessage from self worked correctly');
+
+  // We're not spec compliant on this yet.
+  todo_is(imageData.data, evt.data.dataRef,
+          'Should have backrefs for imagedata buffer');
+
+  // Make a new pattern, and send it to a worker.
+  pattern = makePattern(imageData.data.length, 4, 3);
+  setPattern(imageData, pattern);
+  var worker = new Worker('worker_bug743615.js');
+  worker.onmessage = workerMessage;
+  worker.postMessage( {imageData: imageData, pattern: pattern });
+}
+
+function workerMessage(evt) {
+  // Relay the results of the worker-side tests.
+  is(evt.data.statusMessage, 'PASS', evt.data.statusMessage);
+
+  // Test what the worker sent us.
+  ok(checkPattern(evt.data.imageData, evt.data.pattern),
+     'postMessage from worker worked correctly');
+
+  // All done.
+  SimpleTest.finish();
+}
+
+</script>
+</pre>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/dom/tests/mochitest/bugs/utils_bug743615.js
@@ -0,0 +1,25 @@
+function makePattern(len, start, inc) {
+  var pattern = [];
+  while(len) {
+    pattern.push(start);
+    start = (start + inc) % 256;
+    --len;
+  }
+  return pattern;
+}
+
+function setPattern(imageData, pattern) {
+  if (pattern.length != imageData.data.length)
+    throw Error('Invalid pattern');
+  for (var i = 0; i < pattern.length; ++i)
+    imageData.data[i] = pattern[i];
+}
+
+function checkPattern(imageData, pattern) {
+  if (pattern.length != imageData.data.length)
+    throw Error('Invalid pattern');
+  for (var i = 0; i < pattern.length; ++i)
+    if (imageData.data[i] != pattern[i])
+      return false;
+  return true;
+}
new file mode 100644
--- /dev/null
+++ b/dom/tests/mochitest/bugs/worker_bug743615.js
@@ -0,0 +1,38 @@
+importScripts('utils_bug743615.js');
+
+self.onmessage = function onMessage(evt) {
+  // Check the pattern that was sent.
+  var imageData = evt.data.imageData;
+  var pattern = evt.data.pattern;
+  var statusMessage = checkPattern(imageData, pattern)
+                       ? 'PASS' : 'Got corrupt typed array in worker';
+
+  // Check against the interface object.
+  if (!(imageData instanceof ImageData))
+    statusMessage += ", Bad interface object in worker";
+
+  // Check the getters.
+  if (imageData.width * imageData.height != imageData.data.length / 4) {
+    statusMessage += ", Bad ImageData getters in worker: "
+    statusMessage += [imageData.width, imageData.height].join(', ');
+  }
+
+  // Make sure that writing to .data is a no-op when not in strict mode.
+  var origData = imageData.data;
+  var threw = false;
+  try {
+    imageData.data = [];
+    imageData.width = 2;
+    imageData.height = 2;
+  } catch(e) { threw = true; }
+  if (threw || imageData.data !== origData)
+    statusMessage = statusMessage + ", Should silently ignore sets";
+
+
+
+  // Send back a new pattern.
+  pattern = makePattern(imageData.data.length, 99, 2);
+  setPattern(imageData, pattern);
+  self.postMessage({ statusMessage: statusMessage, imageData: imageData,
+                     pattern: pattern });
+}