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>