tor-browser

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

DOMMatrix2DInit-validate-fixup.html (6164B)


      1 <!DOCTYPE html>
      2 <title>Geometry Interfaces: DOMMatrix2DInit validate and fixup</title>
      3 <link rel="help" href="https://drafts.fxtf.org/geometry/#dommatrixinit-dictionary">
      4 <link rel="help" href="https://html.spec.whatwg.org/multipage/#dom-context-2d-settransform">
      5 <script src="/resources/testharness.js"></script>
      6 <script src="/resources/testharnessreport.js"></script>
      7 <script src="support/dommatrix-test-util.js"></script>
      8 <canvas id=canvas hidden></canvas>
      9 <script>
     10 setup(() => {
     11  window.canvas = document.getElementById('canvas');
     12  window.ctx = canvas.getContext('2d');
     13  window.ctx.fillStyle = '#000';
     14 });
     15 
     16 function clearCanvas(ctx) {
     17  ctx.resetTransform();
     18  ctx.clearRect(0, 0, window.canvas.width, window.canvas.height);
     19 }
     20 
     21 function drawRectWithSetTransform(ctx, transform) {
     22  clearCanvas(ctx);
     23  ctx.setTransform(transform);
     24  ctx.fillRect(20, 20, 30, 30);
     25  return window.canvas.toDataURL();
     26 }
     27 
     28 function drawRectWithAddPathTransform(ctx, transform) {
     29  clearCanvas(ctx);
     30  var path = new Path2D();
     31  path.rect(20, 20, 30, 30);
     32  var transformedPath = new Path2D();
     33  if (transform === undefined) {
     34    transformedPath.addPath(path);
     35  } else {
     36    transformedPath.addPath(path, transform);
     37  }
     38  ctx.fill(transformedPath);
     39  return window.canvas.toDataURL();
     40 }
     41 
     42 var emptyCanvasURL = window.canvas.toDataURL();
     43 
     44 [
     45  {a: 1, m11: 2},
     46  {b: 0, m12: -1},
     47  {c: Infinity, m21: -Infinity},
     48  {d: 0, m22: NaN},
     49  {e: 1, m41: 1.00000001},
     50  {f: 0, m42: Number.MIN_VALUE},
     51 ].forEach(dict => {
     52  test(() => {
     53    ctx.resetTransform();
     54    assert_throws_js(TypeError, () => ctx.setTransform(dict));
     55  }, `setTransform(${format_dict(dict)}) (invalid)`);
     56 
     57  test(() => {
     58    assert_throws_js(TypeError, () => drawRectWithAddPathTransform(ctx, dict));
     59  }, `addPath(${format_dict(dict)}) (invalid)`);
     60 });
     61 
     62 test(() => {
     63  ctx.resetTransform();
     64  ctx.setTransform(1, 2, 3, 4, 5, 6);
     65  const matrix = ctx.getTransform();
     66  checkMatrix(matrix, matrix2D({m11: 1, m12: 2, m21: 3, m22: 4, m41: 5, m42: 6}));
     67 }, `setTransform (Sanity check without dictionary)`);
     68 
     69 test(() => {
     70  var ident = matrix2D({});
     71  var expectedResultURL = drawRectWithSetTransform(ctx, ident);
     72  var actualResultURL = drawRectWithAddPathTransform(ctx);
     73  assert_equals(actualResultURL, expectedResultURL);
     74 }, `addPath (Sanity check without second parameter)`);
     75 
     76 [
     77  // Input dict that are 2D
     78  [{},                             matrix2D({})],
     79  [{is2D: undefined},              matrix2D({})],
     80  [{a: 1, m11: 1},                 matrix2D({m11: 1})],
     81  [{b: 0, m12: undefined},         matrix2D({m12: 0})],
     82  [{c: 0, m21: 0},                 matrix2D({m21: 0})],
     83  [{c: 0, m21: -0},                matrix2D({m21: -0})],
     84  [{c: -0, m21: 0},                matrix2D({m21: 0})],
     85  [{c: -0, m21: -0},               matrix2D({m21: -0})],
     86  [{d: Infinity, m22: Infinity},   null], // setTransform: silently ignore / addPath: silently halt
     87  [{e: -Infinity, m41: -Infinity}, null], // setTransform: silently ignore / addPath: silently halt
     88  [{f: NaN, m42: NaN},             null], // setTransform: silently ignore / addPath: silently halt
     89  [{f: NaN, m42: NaN, is2D: true}, null], // setTransform: silently ignore / addPath: silently halt
     90  [{f: 0, m42: null},              matrix2D({m42: 0})], // null is converted to 0
     91  [{f: -0, m42: null},             matrix2D({m42: 0})], // null is converted to 0
     92  [{a: 2},                         matrix2D({m11: 2})],
     93  [{b: 2},                         matrix2D({m12: 2})],
     94  [{c: 2},                         matrix2D({m21: 2})],
     95  [{d: 2},                         matrix2D({m22: 2})],
     96  [{e: 2},                         matrix2D({m41: 2})],
     97  [{f: 2},                         matrix2D({m42: 2})],
     98  [{a: -0, b: -0, c: -0, d: -0, e: -0, f: -0},
     99                                   matrix2D({m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0})],
    100  [{a: -0, b: -0, c: -0, d: -0, e: -0, f: -0, is2D: true},
    101                                   matrix2D({m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0})],
    102  [{m11:2},                        matrix2D({m11: 2})],
    103  [{m12:2},                        matrix2D({m12: 2})],
    104  [{m21:2},                        matrix2D({m21: 2})],
    105  [{m22:2},                        matrix2D({m22: 2})],
    106  [{m41:2},                        matrix2D({m41: 2})],
    107  [{m42:2},                        matrix2D({m42: 2})],
    108  [{m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0},
    109                                   matrix2D({m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0})],
    110  [{m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0, is2D: true},
    111                                   matrix2D({m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0})],
    112  [{m13: 0, is2D: true},           matrix2D({})],
    113  [{m13: -0, is2D: true},          matrix2D({})],
    114  [{m14: 0, is2D: true},           matrix2D({})],
    115  [{m14: -0, is2D: true},          matrix2D({})],
    116  [{m23: 0, is2D: true},           matrix2D({})],
    117  [{m23: -0, is2D: true},          matrix2D({})],
    118  [{m24: 0, is2D: true},           matrix2D({})],
    119  [{m24: -0, is2D: true},          matrix2D({})],
    120  [{m31: 0, is2D: true},           matrix2D({})],
    121  [{m31: -0, is2D: true},          matrix2D({})],
    122  [{m32: 0, is2D: true},           matrix2D({})],
    123  [{m32: -0, is2D: true},          matrix2D({})],
    124  [{m33: 1, is2D: true},           matrix2D({})],
    125  [{m34: 0, is2D: true},           matrix2D({})],
    126  [{m34: -0, is2D: true},          matrix2D({})],
    127  [{m43: 0, is2D: true},           matrix2D({})],
    128  [{m43: -0, is2D: true},          matrix2D({})],
    129  [{m44: 1, is2D: true},           matrix2D({})],
    130  [{is2D: true},                   matrix2D({})],
    131 ].forEach(([dict, expected]) => {
    132  test(() => {
    133    ctx.resetTransform();
    134    ctx.setTransform(dict);
    135    const matrix = ctx.getTransform();
    136    checkMatrix(matrix, expected || matrix2D({}));
    137  }, `setTransform(${format_dict(dict)})`);
    138 
    139  test(() => {
    140    var expectedResultURL = expected ?
    141      drawRectWithSetTransform(ctx, expected) :
    142      emptyCanvasURL;
    143    var actualResultURL = drawRectWithAddPathTransform(ctx, dict);
    144    assert_equals(actualResultURL, expectedResultURL);
    145  }, `addPath(${format_dict(dict)})`);
    146 });
    147 </script>