<!DOCTYPE HTML> <title>Test ImageBitmap on Worker</title> <meta charset="utf-8"> <script src="/tests/SimpleTest/SimpleTest.js"></script> <link rel="stylesheet" href="/tests/SimpleTest/test.css"> <body> <script type="text/javascript"> // The following tests is not enabled in Worker now: // create from a HTMLImageElement // create from a HTMLVideoElement // create from a HTMLCanvasElement // create from a CanvasRenderingContext2D // call CanvasRenderingContext2D.drawImage() // call CanvasRenderingContext2D.createPaattern() // test security error from an unclean HTHMLImageElemnt // test security error from an unclean HTHMLVideoElemnt // test security error from an tainted HTHMLCanvasElemnt // test security error from an tainted CanvasRenderingContext2D // Task constructor function function Task(aType, aWidth, aHeight, aMsg, aSource) { this.type = aType; this.width = aWidth; this.height = aHeight; this.msg = aMsg; this.source = aSource; } function TaskWithCrop(aType, aWidth, aHeight, aMsg, aSource, aSx, aSy, aSw, aSh) { Task.call(this, aType, aWidth, aHeight, aMsg, aSource); this.sx = aSx; this.sy = aSy; this.sw = aSw; this.sh = aSh; } TaskWithCrop.prototype = Object.create(Task.prototype); TaskWithCrop.prototype.constructor = TaskWithCrop; var WORKER_TASKS = { tasks: [], // an arrayf of Task objects dispatch: function() { if (this.tasks.length) { worker.postMessage(this.tasks.pop()); } else { worker.terminate(); SimpleTest.finish(); } }, }; var worker = new Worker("imagebitmap_on_worker.js"); worker.onmessage = function(event) { if (event.data.type == "status") { ok(event.data.status, event.data.msg); } else if (event.data.type == "doneTask") { WORKER_TASKS.dispatch(); } } function runTests() { ok(worker, "Worker created successfully."); // prepare an ImageData object var image = document.createElement('img'); var canvas = document.createElement('canvas'); var ctx = canvas.getContext('2d'); var imageData; image.src = "image_rgrg-256x256.png"; image.onload = function() { var width = image.naturalWidth; var height = image.naturalHeight; canvas.width = image.naturalWidth; canvas.height = image.naturalHeight; ctx.drawImage(image, 0, 0, image.naturalWidth, image.naturalHeight); imageData = ctx.getImageData(0, 0, image.naturalWidth, image.naturalHeight); // task: test soruce: an ImageData WORKER_TASKS.tasks.push(new Task("testImageData", width, height, "", imageData)); // task: test soruce: an ImageBitmap WORKER_TASKS.tasks.push(new Task("testImageBitmap", width, height, "", imageData)); // task: test soruce: a Blob canvas.toBlob(function(aBlob) { WORKER_TASKS.tasks.push(new Task("testBlob", width, height, "", aBlob)); }); }; // task: throw exception: general: sw == 0 || sh == 0 WORKER_TASKS.tasks.push(new TaskWithCrop("testException", 0, 0, "createImageBitmap should throw with 0 width/height", imageData, 0, 0, 0, 0)); // task: throw exception: general: source is a null WORKER_TASKS.tasks.push(new TaskWithCrop("testException", 0, 0, "createImageBitmap should throw with null source", null, 0, 0, 0, 0)); // task: throw exception: ImageData: an ImageData object whose data attribute is backed by a detached buffer var neuturedImageData = function getNeuturedImageData(imageData) { worker.postMessage(imageData.data.buffer, [imageData.data.buffer]); return imageData; }(ctx.getImageData(0, 0, 50, 50)); WORKER_TASKS.tasks.push(new TaskWithCrop("testException", neuturedImageData.width, neuturedImageData.height, "createImageBitmap should throw with neutured ImageData", neuturedImageData, 0, 0, neuturedImageData.width, neuturedImageData.height)); // task: throw exception: Blob: a corrupted blob function getCorruptedBlob(fileName) { var xhr = new XMLHttpRequest(); xhr.open("GET", fileName); xhr.responseType = "blob";//force the HTTP response, response-type header to be blob xhr.onload = function() { WORKER_TASKS.tasks.push(new Task("testException", 0, 0, "createImageBitmap should reject promise with corrupted blob", xhr.response)); } xhr.send(); } getCorruptedBlob("image_error-early.png"); // task: throw exception: Blob: non-image file function getNonImageFile(fileName) { var xhr = new XMLHttpRequest(); xhr.open("GET", fileName); xhr.responseType = "blob";//force the HTTP response, response-type header to be blob xhr.onload = function() { WORKER_TASKS.tasks.push(new Task("testException", 0, 0, "createImageBitmap should reject promise with non-image blob", xhr.response)); // start to dispatch tasks to worker WORKER_TASKS.dispatch(); } xhr.send(); } getNonImageFile("imagebitmap_on_worker.js"); // task: test bug : bug 1239300 WORKER_TASKS.tasks.push(new Task("testBug1239300")); } SimpleTest.waitForExplicitFinish(); addLoadEvent(runTests); </script> </body>