tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

offscreencanvas.transferrable.w.html (5212B)


      1 <!DOCTYPE html>
      2 <script src="/resources/testharness.js"></script>
      3 <script src="/resources/testharnessreport.js"></script>
      4 <script src="/html/canvas/resources/canvas-tests.js"></script>
      5 <link rel="help" href="https://html.spec.whatwg.org/#offscreencanvas">
      6 
      7 <script id="myWorker" type="text/worker">
      8 
      9 function isDataCloneError(funcStr, offscreenCanvas)
     10 {
     11    try {
     12        eval(funcStr);
     13    } catch (e) {
     14        if (e instanceof DOMException && e.name == "DataCloneError")
     15            return true;
     16        return false;
     17    }
     18 }
     19 
     20 function isInvalidStateError(funcStr, offscreenCanvas)
     21 {
     22    try {
     23        eval(funcStr);
     24    } catch (e) {
     25        if (e instanceof DOMException && e.name == "InvalidStateError")
     26            return true;
     27        return false;
     28    }
     29 }
     30 
     31 function testExceptionWith2DContext()
     32 {
     33    var offscreenCanvas = new OffscreenCanvas(10, 10);
     34    var ctx = offscreenCanvas.getContext('2d');
     35    return isInvalidStateError("self.postMessage(offscreenCanvas, [offscreenCanvas])", offscreenCanvas);
     36 }
     37 
     38 function testExceptionWithWebGLContext()
     39 {
     40    var offscreenCanvas = new OffscreenCanvas(10, 10);
     41    var ctx = offscreenCanvas.getContext('webgl');
     42    return isInvalidStateError("self.postMessage(offscreenCanvas, [offscreenCanvas])", offscreenCanvas);
     43 }
     44 
     45 function testExceptionWithDetachedOffscreenCanvas1()
     46 {
     47    var offscreenCanvas = new OffscreenCanvas(10, 10);
     48    self.postMessage(offscreenCanvas, [offscreenCanvas]);
     49    return isDataCloneError("self.postMessage(offscreenCanvas, [offscreenCanvas])", offscreenCanvas);
     50 }
     51 
     52 function testExceptionWithDetachedOffscreenCanvas2()
     53 {
     54    var offscreenCanvas = new OffscreenCanvas(10, 10);
     55    self.postMessage(offscreenCanvas, [offscreenCanvas]);
     56    return isInvalidStateError("offscreenCanvas.getContext('2d')", offscreenCanvas);
     57 }
     58 
     59 function testExceptionWithDetachedOffscreenCanvas3()
     60 {
     61    var offscreenCanvas = new OffscreenCanvas(10, 10);
     62    self.postMessage(offscreenCanvas, [offscreenCanvas]);
     63    return isInvalidStateError("offscreenCanvas.getContext('webgl')", offscreenCanvas);
     64 }
     65 
     66 self.onmessage = function(e) {
     67    switch(e.data) {
     68        case 'test1':
     69            var offscreenCanvas = new OffscreenCanvas(10, 10);
     70            self.postMessage(offscreenCanvas, [offscreenCanvas]);
     71            break;
     72        case 'test2':
     73            self.postMessage(testExceptionWith2DContext());
     74            break;
     75        case 'test3':
     76            self.postMessage(testExceptionWithWebGLContext());
     77            break;
     78        case 'test4':
     79            self.postMessage(testExceptionWithDetachedOffscreenCanvas1());
     80            break;
     81        case 'test5':
     82            self.postMessage(testExceptionWithDetachedOffscreenCanvas2());
     83            break;
     84        case 'test6':
     85            self.postMessage(testExceptionWithDetachedOffscreenCanvas3());
     86            break;
     87    }
     88 };
     89 
     90 </script>
     91 
     92 <script>
     93 function makeWorker(test) {
     94    var blob = new Blob([document.getElementById("myWorker").textContent]);
     95    var worker = new Worker(URL.createObjectURL(blob));
     96    worker.onerror = test.unreached_func("error");
     97    return worker;
     98 }
     99 
    100 async_test(function(t) {
    101    var worker = makeWorker(t);
    102    worker.addEventListener('message', t.step_func_done(function(msg) {
    103        assert_equals(msg.data.width, 10);
    104        assert_equals(msg.data.height, 10);
    105    }));
    106    worker.postMessage('test1');
    107 }, "Test that OffscreenCanvas's size is correct after being transferred from a worker.");
    108 
    109 async_test(function(t) {
    110    var worker = makeWorker(t);
    111    worker.addEventListener('message', t.step_func_done(function(msg) {
    112        assert_true(msg.data);
    113    }));
    114    worker.postMessage('test2');
    115 }, "Test that transfer an OffscreenCanvas that has a 2d context throws exception in a worker.");
    116 
    117 async_test(function(t) {
    118    var worker = makeWorker(t);
    119    worker.addEventListener('message', t.step_func_done(function(msg) {
    120        assert_true(msg.data);
    121    }));
    122    worker.postMessage('test3');
    123 }, "Test that transfer an OffscreenCanvas that has a webgl context throws exception in a worker.");
    124 
    125 async_test(function(t) {
    126    var worker = makeWorker(t);
    127    worker.addEventListener('message', t.step_func(function(msg) {
    128        if (msg.data == true || msg.data == false) {
    129            assert_true(msg.data);
    130            t.done();
    131        }
    132    }));
    133    worker.postMessage('test4');
    134 }, "Test that transfer an OffscreenCanvas twice throws exception in a worker.");
    135 
    136 async_test(function(t) {
    137    var worker = makeWorker(t);
    138    worker.addEventListener('message', t.step_func(function(msg) {
    139        if (msg.data == true || msg.data == false) {
    140            assert_true(msg.data);
    141            t.done();
    142        }
    143    }));
    144    worker.postMessage('test5');
    145 }, "Test that calling getContext('2d') on a detached OffscreenCanvas throws exception in a worker.");
    146 
    147 async_test(function(t) {
    148    var worker = makeWorker(t);
    149    worker.addEventListener('message', t.step_func(function(msg) {
    150        if (msg.data == true || msg.data == false) {
    151            assert_true(msg.data);
    152            t.done();
    153        }
    154    }));
    155    worker.postMessage('test6');
    156 }, "Test that calling getContext('webgl') on a detached OffscreenCanvas throws exception in a worker.");
    157 
    158 </script>