{
  "results": [
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.repeaty.coord1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.paint.repeaty.coord1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsl-clamp-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.fill.closed.unaffected.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.fill.closed.unaffected",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.measure.emHeights.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Testing emHeights",
          "status": "FAIL",
          "message": "assert_equals: ctx.measureText('A').emHeightAscent === 37.5 (got [undefined], expected 37.5[number]) expected (number) 37.5 but got (undefined) undefined"
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.fill.winding.add.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.fill.winding.add",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.isPointInPath.empty.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "isPointInPath() works when there is no path",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.image.destination-atop.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.get.type.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "getImageData() returns an ImageData object containing a Uint8ClampedArray object",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.font.parse.invalid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.font.parse.invalid",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.create2.zero.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageData(sw, sh) throws INDEX_SIZE_ERR if size is zero",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.image.source-out.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.image.source-out",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_005.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawFocusIfNeeded does draw a focus ring if the element is in focus and the user activated a particular focus ring.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.image.source-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.transformation.multiple.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Transformations are applied while building paths, not when drawing",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-rgba-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.attributes.shadowBlur.valid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.shadow.attributes.shadowBlur.valid",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.globalalpha.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "strokeRect is affected by globalAlpha",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.css-color-4-hsl-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "strokeRect() with Infinity/NaN is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.cone.cylinder.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.cone.cylinder",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.current.notrendered.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "currentColor is computed from the canvas element even when element is not rendered",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.image.transparent.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are not drawn for transparent parts of images",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.end.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() adds the end point of the arc to the subpath",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.transform.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Radial gradient coordinates are relative to the coordinate space at the time of filling",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arcTo.coincide.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arcTo() draws a straight line to P1 if P1 = P2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.name-4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.repeat.unrecognised.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.repeat.unrecognised",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/canvas_colorsandstyles_createlineargradient_001.htm",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "linear gradient from point to self draws nothing",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.transparent.destination-over.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.transparent.destination-over",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.colouralpha.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.interpolate.colouralpha",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.stroke.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn for strokes",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.negative.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() with negative radius throws INDEX_SIZE_ERR",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsl-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.hex2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.basic.type.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.basic.type",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.setTransform.multiple.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.transformation.setTransform.multiple",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/wide-gamut-canvas/transferFromImageBitmap.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Testing ImageBitmapRenderingContext: Source color space: srgb, pixel format: uint8, alpha: 0.5, intermediate color space: none",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        },
        {
          "name": "Testing ImageBitmapRenderingContext: Source color space: srgb, pixel format: uint8, alpha: 0.5, intermediate color space: default",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        },
        {
          "name": "Testing ImageBitmapRenderingContext: Source color space: srgb, pixel format: uint8, alpha: 1, intermediate color space: none",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        },
        {
          "name": "Testing ImageBitmapRenderingContext: Source color space: srgb, pixel format: uint8, alpha: 1, intermediate color space: default",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        },
        {
          "name": "Testing ImageBitmapRenderingContext: Source color space: srgb, pixel format: float16, alpha: 0.5, intermediate color space: none",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        },
        {
          "name": "Testing ImageBitmapRenderingContext: Source color space: srgb, pixel format: float16, alpha: 0.5, intermediate color space: default",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        },
        {
          "name": "Testing ImageBitmapRenderingContext: Source color space: srgb, pixel format: float16, alpha: 1, intermediate color space: none",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        },
        {
          "name": "Testing ImageBitmapRenderingContext: Source color space: srgb, pixel format: float16, alpha: 1, intermediate color space: default",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.repeat.case.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.repeat.case",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.selfintersect.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() with lineWidth > 2*radius is drawn sensibly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.globalAlpha.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() works for globalAlpha",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.pattern.alpha.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn correctly for partially-transparent fill patterns",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/imagebitmap/createImageBitmap-invalid-args.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageBitmap with an HTMLCanvasElement source and sw set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an HTMLCanvasElement source and sh set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an HTMLCanvasElement source and oversized (unallocatable) crop region",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an HTMLVideoElement source and sw set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an HTMLVideoElement source and sh set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an HTMLVideoElement source and oversized (unallocatable) crop region",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an HTMLVideoElement from a data URL source and sw set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an HTMLVideoElement from a data URL source and sh set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an HTMLVideoElement from a data URL source and oversized (unallocatable) crop region",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with a bitmap HTMLImageElement source and sw set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with a bitmap HTMLImageElement source and sh set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with a bitmap HTMLImageElement source and oversized (unallocatable) crop region",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with a vector HTMLImageElement source and sw set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with a vector HTMLImageElement source and sh set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with a vector HTMLImageElement source and oversized (unallocatable) crop region",
          "status": "FAIL",
          "message": "assert_throws: function \"() => { throw e }\" threw null, not an object"
        },
        {
          "name": "createImageBitmap with a bitmap SVGImageElement source and sw set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with a bitmap SVGImageElement source and sh set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with a bitmap SVGImageElement source and oversized (unallocatable) crop region",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with a vector SVGImageElement source and sw set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with a vector SVGImageElement source and sh set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with a vector SVGImageElement source and oversized (unallocatable) crop region",
          "status": "FAIL",
          "message": "assert_throws: function \"() => { throw e }\" threw null, not an object"
        },
        {
          "name": "createImageBitmap with an OffscreenCanvas source and sw set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an OffscreenCanvas source and sh set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an OffscreenCanvas source and oversized (unallocatable) crop region",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an ImageData source and sw set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an ImageData source and sh set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an ImageData source and oversized (unallocatable) crop region",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an ImageBitmap source and sw set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an ImageBitmap source and sh set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an ImageBitmap source and oversized (unallocatable) crop region",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with a Blob source and sw set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with a Blob source and sh set to 0",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with a Blob source and oversized (unallocatable) crop region",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with undefined image source.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with null image source.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with CanvasRenderingContext2D image source.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with WebGLRenderingContext image source.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with Uint8Array image source.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with ArrayBuffer image source.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with empty image source.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with empty video source.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an oversized canvas source.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an invalid OffscreenCanvas source.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an undecodable blob source.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with a broken image source.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an available but undecodable image source.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an available but zero height image source.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with an available but zero width image source.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap with a closed ImageBitmap.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/wide-gamut-canvas/ImageData-fidelity.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Verify that drawImage->getImageData round trip preserves color values when image metadata has no color space and canvas uses the default color space.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Verify that drawImage->getImageData round trip preserves color values when image metadata has srgb color space and canvas uses the srgb color space.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Verify that drawImage->getImageData round trip preserves color values when image metadata has no color space and canvas uses the srgb color space.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Verify that drawImage->getImageData round trip preserves color values when image metadata has srgb color space and canvas uses the default color space.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.clip.basic.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.clip.basic.1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.attributes.shadowBlur.invalid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.shadow.attributes.shadowBlur.invalid",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.current.removed.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "currentColor is solid black when the canvas element is not in a document",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.transparent.lighter.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.transparent.lighter",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.isPointInPath.basic.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "isPointInPath() detects whether the point is inside the path",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.stroke.unaffected.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Stroking does not start a new path or subpath",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.composite.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn using globalCompositeOperation",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.twopie.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() draws nothing when end = start + 2pi-e and anticlockwise",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.space.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "U+0020 is rendered the correct size (1em wide)",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.shape.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() from 0 to pi draws stuff in the right half",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-rgba-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.transparent-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.transparent-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/wide-gamut-canvas/canvas-draw-high-bit-depth-images.html",
      "status": "ERROR",
      "message": "Uncaught TypeError: Cannot read property 'length' of undefined",
      "subtests": [
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_sRGB_opaque.png vs 2x2_16bit_sRGB_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_sRGB_opaque.png vs 2x2_16bit_interlaced_sRGB_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_sRGB_transparent.png vs 2x2_16bit_sRGB_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_sRGB_transparent.png vs 2x2_16bit_interlaced_sRGB_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_AdobeRGB_opaque.png vs 2x2_16bit_AdobeRGB_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_AdobeRGB_opaque.png vs 2x2_16bit_interlaced_AdobeRGB_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_AdobeRGB_transparent.png vs 2x2_16bit_AdobeRGB_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_AdobeRGB_transparent.png vs 2x2_16bit_interlaced_AdobeRGB_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_DisplayP3_opaque.png vs 2x2_16bit_DisplayP3_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_DisplayP3_opaque.png vs 2x2_16bit_interlaced_DisplayP3_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_DisplayP3_transparent.png vs 2x2_16bit_DisplayP3_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_DisplayP3_transparent.png vs 2x2_16bit_interlaced_DisplayP3_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_ProPhoto_opaque.png vs 2x2_16bit_ProPhoto_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_ProPhoto_opaque.png vs 2x2_16bit_interlaced_ProPhoto_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_ProPhoto_transparent.png vs 2x2_16bit_ProPhoto_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_ProPhoto_transparent.png vs 2x2_16bit_interlaced_ProPhoto_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_Rec2020_opaque.png vs 2x2_16bit_Rec2020_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_Rec2020_opaque.png vs 2x2_16bit_interlaced_Rec2020_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_Rec2020_transparent.png vs 2x2_16bit_Rec2020_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, uint8. Testing 2x2_8bit_Rec2020_transparent.png vs 2x2_16bit_interlaced_Rec2020_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_sRGB_opaque.png vs 2x2_16bit_sRGB_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_sRGB_opaque.png vs 2x2_16bit_interlaced_sRGB_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_sRGB_transparent.png vs 2x2_16bit_sRGB_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_sRGB_transparent.png vs 2x2_16bit_interlaced_sRGB_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_AdobeRGB_opaque.png vs 2x2_16bit_AdobeRGB_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_AdobeRGB_opaque.png vs 2x2_16bit_interlaced_AdobeRGB_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_AdobeRGB_transparent.png vs 2x2_16bit_AdobeRGB_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_AdobeRGB_transparent.png vs 2x2_16bit_interlaced_AdobeRGB_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_DisplayP3_opaque.png vs 2x2_16bit_DisplayP3_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_DisplayP3_opaque.png vs 2x2_16bit_interlaced_DisplayP3_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_DisplayP3_transparent.png vs 2x2_16bit_DisplayP3_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_DisplayP3_transparent.png vs 2x2_16bit_interlaced_DisplayP3_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_ProPhoto_opaque.png vs 2x2_16bit_ProPhoto_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_ProPhoto_opaque.png vs 2x2_16bit_interlaced_ProPhoto_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_ProPhoto_transparent.png vs 2x2_16bit_ProPhoto_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_ProPhoto_transparent.png vs 2x2_16bit_interlaced_ProPhoto_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_Rec2020_opaque.png vs 2x2_16bit_Rec2020_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_Rec2020_opaque.png vs 2x2_16bit_interlaced_Rec2020_opaque.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_Rec2020_transparent.png vs 2x2_16bit_Rec2020_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        },
        {
          "name": "Canvas color params: srgb, float16. Testing 2x2_8bit_Rec2020_transparent.png vs 2x2_16bit_interlaced_Rec2020_transparent.png",
          "status": "TIMEOUT",
          "message": "Test timed out"
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex6.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.hex6",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.strokeStyle.default.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.strokeStyle.default",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.object.ctor.array.bounds.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "ImageData has a usable constructor",
          "status": "FAIL",
          "message": "assert_throws: function \"function() { new ImageData(new Uint8ClampedArray(0), 1); }\" threw object \"IndexSizeError: Failed to construct 'ImageData': The input data has zero elements.\" that is not a DOMException INVALID_STATE_ERR: property \"code\" is equal to 1, expected 11"
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.operation.clear.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.operation.clear",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsl-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsl-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.object.invalidoffset.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.object.invalidoffset",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/imagebitmap/createImageBitmap-origin.sub.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "cross-origin HTMLImageElement",
          "status": "PASS",
          "message": null
        },
        {
          "name": "cross-origin SVGImageElement",
          "status": "PASS",
          "message": null
        },
        {
          "name": "cross-origin HTMLVideoElement",
          "status": "PASS",
          "message": null
        },
        {
          "name": "redirected to cross-origin HTMLVideoElement",
          "status": "PASS",
          "message": null
        },
        {
          "name": "redirected to same-origin HTMLVideoElement",
          "status": "PASS",
          "message": null
        },
        {
          "name": "unclean HTMLCanvasElement",
          "status": "PASS",
          "message": null
        },
        {
          "name": "unclean ImageBitmap",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.operation.default.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.operation.default",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_004.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawFocusIfNeeded does draw a focus ring if the element is in focus.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.isPointInPath.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "isPointInPath() returns false for non-finite arguments",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.image.source-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.image.source-in",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "strokeRect of Nx0 pixels draws a closed line with no caps",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.crosscanvas.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.crosscanvas",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arcTo.coincide.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arcTo() has no effect if P0 = P1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgb-clamp-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.join.valid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Setting lineJoin to valid values works",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgba-num-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsla-8",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgb-clamp-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.put.path.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "putImageData() does not affect the current path",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.system.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.system",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsla-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arcTo.zero.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arcTo() with zero radius draws a straight line from P0 to P1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.cap.valid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Setting lineCap to valid values works",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsla-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsla-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.image.alpha.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn correctly for partially-transparent images",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsla-5",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.fill.closed.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.fill.closed.basic",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.canvas.transparent.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are not drawn for transparent canvases",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-paths-to-the-canvas/canvas_complexshapes_ispointInpath_001.htm",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "isPointInPath unaffected by transformation matrix",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.operation.casesensitive.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.operation.casesensitive",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fillRect.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.interpolate.zerosize.fillRect",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.bezierCurveTo.scaled.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.bezierCurveTo.scaled",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.isPointInPath.bigarc.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "isPointInPath() works on unclosed arcs larger than 2pi",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.image.xor.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.image.xor",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.lineTo.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "lineTo() with Infinity/NaN is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.image.undefined.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.image.undefined",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.solid.source-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.solid.source-in",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex7.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.hex7",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.object.readonly.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "ImageData objects properties are read-only",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.enable.blur.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn if shadowBlur is set",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.fillRect.clip.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fillRect is affected by clipping regions",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hex6.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hex6",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arcTo.ensuresubpath.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "If there is no subpath, the first control point is added (and nothing is drawn up to it)",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.rect.negative.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.rect.negative",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.closePath.newline.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.closePath.newline",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.clearRect.path.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "clearRect does not affect the current path",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.font.parse.size.percentage.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.font.parse.size.percentage",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgba-solid-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.gradient.transparent.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are not drawn for transparent parts of gradient fills",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.cone.beside.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.cone.beside",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.wrongtype.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Incorrect image types in drawImage do not match any defined overloads, so WebIDL throws a TypeError",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.alpha.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadow colour alpha components are used",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.pattern.destination-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fill.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.interpolate.zerosize.fill",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/imagebitmap/canvas-createImageBitmap-video-resize.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageBitmap(HTMLVideoElement) with resize option",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.isPointInPath.transform.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "isPointInPath() handles transformations correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.image.source-atop.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.image.source-atop",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.stroke.skew.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Strokes lines are skewed by the current transformation matrix",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsla-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.composite.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn using globalCompositeOperation",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.repeat.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.paint.repeat.basic",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.shadowBlur.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() works for shadowBlur",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.get.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "getImageData() throws TypeError if arguments are not finite",
          "status": "FAIL",
          "message": "assert_throws: function \"function() { ctx.getImageData(Infinity, 10, 10, 10); }\" did not throw"
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.repeat.undefined.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.repeat.undefined",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-rgba-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.clip.intersect.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.clip.intersect",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.rect.zero.6.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.rect.zero.6",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.stroke.prune.corner.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Zero-length line segments are removed before stroking with miters",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.touch2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.touch2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.put.null.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "putImageData() with null imagedata throws TypeError",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.stroke.join.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are not drawn for areas outside stroke joins",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.css-color-4-hsl-4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.pattern.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn for fill patterns",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.moveTo.multiple.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.moveTo.multiple",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.clearRect.zero.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "clearRect of zero pixels has no effect",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.canvas.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.canvas",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.align.right.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "textAlign right is the right of the last em square (not the bounding box)",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.draw.baseline.bottom.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "textBaseline bottom is the bottom of the em square (not the bounding box)",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arcTo.collinear.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arcTo() with all points on a line, and P2 between P0/P1, draws a straight line to P1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.twopie.3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() draws a full circle when end = start + 2pi+e and anticlockwise",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgb-eof.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgb-eof",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.clearRect.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "clearRect clears to transparent black",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.repeat.coord3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.paint.repeat.coord3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.pattern.source-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.isPointInPath.unclosed.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "isPointInPath() works on unclosed subpaths",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/wide-gamut-canvas/canvas-getImageData-e_srgb.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "tests drawing SRGB color on e-sRGB canvas and getting e-sRGB image data.",
          "status": "FAIL",
          "message": "Cannot read property 'length' of undefined"
        },
        {
          "name": "tests putting and getting in-range e-sRGB image data on e-sRGB canvas.",
          "status": "FAIL",
          "message": "Failed to execute 'createImageData' on 'CanvasRenderingContext2D': The source width is 0."
        },
        {
          "name": "tests putting and getting out-of-range e-sRGB image data on e-sRGB canvas.",
          "status": "FAIL",
          "message": "Failed to execute 'createImageData' on 'CanvasRenderingContext2D': The source width is 0."
        },
        {
          "name": "tests putting SRGB image data on e-sRGB canvas and getting e-sRGB image data.",
          "status": "FAIL",
          "message": "Failed to execute 'createImageData' on 'CanvasRenderingContext2D': The source width is 0."
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.operation.nullsuffix.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.operation.nullsuffix",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.linear.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createLinearGradient() throws TypeError if arguments are not finite",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.draw.space.collapse.other.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Space characters are converted to U+0020, and collapsed (per CSS)",
          "status": "FAIL",
          "message": "assert_approx_equals: Red channel of the pixel at (25, 25) expected 0 +/- 2 but got 255"
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.canvas.alpha.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn correctly for partially-transparent canvases",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.clip.unaffected.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.clip.unaffected",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.object.invalidcolour.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.object.invalidcolour",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.cap.square.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "lineCap 'square' is rendered correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/wide-gamut-canvas/imageData-colorSpace.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test default color settings: {undefined, undefined} -> {srgb, uint8}",
          "status": "FAIL",
          "message": "assert_array_equals: value is undefined, expected array"
        },
        {
          "name": "Test default color space: {undefined, float32} -> {srgb, float32}",
          "status": "FAIL",
          "message": "assert_equals: expected \"[object Float32Array]\" but got \"[object Undefined]\""
        },
        {
          "name": "Test default storage format: {srgb, undefined} -> {srgb, uint8}",
          "status": "FAIL",
          "message": "assert_array_equals: value is undefined, expected array"
        },
        {
          "name": "Test color settings: {srgb, uint8}",
          "status": "FAIL",
          "message": "assert_equals: expected \"[object Uint8ClampedArray]\" but got \"[object Undefined]\""
        },
        {
          "name": "Test color settings: {srgb, uint16}",
          "status": "FAIL",
          "message": "assert_equals: expected \"[object Uint16Array]\" but got \"[object Undefined]\""
        },
        {
          "name": "Test color settings: {srgb, float32}",
          "status": "FAIL",
          "message": "assert_equals: expected \"[object Float32Array]\" but got \"[object Undefined]\""
        }
      ]
    },
    {
      "test": "/2dcontext/image-smoothing/imagesmoothing.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "When the canvas context is created, imageSmoothingEnabled must be set to true.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "On getting imageSmoothingEnabled, the user agent must return the last value it was set to.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test that image smoothing is actually on by default and just the attribute value.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test that image smoothing works when imageSmoothingEnabled is set to true",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test that imageSmoothingEnabled = false (nearest-neighbor interpolation) works with drawImage().",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test that imageSmoothingEnabled = false (nearest-neighbor interpolation) works with fillRect and createPattern().",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test that imageSmoothingEnabled = false (nearest-neighbor interpolation) works with fill() and createPattern().",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test that imageSmoothingEnabled = false (nearest-neighbor interpolation) works with stroke() and createPattern().",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test that imageSmoothingEnabled = false (nearest-neighbor interpolation) still works after repaints.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.stroke.unaffected.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "strokeText does not start a new path or subpath",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.rect.newsubpath.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.rect.newsubpath",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.image.string.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.image.string",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.object.crosscanvas.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.object.crosscanvas",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsla-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.transform.identity.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "transform() with the identity matrix does nothing",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsl-clamp-4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.fill.source-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.attributes.shadowOffset.invalid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.shadow.attributes.shadowOffset.invalid",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsl-6.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsl-6",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.maxWidth.fontface.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fillText works on @font-face fonts",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.broken.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.broken",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.css-color-4-rgb-5",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arcTo.shape.curve2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arcTo() curves in the right kind of shape",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.initial.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.initial",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.isPointInPath.basic.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "isPointInPath() detects whether the point is inside the path",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/scroll/2d.scrollPathIntoView.path.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "scrollPathIntoView() with path argument works",
          "status": "FAIL",
          "message": "ctx.scrollPathIntoView is not a function"
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.fontface.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.draw.fontface",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgba-solid-4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.lineCap.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() works for lineCap",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.operation.highlight.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.operation.highlight",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.pattern.destination-atop.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgb-clamp-5",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.transparent.source-out.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.transparent.source-out",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.immediate.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.image.incomplete.immediate",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.width.transformed.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Line stroke widths are affected by scale transformations",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.negativedir.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Negative dimensions do not affect the direction of the image",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.baseline.default.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.baseline.default",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arcTo.shape.end.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arcTo() does not draw anything from P1 to P2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "strokeRect of 0x0 pixels draws nothing, including caps and joins",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.globalAlpha.default.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.globalAlpha.default",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.angle.5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() wraps angles mod 2pi when clockwise and start > end+2pi",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.measure.width.space.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Space characters are converted to U+0020 and collapsed (per CSS)",
          "status": "FAIL",
          "message": "assert_equals: ctx.measureText('A  B').width === 150 (got 200[number], expected 150[number]) expected 150 but got 200"
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arcTo.collinear.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arcTo() with all points on a line, and P1 between P0/P2, draws a straight line to P1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.zeroradius.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() with zero radius draws a line to the start point",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-rgb-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.transformation.changing.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Transformations are applied while building paths, not when drawing",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.touch1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.touch1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.outside.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.interpolate.outside",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.clearRect.transform.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "clearRect is affected by transforms",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgba-solid-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsl-clamp-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.stroke.prune.arc.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Zero-length line segments from arcTo and arc are removed before stroking",
          "status": "FAIL",
          "message": "assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255"
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.touch3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.touch3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsl-6",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-rgb-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.enable.off.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are not drawn when only shadowColor is set",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.image.scale.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn correctly for scaled images",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.get.source.outside.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "getImageData() returns transparent black outside the canvas",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.inside1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.inside1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.scale.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "scale() with Infinity/NaN is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.linear.transform.3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Linear gradient transforms do not experience broken caching effects",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/wide-gamut-canvas/canvas-drawImage-e_srgb.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Draw SRGB image on an e-sRGB canvas and read back the e-sRGB pixels.",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arcTo.scale.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arcTo scales the curve, not just the control points",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsl-4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsl-4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.vertical.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.interpolate.vertical",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.globalAlpha.canvaspattern.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.globalAlpha.canvaspattern",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.miter.acute.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Miter joins are drawn correctly with acute angles",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.hsla-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.cone.shape2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.cone.shape2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.repeaty.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.paint.repeaty.basic",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.transparent.destination-atop.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.transparent.destination-atop",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.put.wrongtype.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "putImageData() does not accept non-ImageData objects",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsla-clamp-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.stroke.empty.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Empty subpaths are not stroked",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsla-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsla-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.css-color-4-hsl-5",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.create1.type.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageData(imgdata) returns an ImageData object containing a Uint8ClampedArray object",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.join.bevel.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "lineJoin 'bevel' is rendered correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.shape.5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() from 0 to 5pi does not draw crazy things",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.colour.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.interpolate.colour",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.enable.y.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn if shadowOffsetY is set",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.basic.zerocanvas.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.basic.zerocanvas",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.shadowColor.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() works for shadowColor",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.repeat.unrecognisednull.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.repeat.unrecognisednull",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.font.parse.tiny.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.font.parse.tiny",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.miter.valid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Setting miterLimit to valid values works",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.path.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.path",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.alpha.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadow colour alpha components are used",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.lineWidth.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() works for lineWidth",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arcTo.transformation.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arcTo joins up to the last subpath point correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Draw 100x100 image to 100x100 canvas at 0,0.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel 0,0 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel 0,99 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel 99,0 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel 99,99 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 25,25 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 25,99 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 99,25 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 99,99 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 0,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 24,24 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 0,25 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 25,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 0,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 99,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 50,50 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 99,99 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 50,99 should be gray.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 99,50 should be gray.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 0,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 49,49 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 0,50 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 50,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 0,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 99,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 16, dh = 16 --- Pixel 50,50 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 16, dh = 16 --- Pixel 65,65 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 16, dh = 16 --- Pixel 50,65 should be gray.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 16, dh = 16 --- Pixel 65,50 should be gray.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 16, dh = 16 --- Pixel 0,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 16, dh = 16 --- Pixel 49,49 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 16, dh = 16 --- Pixel 49,66 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 16, dh = 16 --- Pixel 66,49 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 16, dh = 16 --- Pixel 66,66 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 16, dh = 16 --- Pixel 99,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 16, dh = 16 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 64, dh = 32 --- Pixel 50,50 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 64, dh = 32 --- Pixel 99,81 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 64, dh = 32 --- Pixel 50,81 should be gray.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 64, dh = 32 --- Pixel 99,50 should be gray.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 64, dh = 32 --- Pixel 0,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 64, dh = 32 --- Pixel 49,49 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 64, dh = 32 --- Pixel 49,82 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 64, dh = 32 --- Pixel 99,49 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 64, dh = 32 --- Pixel 99,82 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 64, dh = 32 --- Pixel 99,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 64, dh = 32 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel 0,0 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel 0,31 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel 31,0 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel 31,31 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel 0,32 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel 32,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel 32,32 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel 99,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 32, sh = 32, dx = 32, dy = 32, dw = 32, dh = 32 --- Pixel 32,32 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 32, sh = 32, dx = 32, dy = 32, dw = 32, dh = 32 --- Pixel 32,63 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 32, sh = 32, dx = 32, dy = 32, dw = 32, dh = 32 --- Pixel 63,32 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 32, sh = 32, dx = 32, dy = 32, dw = 32, dh = 32 --- Pixel 63,63 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 32, sh = 32, dx = 32, dy = 32, dw = 32, dh = 32 --- Pixel 0,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 32, sh = 32, dx = 32, dy = 32, dw = 32, dh = 32 --- Pixel 31,31 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 32, sh = 32, dx = 32, dy = 32, dw = 32, dh = 32 --- Pixel 31,64 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 32, sh = 32, dx = 32, dy = 32, dw = 32, dh = 32 --- Pixel 64,31 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 32, sh = 32, dx = 32, dy = 32, dw = 32, dh = 32 --- Pixel 64,64 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 32, sh = 32, dx = 32, dy = 32, dw = 32, dh = 32 --- Pixel 99,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 32, sh = 32, dx = 32, dy = 32, dw = 32, dh = 32 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 32, sy = 32, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel 0,0 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 32, sy = 32, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel 0,31 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 32, sy = 32, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel 31,0 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 32, sy = 32, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel 31,31 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 32, sy = 32, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel 0,32 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 32, sy = 32, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel 32,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 32, sy = 32, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel 32,32 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 32, sy = 32, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel 99,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 32, sy = 32, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 32, sy = 32, sw = 32, sh = 32, dx = 32, dy = 32, dw = -32, dh = -32 --- Pixel 0,0 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 32, sy = 32, sw = 32, sh = 32, dx = 32, dy = 32, dw = -32, dh = -32 --- Pixel 0,31 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 32, sy = 32, sw = 32, sh = 32, dx = 32, dy = 32, dw = -32, dh = -32 --- Pixel 31,0 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 32, sy = 32, sw = 32, sh = 32, dx = 32, dy = 32, dw = -32, dh = -32 --- Pixel 31,31 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 32, sy = 32, sw = 32, sh = 32, dx = 32, dy = 32, dw = -32, dh = -32 --- Pixel 0,32 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 32, sy = 32, sw = 32, sh = 32, dx = 32, dy = 32, dw = -32, dh = -32 --- Pixel 32,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 32, sy = 32, sw = 32, sh = 32, dx = 32, dy = 32, dw = -32, dh = -32 --- Pixel 32,32 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 32, sy = 32, sw = 32, sh = 32, dx = 32, dy = 32, dw = -32, dh = -32 --- Pixel 99,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 32, sy = 32, sw = 32, sh = 32, dx = 32, dy = 32, dw = -32, dh = -32 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 10: sx = 0, sy = 0, sw = 512, sh = 512, dx = 0, dy = 0, dw = 256, dh = 256 --- Pixel 0,0 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 10: sx = 0, sy = 0, sw = 512, sh = 512, dx = 0, dy = 0, dw = 256, dh = 256 --- Pixel 0,99 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 10: sx = 0, sy = 0, sw = 512, sh = 512, dx = 0, dy = 0, dw = 256, dh = 256 --- Pixel 99,0 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 10: sx = 0, sy = 0, sw = 512, sh = 512, dx = 0, dy = 0, dw = 256, dh = 256 --- Pixel 99,99 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 10: sx = 0, sy = 0, sw = 512, sh = 512, dx = 0, dy = 0, dw = 256, dh = 256 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 2048, sh = 2048, dx = 0, dy = 0, dw = 800, dh = 800 --- Pixel 0,0 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 2048, sh = 2048, dx = 0, dy = 0, dw = 800, dh = 800 --- Pixel 0,99 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 2048, sh = 2048, dx = 0, dy = 0, dw = 800, dh = 800 --- Pixel 99,0 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 2048, sh = 2048, dx = 0, dy = 0, dw = 800, dh = 800 --- Pixel 99,99 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 2048, sh = 2048, dx = 0, dy = 0, dw = 800, dh = 800 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 70,70 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 70,99 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 99,70 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 99,99 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 0,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 0,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 99,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 69,69 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 69,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 99,69 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 13: draw an image element that does not have a source --- Pixel 0,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 13: draw an image element that does not have a source --- Pixel 0,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 13: draw an image element that does not have a source --- Pixel 99,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 13: draw an image element that does not have a source --- Pixel 99,69 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 13: draw an image element that does not have a source --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 14: sx = 64, sy = 64, sw = 384, sh = 384, dx = 0, dy = 0, dw = 32, dh = 64 --- Pixel 0,0 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 14: sx = 64, sy = 64, sw = 384, sh = 384, dx = 0, dy = 0, dw = 32, dh = 64 --- Pixel 15,31 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 14: sx = 64, sy = 64, sw = 384, sh = 384, dx = 0, dy = 0, dw = 32, dh = 64 --- Pixel 17,33 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 14: sx = 64, sy = 64, sw = 384, sh = 384, dx = 0, dy = 0, dw = 32, dh = 64 --- Pixel 31,63 should be light purple.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 14: sx = 64, sy = 64, sw = 384, sh = 384, dx = 0, dy = 0, dw = 32, dh = 64 --- Pixel 16,0 should be gray.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 14: sx = 64, sy = 64, sw = 384, sh = 384, dx = 0, dy = 0, dw = 32, dh = 64 --- Pixel 31,31 should be gray.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 14: sx = 64, sy = 64, sw = 384, sh = 384, dx = 0, dy = 0, dw = 32, dh = 64 --- Pixel 0,33 should be gray.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 14: sx = 64, sy = 64, sw = 384, sh = 384, dx = 0, dy = 0, dw = 32, dh = 64 --- Pixel 15,63 should be gray.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 14: sx = 64, sy = 64, sw = 384, sh = 384, dx = 0, dy = 0, dw = 32, dh = 64 --- Pixel 0,64 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 14: sx = 64, sy = 64, sw = 384, sh = 384, dx = 0, dy = 0, dw = 32, dh = 64 --- Pixel 32,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 14: sx = 64, sy = 64, sw = 384, sh = 384, dx = 0, dy = 0, dw = 32, dh = 64 --- Pixel 32,64 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 14: sx = 64, sy = 64, sw = 384, sh = 384, dx = 0, dy = 0, dw = 32, dh = 64 --- Pixel 99,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 14: sx = 64, sy = 64, sw = 384, sh = 384, dx = 0, dy = 0, dw = 32, dh = 64 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.measure.advances.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Testing width advances",
          "status": "FAIL",
          "message": "Cannot read property '0' of undefined"
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.object.clamp.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "ImageData.data clamps numbers to [0, 255]",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.cone.shape1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.cone.shape1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-rgb-6",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.underflow.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "restore() with an empty stack has no effect",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.fillRect.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fillRect works",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.gradient.transparent.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are not drawn for transparent gradient fills",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.negativedest.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Negative destination width/height represents the correct rectangle",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.9arg.destsize.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.9arg.destsize",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.baseline.valid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.baseline.valid",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.clearRect.globalalpha.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "clearRect is not affected by globalAlpha",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.align.end.ltr.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "textAlign end with ltr is the right edge",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.translate.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "translate() works",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.alpha.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.alpha",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.object.compare.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.object.compare",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.put.dirty.outside.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "putImageData() handles dirty rectangles outside the canvas correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.fill.copy.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.repeatx.outside.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.paint.repeatx.outside",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.imageSmoothingEnabled.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test that restore() undoes any modifications to imageSmoothingEnabled.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test that save() doesn't modify the values of imageSmoothingEnabled.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test that restoring actually changes smoothing and not just the attribute value.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.css-color-4-rgb-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsl-8",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.miter.lineedge.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Miter joins are not drawn when the miter limit is exceeded at the corners of a zero-height rectangle",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-rgba-6",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.name-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.get.order.rgb.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "getImageData() returns R then G then B",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.stack.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() can be nested as a stack",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.repeat.coord1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.paint.repeat.coord1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.hex5",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.name-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.scale.large.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "scale() with large scale factors works",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.invalidtype.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.invalidtype",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.clip.3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows of clipped shapes are still drawn within the clipping region",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsl-clamp-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsl-clamp-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.floatsource.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.floatsource",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "strokeRect of 0x0 pixels draws nothing",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.basic.canvas.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.basic.canvas",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.basic.image.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.basic.image",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.bezierCurveTo.ensuresubpath.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "If there is no subpath, the first control point is added",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.put.clip.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "putImageData() is not affected by clipping regions",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.transparent.xor.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.transparent.xor",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.negativesource.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Negative source width/height represents the correct rectangle",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.clip.winding.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.clip.winding.2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.transparent.source-over.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.transparent.source-over",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fillText.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.interpolate.zerosize.fillText",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.get.transparent.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.get.transparent",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.image.lighter.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.image.lighter",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.quadraticCurveTo.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.quadraticCurveTo.basic",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.norepeat.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.paint.norepeat.basic",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsla-clamp-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.shape.3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() from 0 to -pi/2 does not draw anything in the wrong quadrant",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.angle.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() draws pi/2 .. -pi anticlockwise correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.hsla-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.name-5",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.beginPath.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.beginPath",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.canvas.copy.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.canvas.copy",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.rotate.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "rotate() with Infinity/NaN is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arcTo.shape.start.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arcTo() draws a straight line from P0 to P1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.pattern.transparent.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are not drawn for transparent fill patterns",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.globalAlpha.canvas.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.globalAlpha.canvas",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.removedsrc.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.incomplete.removedsrc",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.shape.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() from 0 to pi does not draw anything in the wrong half",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.image.source-over.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.image.source-over",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.self.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.self.2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.angle.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() draws -3pi/2 .. -pi anticlockwise correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.measure.width.basic",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-rgba-5",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.put.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "putImageData() puts image data from getImageData() onto the canvas",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.fillRect.transform.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fillRect is affected by transforms",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.nosrc.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.incomplete.nosrc",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.globalAlpha.imagepattern.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.globalAlpha.imagepattern",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.twopie.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() draws a full circle when end = start + 2pi-e and clockwise",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.inside3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.inside3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.rect.selfintersect.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.rect.selfintersect",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.rgb-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.lineTo.ensuresubpath.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "If there is no subpath, the point is added and nothing is drawn",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.align.left.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "textAlign left is the left of the first em square (not the bounding box)",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arcTo.negative.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arcTo() with negative radius throws an exception",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.cone.bottom.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.cone.bottom",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.miterLimit.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() works for miterLimit",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.rotate.direction.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "rotate() is clockwise",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.twopie.4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() draws nothing when end = start + 2pi+e and clockwise",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.nosrc.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.image.incomplete.nosrc",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.rect.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.rect.basic",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.setTransform.skewed.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.transformation.setTransform.skewed",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.bitmap.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() does not affect the current bitmap",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.fontface.notinpage.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "@font-face fonts should work even if they are not used in the page",
          "status": "FAIL",
          "message": "assert_approx_equals: Red channel of the pixel at (5, 5) expected 0 +/- 2 but got 255"
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.nocontext.destination-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeText.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.interpolate.zerosize.strokeText",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.alpha.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.interpolate.alpha",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.pattern.copy.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.paint.norepeat.coord2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.fill.overlap.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.fill.overlap",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.image.destination-over.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.image.destination-over",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.solid.destination-atop.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.solid.destination-atop",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.cap.open.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Line caps are drawn at the corners of an unclosed rectangle",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-rgb-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.current.changed.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "currentColor is computed when the attribute is set, not when it is painted",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.lineTo.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.lineTo.basic",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.bezierCurveTo.ensuresubpath.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "If there is no subpath, the first control point is added (and nothing is drawn up to it)",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.clip.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.clip",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.offset.positiveY.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows can be offset with positive y",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.enable.x.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn if shadowOffsetX is set",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.transform.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "transform() with Infinity/NaN is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.create1.this.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageData(imgdata) should throw when called with the wrong |this|",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hex8.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hex8",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsl-5",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.align.start.ltr.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "textAlign start with ltr is the left edge",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.attributes.shadowColor.invalid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.shadow.attributes.shadowColor.invalid",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.font.parse.size.percentage.default.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.font.parse.size.percentage.default",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.get.source.size.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "getImageData() returns bigger ImageData for bigger source rectangle",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsl-5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsl-5",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.fillStyle.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() works for fillStyle",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgb-clamp-4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.transform.3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Radial gradient transforms do not experience broken caching effects",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.rgb-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.offset.positiveX.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows can be offset with positive x",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.basic.nocontext.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.basic.nocontext",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.clearRect.globalcomposite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "clearRect is not affected by globalCompositeOperation",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.attributes.shadowOffset.initial.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.shadow.attributes.shadowOffset.initial",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.create2.large.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageData(sw, sh) works for sizes much larger than the canvas",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.canvas.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn for canvases",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.outside2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.outside2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.norepeat.outside.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.paint.norepeat.outside",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.shadowOffsetY.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() works for shadowOffsetY",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/imagebitmap/createImageBitmap-blob-invalidtype.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageBitmap: blob with wrong mime type",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.rotate.wrap.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "rotate() wraps large positive values correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.translate.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "translate() with Infinity/NaN is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.hsl-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.transformation.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() affects the current transformation matrix",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.image.destination-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.scale.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "scale() works",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.stroke.join.3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn for stroke joins respecting miter limit",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.css-color-4-rgb-4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/conformance-requirements/2d.type.delete.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "window.CanvasRenderingContext2D is Configurable",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.rect.zero.4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.rect.zero.4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.name-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.solid.lighter.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.solid.lighter",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.solid.source-over.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.solid.source-over",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.miter.within.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Miter joins are drawn when the miter limit is not quite exceeded",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.repeat.empty.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.repeat.empty",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.put.cross.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "putImageData() accepts image data got from a different canvas",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.quadraticCurveTo.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "quadraticCurveTo() with Infinity/NaN is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.stroke.union.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Strokes in opposite directions are unioned, not subtracted",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.clip.winding.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.clip.winding.1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.attributes.shadowBlur.initial.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.shadow.attributes.shadowBlur.initial",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.font.parse.system.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "System fonts must be computed to explicit values",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsla-6",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgba-solid-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgba-solid-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.alpha.5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows of shapes with alpha components are drawn correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/wide-gamut-canvas/canvas-createPutGetImageData-colorManaged.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test color managed cretateImageData: {srgb, uint8} -> {srgb, uint8}",
          "status": "FAIL",
          "message": "imageData.getColorSettings is not a function"
        },
        {
          "name": "Test color managed cretateImageData: {srgb, float16} -> {srgb, float32}",
          "status": "FAIL",
          "message": "imageData.getColorSettings is not a function"
        },
        {
          "name": "Test color managed getImageData: {srgb, uint8} -> {srgb, uint8}",
          "status": "FAIL",
          "message": "imageData.getColorSettings is not a function"
        },
        {
          "name": "Test color managed getImageData: {srgb, float16} -> {srgb, float32}",
          "status": "FAIL",
          "message": "imageData.getColorSettings is not a function"
        },
        {
          "name": "Test color managed putImageData: {srgb, uint8} -> {srgb, uint8}",
          "status": "FAIL",
          "message": "Failed to execute 'createImageData' on 'CanvasRenderingContext2D': The source width is 0."
        },
        {
          "name": "Test color managed putImageData: {srgb, uint8} -> {srgb, float16}",
          "status": "FAIL",
          "message": "Failed to execute 'createImageData' on 'CanvasRenderingContext2D': The source width is 0."
        },
        {
          "name": "Test color managed putImageData: {srgb, uint16} -> {srgb, uint8}",
          "status": "FAIL",
          "message": "Failed to execute 'createImageData' on 'CanvasRenderingContext2D': The source width is 0."
        },
        {
          "name": "Test color managed putImageData: {srgb, uint16} -> {srgb, float16}",
          "status": "FAIL",
          "message": "Failed to execute 'createImageData' on 'CanvasRenderingContext2D': The source width is 0."
        },
        {
          "name": "Test color managed putImageData: {srgb, float32} -> {srgb, uint8}",
          "status": "FAIL",
          "message": "Failed to execute 'createImageData' on 'CanvasRenderingContext2D': The source width is 0."
        },
        {
          "name": "Test color managed putImageData: {srgb, float32} -> {srgb, float16}",
          "status": "FAIL",
          "message": "Failed to execute 'createImageData' on 'CanvasRenderingContext2D': The source width is 0."
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.object.ctor.size.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "ImageData has a usable constructor",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.repeatx.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.paint.repeatx.basic",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.draw.baseline.hanging.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.draw.baseline.hanging",
          "status": "FAIL",
          "message": "assert_approx_equals: Red channel of the pixel at (5, 5) expected 0 +/- 2 but got 255"
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.rect.zero.5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.rect.zero.5",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsla-clamp-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.emptysrc.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.image.incomplete.emptysrc",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.outside.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows of shapes outside the visible area can be offset onto the visible area",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.selfintersect.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() with lineWidth > 2*radius is drawn sensibly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/wide-gamut-canvas/canvas-createImageBitmap-e_srgb.html",
      "status": "ERROR",
      "message": "Uncaught TypeError: testCanvas.convertToBlob is not a function",
      "subtests": [
        {
          "name": "createImageBitmap in e-sRGB from an opaque sRGB HTMLImageElement (BMP, GIF, ICO, JPG, PNG, WEBP) with resize.",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        },
        {
          "name": "createImageBitmap in e-sRGB from a transparent sRGB HTMLImageElement (BMP, ICO, PNG, WEBP) with resize.",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        },
        {
          "name": "createImageBitmap in e-sRGB from a sRGB SVG image with resize.",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        },
        {
          "name": "createImageBitmap in e-sRGB from a sRGB HTMLVideoElement with resize.",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        },
        {
          "name": "createImageBitmap in e-sRGB from an opaque sRGB HTMLCanvasElement with resize.",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        },
        {
          "name": "createImageBitmap in e-sRGB from an opaque e-sRGB HTMLCanvasElement with resize.",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        },
        {
          "name": "createImageBitmap in e-sRGB from a transparent sRGB HTMLCanvasElement with resize.",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        },
        {
          "name": "createImageBitmap in e-sRGB from a transparent e-sRGB HTMLCanvasElement with resize.",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        },
        {
          "name": "createImageBitmap in e-sRGB from an opaque sRGB Blob with resize.",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        },
        {
          "name": "createImageBitmap in e-sRGB from a transparent sRGB Blob with resize.",
          "status": "FAIL",
          "message": "promise_test: Unhandled rejection with value: object \"TypeError: Cannot read property 'length' of undefined\""
        },
        {
          "name": "createImageBitmap in e-sRGB from color managed Blob with resize. blobPixelFormat: uint8, transparency: false",
          "status": "NOTRUN",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.9arg.destpos.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.9arg.destpos",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.canvas.xor.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.canvas.xor",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.cap.invalid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Setting lineCap to invalid values is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.current.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "currentColor is computed from the canvas element",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.clearRect.shadow.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "clearRect does not draw shadows",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.globalAlpha.fill.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.globalAlpha.fill",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.clearRect.negative.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "clearRect of negative sizes works",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.paint.norepeat.coord1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgba-clamp-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.globalAlpha.range.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.globalAlpha.range",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.default.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.default",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.get.unaffected.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "getImageData() is not affected by context state",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.stroke.scale2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Stroke line widths are scaled by the current transformation matrix",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.solid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.interpolate.solid",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createRadialGradient() throws TypeError if arguments are not finite",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.immediate.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.incomplete.immediate",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.miter.rightangle.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Miter joins are not drawn when the miter limit is exceeded, on exact right angles",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.zero.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() draws nothing when startAngle = endAngle and clockwise",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.modify.image1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.modify.image1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.equal.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.equal",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.clip.copy.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fill() does not affect pixels outside the clip region.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.linear.transform.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Linear gradient coordinates are relative to the coordinate space at the time of filling",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.draw.space.collapse.space.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Space characters are converted to U+0020, and collapsed (per CSS)",
          "status": "FAIL",
          "message": "assert_approx_equals: Red channel of the pixel at (25, 25) expected 0 +/- 2 but got 255"
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsla-clamp-5",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.fill.destination-atop.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.5arg.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.5arg",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.enable.off.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are not drawn when only shadowColor is set",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.union.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.line.union",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.fill.winding.subtract.3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.fill.winding.subtract.3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.moveTo.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.moveTo.basic",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.repeat.coord2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.paint.repeat.coord2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeRect.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.interpolate.zerosize.strokeRect",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.css-color-4-rgb-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.rgba-5",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.stroke.join.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn for stroke joins",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.rotate.wrapnegative.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "rotate() wraps large negative values correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.css-color-4-rgba-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.globalcomposite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "strokeRect is not affected by globalCompositeOperation",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgba-clamp-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.canvas.destination-over.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.canvas.destination-over",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.clip.source-atop.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fill() does not affect pixels outside the clip region.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.font.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() works for font",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.svg-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.svg-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.rect.zero.3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.rect.zero.3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.rgb-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.clip.source-over.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fill() does not affect pixels outside the clip region.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.reload.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.image.incomplete.reload",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.shape.4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() from 0 to -pi/2 draws stuff in the right quadrant",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.quadraticCurveTo.ensuresubpath.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "If there is no subpath, the first control point is added (and nothing is drawn up to it)",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.measure.fontBoundingBox.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Testing fontBoundingBox",
          "status": "FAIL",
          "message": "assert_equals: ctx.measureText('A').fontBoundingBoxAscent === 85 (got [undefined], expected 85[number]) expected (number) 85 but got (undefined) undefined"
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.clip.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "strokeRect is affected by clipping regions",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.create2.initial.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageData(sw, sh) returns transparent black data of the right size",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.solid.destination-over.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.solid.destination-over",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.removedsrc.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.image.incomplete.removedsrc",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.measure.width.empty.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "The empty string has zero width",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.operation.unrecognised.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.operation.unrecognised",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.font.parse.complex.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.font.parse.complex",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.put.modified.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "putImageData() puts modified image data correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.setTransform.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "setTransform() with Infinity/NaN is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.moveTo.newsubpath.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.moveTo.newsubpath",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.image.null.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.image.null",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.rgba-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.put.dirty.zero.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "putImageData() with zero-sized dirty rectangle puts nothing",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.clip.source-out.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fill() does not affect pixels outside the clip region.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.scale.zero.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "scale() with a scale factor of zero works",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsl-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsl-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.maxWidth.small.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fillText handles maxWidth correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.rect.closed.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.rect.closed",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.hsl-5",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.width.valid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Setting lineWidth to valid values works",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.orientation.image.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Image patterns do not get flipped when painted",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.quadraticCurveTo.shape.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.quadraticCurveTo.shape",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.invalidstring.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.invalidstring",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/wide-gamut-canvas/imageData-colorManagedBehavior.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "imageData-colorManagedBehavior",
          "status": "FAIL",
          "message": "Uncaught TypeError: Cannot set property '0' of undefined"
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.angle.4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() draws a full circle when clockwise and end > start+2pi",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.width.invalid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Setting lineWidth to invalid values is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.join.miter.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "lineJoin 'miter' is rendered correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arcTo.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arcTo() with Infinity/NaN is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.cap.butt.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "lineCap 'butt' is rendered correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.image.section.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are not drawn for areas outside image source rectangles",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsl-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.globalAlpha.canvascopy.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.globalAlpha.canvascopy",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.shadow.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "strokeRect draws shadows",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.gradient.alpha.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn correctly for partially-transparent gradient fills",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.join.invalid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Setting lineJoin to invalid values is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.draw.space.collapse.start.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Space characters at the start of a line are collapsed (per CSS)",
          "status": "FAIL",
          "message": "assert_approx_equals: Red channel of the pixel at (25, 25) expected 0 +/- 2 but got 255"
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.maxWidth.negative.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fillText handles maxWidth correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex8.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.hex8",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.cross.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.line.cross",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/wide-gamut-canvas/canvas-colorspace-arguments.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test default context creation parameters: srgb/uint8",
          "status": "FAIL",
          "message": "ctx.getContextAttributes is not a function"
        },
        {
          "name": "Test CanvasColorSpace value srgb",
          "status": "FAIL",
          "message": "ctx.getContextAttributes is not a function"
        },
        {
          "name": "Test CanvasPixelFormat value uint8",
          "status": "FAIL",
          "message": "ctx.getContextAttributes is not a function"
        },
        {
          "name": "Test CanvasPixelFormat value float16",
          "status": "FAIL",
          "message": "ctx.getContextAttributes is not a function"
        },
        {
          "name": "Test supported color settings srgb/uint8",
          "status": "FAIL",
          "message": "ctx.getContextAttributes is not a function"
        },
        {
          "name": "Test supported color settings srgb/float16",
          "status": "FAIL",
          "message": "ctx.getContextAttributes is not a function"
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.hsl-4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.transparent.source-atop.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.transparent.source-atop",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.canvas.source-atop.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.canvas.source-atop",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.clip.destination-atop.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fill() does not affect pixels outside the clip region.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.create2.type.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageData(sw, sh) returns an ImageData object containing a Uint8ClampedArray object",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.clearRect.clip.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "clearRect is affected by clipping regions",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/imagebitmap/createImageBitmap-drawImage.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageBitmap from an HTMLCanvasElement, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an HTMLCanvasElement scaled down, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an HTMLCanvasElement scaled up, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an HTMLCanvasElement resized, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an HTMLCanvasElement with negative sw/sh, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an HTMLVideoElement, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an HTMLVideoElement scaled down, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an HTMLVideoElement scaled up, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an HTMLVideoElement resized, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an HTMLVideoElement with negative sw/sh, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an HTMLVideoElement from a data URL, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an HTMLVideoElement from a data URL scaled down, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an HTMLVideoElement from a data URL scaled up, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an HTMLVideoElement from a data URL resized, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an HTMLVideoElement from a data URL with negative sw/sh, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a bitmap HTMLImageElement, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a bitmap HTMLImageElement scaled down, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a bitmap HTMLImageElement scaled up, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a bitmap HTMLImageElement resized, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a bitmap HTMLImageElement with negative sw/sh, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a vector HTMLImageElement, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a vector HTMLImageElement scaled down, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a vector HTMLImageElement scaled up, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a vector HTMLImageElement resized, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a vector HTMLImageElement with negative sw/sh, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a bitmap SVGImageElement, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a bitmap SVGImageElement scaled down, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a bitmap SVGImageElement scaled up, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a bitmap SVGImageElement resized, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a bitmap SVGImageElement with negative sw/sh, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a vector SVGImageElement, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a vector SVGImageElement scaled down, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a vector SVGImageElement scaled up, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a vector SVGImageElement resized, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a vector SVGImageElement with negative sw/sh, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an OffscreenCanvas, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an OffscreenCanvas scaled down, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an OffscreenCanvas scaled up, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an OffscreenCanvas resized, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an OffscreenCanvas with negative sw/sh, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an ImageData, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an ImageData scaled down, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an ImageData scaled up, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an ImageData resized, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an ImageData with negative sw/sh, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an ImageBitmap, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an ImageBitmap scaled down, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an ImageBitmap scaled up, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an ImageBitmap resized, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an ImageBitmap with negative sw/sh, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a Blob, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a Blob scaled down, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a Blob scaled up, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a Blob resized, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a Blob with negative sw/sh, and drawImage on the created ImageBitmap",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/scroll/2d.scrollPathIntoView.verticalRL.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "scrollPathIntoView() works in vertical-rl writing mode",
          "status": "FAIL",
          "message": "ctx.scrollPathIntoView is not a function"
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.solid.copy.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.solid.copy",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage() with Infinity/NaN is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.clip.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows of clipped shapes are still drawn within the clipping region",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.rect.end.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.rect.end.2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.shadowOffsetX.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() works for shadowOffsetX",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.isPointInPath.edge.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "isPointInPath() counts points on the path as being inside",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.stroke.cap.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are not drawn for areas outside stroke caps",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.clip.destination-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fill() does not affect pixels outside the clip region.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.get.semitransparent.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.get.semitransparent",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.clip.destination-over.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fill() does not affect pixels outside the clip region.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.fillRect.negative.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fillRect of negative sizes works",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.draw.baseline.middle.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "textBaseline middle is the middle of the em square (not the bounding box)",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.default.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() with missing last argument defaults to clockwise",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerosource.image.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage with zero-sized source rectangle from image throws INDEX_SIZE_ERR",
          "status": "FAIL",
          "message": "assert_throws: function \"function() { ctx.drawImage(document.getElementById('red-zerowidth.svg'), 0, 0, 100, 50); }\" did not throw"
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.width.scaledefault.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Default lineWidth strokes are affected by scale transformations",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.solid.destination-out.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.solid.destination-out",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcesize.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.9arg.sourcesize",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.globalAlpha.invalid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.globalAlpha.invalid",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.rect.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "rect() with Infinity/NaN is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.overlap.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.interpolate.overlap",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.self.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.self.1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.transform.skewed.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "transform() with skewy matrix transforms correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.clip.destination-out.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fill() does not affect pixels outside the clip region.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.create2.this.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageData(sw, sh) should throw when called with the wrong |this|",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.norepeat.coord3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.paint.norepeat.coord3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.get.order.rows.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "getImageData() returns topmost rows first",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.align.default.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.align.default",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.get.source.negative.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "getImageData() works with negative width and height, and returns top-to-bottom left-to-right",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.isPointInPath.transform.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "isPointInPath() handles transformations correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.scale.multiple.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Multiple scale()s combine",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.create2.double.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageData(w, h) double is converted to long",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsl-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/scroll/2d.scrollPathIntoView.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "scrollPathIntoView() works",
          "status": "FAIL",
          "message": "ctx.scrollPathIntoView is not a function"
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.attributes.shadowColor.initial.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.shadow.attributes.shadowColor.initial",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.clip.source-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fill() does not affect pixels outside the clip region.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.stroke.cap.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn for stroke caps",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "strokeRect works",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-rgb-4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.transform.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.transform",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.draw.baseline.ideographic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.draw.baseline.ideographic",
          "status": "FAIL",
          "message": "assert_approx_equals: Red channel of the pixel at (5, 5) expected 0 +/- 2 but got 255"
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.animated.gif.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage() of an animated GIF draws the first frame",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "strokeRect of Nx0 pixels draws a straight line",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage with zero-sized canvas as the source shoud throw exception",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgba-percent.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgba-percent",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.object.current.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.object.current",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.solid.destination-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.solid.destination-in",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/hit-regions/hitregions-members-exist.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "context.addHitRegion Exists",
          "status": "FAIL",
          "message": "assert_equals: expected \"function\" but got \"undefined\""
        },
        {
          "name": "context.removeHitRegion Exists",
          "status": "FAIL",
          "message": "assert_equals: expected \"function\" but got \"undefined\""
        },
        {
          "name": "context.clearHitRegions Exists",
          "status": "FAIL",
          "message": "assert_equals: expected \"function\" but got \"undefined\""
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.get.nonpremul.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "getImageData() returns non-premultiplied colours",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.closePath.empty.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.closePath.empty",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.create1.zero.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageData(null) throws TypeError",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.join.closed.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Line joins are drawn at the corner of a closed rectangle",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.get.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "getImageData() exists and returns something",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.transform.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Radial gradient coordinates are relative to the coordinate space at the time of filling",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.rgba-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.operation.over.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.operation.over",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.canvas.source-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.canvas.source-in",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/hit-regions/addHitRegions-NotSupportedError-01.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fillRect should not affect current default path and NotSupportedError should be thrown.",
          "status": "FAIL",
          "message": "assert_throws: fillRect should not affect current default path and NotSupportedError should be thrown. function \"function () {\n            var canvas = document.getElementById(\"canvas\");\n            // Reset context\n            canvas.width = canvas.width;\n            var button = document.getElementById(\"button\");\n            var context = canvas.getContext(\"2d\");\n\n            // Shapes are painted without affecting the current default path,\n            // http://www.w3.org/html/wg/drafts/2dcontext/html5_canvas_CR/#drawing-rectangles-to-the-canvas\n            context.fillRect(25, 25, 25, 25);\n\n            // If the specified path has no pixels, throw a NotSupportedError exception and abort these steps.\n            // http://www.w3.org/html/wg/drafts/2dcontext/html5_canvas_CR/#hit-regions\n            context.addHitRegion({ id: \"notsupportederror_fillRect\", control: button })\n        }\" threw object \"TypeError: context.addHitRegion is not a function\" (\"TypeError\") expected object \"[object Object]\" (\"NotSupportedError\")"
        },
        {
          "name": "strokeRect should not affect current default path and NotSupportedError should be thrown.",
          "status": "FAIL",
          "message": "assert_throws: strokeRect should not affect current default path and NotSupportedError should be thrown. function \"function () {\n            var canvas = document.getElementById(\"canvas\");\n            // Reset context\n            canvas.width = canvas.width;\n            var button = document.getElementById(\"button\");\n            var context = canvas.getContext(\"2d\");\n\n            // \"Shapes are painted without affecting the current default path,\"\n            // http://www.w3.org/html/wg/drafts/2dcontext/html5_canvas_CR/#drawing-rectangles-to-the-canvas\n            context.strokeRect(75, 25, 25, 25);\n\n            // \"If the specified path has no pixels, throw a NotSupportedError exception and abort these steps.\"\n            // http://www.w3.org/html/wg/drafts/2dcontext/html5_canvas_CR/#hit-regions\n            context.addHitRegion({ id: \"notsupportederror_strokeRect\", control: button })\n        }\" threw object \"TypeError: context.addHitRegion is not a function\" (\"TypeError\") expected object \"[object Object]\" (\"NotSupportedError\")"
        },
        {
          "name": "fillText should not affect current default path and NotSupportedError should be thrown.",
          "status": "FAIL",
          "message": "assert_throws: fillText should not affect current default path and NotSupportedError should be thrown. function \"function () {\n            var canvas = document.getElementById(\"canvas\");\n            // Reset context\n            canvas.width = canvas.width;\n            var button = document.getElementById(\"button\");\n            var context = canvas.getContext(\"2d\");\n\n            // \"These shapes are painted without affecting the current path\"\n            // http://www.w3.org/html/wg/drafts/2dcontext/html5_canvas_CR/#drawing-rectangles-to-the-canvas\n            context.fillText(\"fillText\", 25, 100);\n\n            // \"If the specified path has no pixels, throw a NotSupportedError exception and abort these steps.\"\n            // http://www.w3.org/html/wg/drafts/2dcontext/html5_canvas_CR/#drawing-text-to-the-canvas\n            context.addHitRegion({ id: \"notsupportederror_fillText\", control: button });\n        }\" threw object \"TypeError: context.addHitRegion is not a function\" (\"TypeError\") expected object \"[object Object]\" (\"NotSupportedError\")"
        },
        {
          "name": "strokeText should not affect current default path and NotSupportedError shuld be thrown.",
          "status": "FAIL",
          "message": "assert_throws: strokeText should not affect current default path and NotSupportedError shuld be thrown. function \"function () {\n            var canvas = document.getElementById(\"canvas\");\n            canvas.width = canvas.width;\n            var button = document.getElementById(\"button\");\n            var context = canvas.getContext(\"2d\");\n            // \"These shapes are painted without affecting the current path\"\n            // http://www.w3.org/html/wg/drafts/2dcontext/html5_canvas_CR/#drawing-rectangles-to-the-canvas\n            context.strokeText(\"strokeText\", 75, 100);\n\n            // \"If the specified path has no pixels, throw a NotSupportedError exception and abort these steps.\"\n            // http://www.w3.org/html/wg/drafts/2dcontext/html5_canvas_CR/#drawing-text-to-the-canvas\n            context.addHitRegion({ id: \"notsupportederror_strokeText\", control: button });\n        }\" threw object \"TypeError: context.addHitRegion is not a function\" (\"TypeError\") expected object \"[object Object]\" (\"NotSupportedError\")"
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.pattern.source-out.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Pattern fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.font.default.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.font.default",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.draw.space.collapse.end.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Space characters at the end of a line are collapsed (per CSS)",
          "status": "FAIL",
          "message": "assert_approx_equals: Red channel of the pixel at (75, 25) expected 0 +/- 2 but got 255"
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.zero.5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "strokeRect of Nx0 pixels draws a closed line with joins",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.clearRect.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "clearRect() with Infinity/NaN is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.put.dirty.negative.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "putImageData() handles negative-sized dirty rectangles correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.nowrap.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Stretched images do not get pixels wrapping around the edges",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.align.invalid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.align.invalid",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.object.set.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "ImageData.data can be modified",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.align.center.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "textAlign center is the center of the em squares (not the bounding box)",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.isPointInPath.outside.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "isPointInPath() works on paths outside the canvas",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.modify.canvas1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.modify.canvas1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.draw.baseline.alphabetic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.draw.baseline.alphabetic",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.modify.image2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.modify.image2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.bezierCurveTo.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "bezierCurveTo() with Infinity/NaN is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgba-num-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgba-num-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.measure.baselines.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Testing baselines",
          "status": "FAIL",
          "message": "ctx.measureText(...).getBaselines is not a function"
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.join.open.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Line joins are not drawn at the corner of an unclosed rectangle",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.stroke.prune.curve.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Zero-length line segments from quadraticCurveTo and bezierCurveTo are removed before stroking",
          "status": "FAIL",
          "message": "assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255"
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_003.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawFocusIfNeeded does not draw a focus ring if the element is not a descendant of the context.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.transparent.copy.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.transparent.copy",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.defaults.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.line.defaults",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.canvas.destination-out.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.canvas.destination-out",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.get.range.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "getImageData() returns values in the range [0, 255]",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.bezierCurveTo.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.bezierCurveTo.basic",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/imagebitmap/createImageBitmap-transfer.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Transfer ImageBitmap created from an HTMLCanvasElement",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Transfer ImageBitmap created from an HTMLVideoElement",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Transfer ImageBitmap created from an HTMLVideoElement from a data URL",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Transfer ImageBitmap created from a bitmap HTMLImageElement",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Transfer ImageBitmap created from a vector HTMLImageElement",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Transfer ImageBitmap created from a bitmap SVGImageElement",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Transfer ImageBitmap created from a vector SVGImageElement",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Transfer ImageBitmap created from an OffscreenCanvas",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Transfer ImageBitmap created from an ImageData",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Transfer ImageBitmap created from an ImageBitmap",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Transfer ImageBitmap created from a Blob",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.put.unchanged.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "putImageData(getImageData(...), ...) has no effect",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.image.transparent.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are not drawn for transparent images",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.maxWidth.zero.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fillText handles maxWidth correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.put.created.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "putImageData() puts image data from createImageData() onto the canvas",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/imagebitmap/createImageBitmap-bounds.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageBitmap: clipping to the bitmap",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgba-eof.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgba-eof",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.stroke.prune.rect.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Zero-length line segments from rect and strokeRect are removed before stroking",
          "status": "FAIL",
          "message": "assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255"
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.nonempty.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() with a non-empty path does draw a straight line to the start point",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.create2.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageData() throws TypeError if arguments are not finite",
          "status": "FAIL",
          "message": "assert_throws: function \"function() { ctx.createImageData(Infinity, 10); }\" threw object \"IndexSizeError: Failed to execute 'createImageData' on 'CanvasRenderingContext2D': The source width is 0.\" (\"IndexSizeError\") expected object \"TypeError\" (\"TypeError\")"
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/canvas_shadows_001.htm",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "linear gradient fillRect draws shadow (black rectange)",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.cone.behind.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.cone.behind",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcepos.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.9arg.sourcepos",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.lineTo.nonfinite.details.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "lineTo() with Infinity/NaN for first arg still converts the second arg",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.nocontext.source-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.angle.3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() wraps angles mod 2pi when anticlockwise and end > start+2pi",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.put.dirty.rect2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "putImageData() only modifies areas inside the dirty rectangle, using x and y",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.3arg.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.3arg",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.order.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Transformations are applied in the right order",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.cap.round.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "lineCap 'round' is rendered correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.cap.closed.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Line caps are not drawn at the corners of an unclosed rectangle",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.isPointInPath.subpath.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "isPointInPath() uses the current path, not just the subpath",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.css-color-4-hsl-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.put.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "putImageData() throws TypeError if arguments are not finite",
          "status": "FAIL",
          "message": "assert_throws: function \"function() { ctx.putImageData(imgdata, Infinity, 10); }\" did not throw"
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.align.start.rtl.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "textAlign start with rtl is the right edge",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.empty.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.empty",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel 0,0 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel 0,49 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel 49,0 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel 49,49 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel 5,5 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel 5,44 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel 44,5 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel 44,44 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel 50,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel 0,50 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel 50,50 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel 99,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 1: dx = 0, dy = 0 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 25,25 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 25,74 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 74,25 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 74,74 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 30,30 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 30,69 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 69,30 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 69,69 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 24,24 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 24,75 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 75,24 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel 75,75 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 2: dx = 25, dy = 25 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 50,50 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 50,99 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 99,50 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 99,99 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 55,55 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 55,94 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 94,55 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 94,94 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 0,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 49,49 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 49,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel 99,49 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 20, dh = 20 --- Pixel 50,50 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 20, dh = 20 --- Pixel 50,69 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 20, dh = 20 --- Pixel 69,50 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 20, dh = 20 --- Pixel 69,69 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 20, dh = 20 --- Pixel 52,52 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 20, dh = 20 --- Pixel 52,67 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 20, dh = 20 --- Pixel 67,52 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 20, dh = 20 --- Pixel 67,67 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 20, dh = 20 --- Pixel 49,49 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 20, dh = 20 --- Pixel 49,70 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 20, dh = 20 --- Pixel 70,49 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 20, dh = 20 --- Pixel 70,70 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 4: dx = 50, dy = 50, dw = 20, dh = 20 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 50, dh = 20 --- Pixel 50,50 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 50, dh = 20 --- Pixel 50,69 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 50, dh = 20 --- Pixel 99,50 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 50, dh = 20 --- Pixel 99,69 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 50, dh = 20 --- Pixel 55,52 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 50, dh = 20 --- Pixel 55,67 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 50, dh = 20 --- Pixel 94,52 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 50, dh = 20 --- Pixel 94,67 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 50, dh = 20 --- Pixel 49,49 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 50, dh = 20 --- Pixel 49,69 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 50, dh = 20 --- Pixel 99,49 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 50, dh = 20 --- Pixel 99,70 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 5: dx = 50, dy = 50, dw = 50, dh = 20 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 25, sh = 25, dx = 0, dy = 0, dw = 25, dh = 25 --- Pixel 0,0 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 25, sh = 25, dx = 0, dy = 0, dw = 25, dh = 25 --- Pixel 4,4 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 25, sh = 25, dx = 0, dy = 0, dw = 25, dh = 25 --- Pixel 0,24 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 25, sh = 25, dx = 0, dy = 0, dw = 25, dh = 25 --- Pixel 24,0 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 25, sh = 25, dx = 0, dy = 0, dw = 25, dh = 25 --- Pixel 5,5 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 25, sh = 25, dx = 0, dy = 0, dw = 25, dh = 25 --- Pixel 5,24 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 25, sh = 25, dx = 0, dy = 0, dw = 25, dh = 25 --- Pixel 24,5 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 25, sh = 25, dx = 0, dy = 0, dw = 25, dh = 25 --- Pixel 24,24 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 25, sh = 25, dx = 0, dy = 0, dw = 25, dh = 25 --- Pixel 25,25 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 25, sh = 25, dx = 0, dy = 0, dw = 25, dh = 25 --- Pixel 25,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 25, sh = 25, dx = 0, dy = 0, dw = 25, dh = 25 --- Pixel 99,25 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 25, sh = 25, dx = 0, dy = 0, dw = 25, dh = 25 --- Pixel 99,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 6: sx = 0, sy = 0, sw = 25, sh = 25, dx = 0, dy = 0, dw = 25, dh = 25 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 25, sh = 25, dx = 25, dy = 25, dw = 25, dh = 25 --- Pixel 25,25 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 25, sh = 25, dx = 25, dy = 25, dw = 25, dh = 25 --- Pixel 25,49 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 25, sh = 25, dx = 25, dy = 25, dw = 25, dh = 25 --- Pixel 49,25 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 25, sh = 25, dx = 25, dy = 25, dw = 25, dh = 25 --- Pixel 29,29 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 25, sh = 25, dx = 25, dy = 25, dw = 25, dh = 25 --- Pixel 30,30 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 25, sh = 25, dx = 25, dy = 25, dw = 25, dh = 25 --- Pixel 30,49 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 25, sh = 25, dx = 25, dy = 25, dw = 25, dh = 25 --- Pixel 49,30 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 25, sh = 25, dx = 25, dy = 25, dw = 25, dh = 25 --- Pixel 49,49 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 25, sh = 25, dx = 25, dy = 25, dw = 25, dh = 25 --- Pixel 24,24 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 25, sh = 25, dx = 25, dy = 25, dw = 25, dh = 25 --- Pixel 24,50 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 25, sh = 25, dx = 25, dy = 25, dw = 25, dh = 25 --- Pixel 50,24 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 25, sh = 25, dx = 25, dy = 25, dw = 25, dh = 25 --- Pixel 50,50 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 7: sx = 0, sy = 0, sw = 25, sh = 25, dx = 25, dy = 25, dw = 25, dh = 25 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 25, sy = 25, sw = 50, sh = 50, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 0,20 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 25, sy = 25, sw = 50, sh = 50, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 20,0 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 25, sy = 25, sw = 50, sh = 50, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 20,20 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 25, sy = 25, sw = 50, sh = 50, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 24,24 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 25, sy = 25, sw = 50, sh = 50, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 0,0 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 25, sy = 25, sw = 50, sh = 50, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 0,19 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 25, sy = 25, sw = 50, sh = 50, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 19,0 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 25, sy = 25, sw = 50, sh = 50, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 19,19 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 25, sy = 25, sw = 50, sh = 50, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 0,25 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 25, sy = 25, sw = 50, sh = 50, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 25,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 25, sy = 25, sw = 50, sh = 50, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 25,25 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 25, sy = 25, sw = 50, sh = 50, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 99,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 8: sx = 25, sy = 25, sw = 50, sh = 50, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 0, sy = 0, sw = 50, sh = 50, dx = 100, dy = 100, dw = -50, dh = -50 --- Pixel 50,50 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 0, sy = 0, sw = 50, sh = 50, dx = 100, dy = 100, dw = -50, dh = -50 --- Pixel 50,99 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 0, sy = 0, sw = 50, sh = 50, dx = 100, dy = 100, dw = -50, dh = -50 --- Pixel 99,50 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 0, sy = 0, sw = 50, sh = 50, dx = 100, dy = 100, dw = -50, dh = -50 --- Pixel 99,99 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 0, sy = 0, sw = 50, sh = 50, dx = 100, dy = 100, dw = -50, dh = -50 --- Pixel 55,55 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 0, sy = 0, sw = 50, sh = 50, dx = 100, dy = 100, dw = -50, dh = -50 --- Pixel 55,94 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 0, sy = 0, sw = 50, sh = 50, dx = 100, dy = 100, dw = -50, dh = -50 --- Pixel 94,55 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 0, sy = 0, sw = 50, sh = 50, dx = 100, dy = 100, dw = -50, dh = -50 --- Pixel 94,94 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 0, sy = 0, sw = 50, sh = 50, dx = 100, dy = 100, dw = -50, dh = -50 --- Pixel 0,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 0, sy = 0, sw = 50, sh = 50, dx = 100, dy = 100, dw = -50, dh = -50 --- Pixel 49,49 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 0, sy = 0, sw = 50, sh = 50, dx = 100, dy = 100, dw = -50, dh = -50 --- Pixel 0,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 0, sy = 0, sw = 50, sh = 50, dx = 100, dy = 100, dw = -50, dh = -50 --- Pixel 99,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 9: sx = 0, sy = 0, sw = 50, sh = 50, dx = 100, dy = 100, dw = -50, dh = -50 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 10: sx = 0, sy = 0, sw = 50, sh = 50, dx = 0, dy = 0, dw = 200, dh = 200 --- Pixel 0,0 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 10: sx = 0, sy = 0, sw = 50, sh = 50, dx = 0, dy = 0, dw = 200, dh = 200 --- Pixel 0,99 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 10: sx = 0, sy = 0, sw = 50, sh = 50, dx = 0, dy = 0, dw = 200, dh = 200 --- Pixel 99,0 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 10: sx = 0, sy = 0, sw = 50, sh = 50, dx = 0, dy = 0, dw = 200, dh = 200 --- Pixel 19,19 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 10: sx = 0, sy = 0, sw = 50, sh = 50, dx = 0, dy = 0, dw = 200, dh = 200 --- Pixel 20,20 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 10: sx = 0, sy = 0, sw = 50, sh = 50, dx = 0, dy = 0, dw = 200, dh = 200 --- Pixel 20,99 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 10: sx = 0, sy = 0, sw = 50, sh = 50, dx = 0, dy = 0, dw = 200, dh = 200 --- Pixel 99,20 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 10: sx = 0, sy = 0, sw = 50, sh = 50, dx = 0, dy = 0, dw = 200, dh = 200 --- Pixel 99,99 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 10: sx = 0, sy = 0, sw = 50, sh = 50, dx = 0, dy = 0, dw = 200, dh = 200 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 100, sh = 100, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 0,0 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 100, sh = 100, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 1,1 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 100, sh = 100, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 23,23 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 100, sh = 100, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 24,24 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 100, sh = 100, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 3,3 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 100, sh = 100, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 3,21 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 100, sh = 100, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 21,3 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 100, sh = 100, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 21,21 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 100, sh = 100, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 0,25 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 100, sh = 100, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 25,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 100, sh = 100, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 25,25 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 100, sh = 100, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel 99,99 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 11: sx = 0, sy = 0, sw = 100, sh = 100, dx = 0, dy = 0, dw = 50, dh = 50 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 70,70 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 70,99 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 99,70 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 82,82 should be blue.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 84,84 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 84,99 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 99,84 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 99,99 should be black.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 0,69 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 69,0 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 69,69 should be red.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel outside canvas should be transparent black.\n",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.repeaty.outside.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.paint.repeaty.outside",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.emptysrc.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.incomplete.emptysrc",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.stroke.overlap.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Stroked subpaths are combined before being drawn",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.svg.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage() of an SVG image",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.miter.exceeded.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Miter joins are not drawn when the miter limit is exceeded",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.clip.empty.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.clip.empty",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.image.destination-out.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.image.destination-out",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsl-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsl-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.transformation.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.transformation.basic",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/conformance-requirements/2d.voidreturn.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "void methods return undefined",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsla-clamp-4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.angle.6.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() draws a full circle when anticlockwise and start > end+2pi",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/wide-gamut-canvas/imagedata-no-color-settings-crash.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Putting a float-32 ImageData with no color settings on a context 2D should not crash.",
          "status": "FAIL",
          "message": "Failed to execute 'createImageData' on 'CanvasRenderingContext2D': The source width is 0."
        },
        {
          "name": "Putting a uint-16 ImageData with no color settings on a context 2D should not crash.",
          "status": "FAIL",
          "message": "Failed to execute 'createImageData' on 'CanvasRenderingContext2D': The source width is 0."
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.object.ctor.array.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "ImageData has a usable constructor",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Load a 100x100 image to a SVG image and draw it to a 100x100 canvas.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.get.length.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "getImageData() returns a correctly-sized Uint8ClampedArray",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.canvas.source-over.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.canvas.source-over",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.object.undefined.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "ImageData.data converts undefined to 0",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.put.dirty.rect1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "putImageData() only modifies areas inside the dirty rectangle, using width and height",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.animated.apng.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage() of an APNG with no poster frame draws the first frame",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.css-color-4-hsla-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.repeatx.coord1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.paint.repeatx.coord1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/setLineDash.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Invalid arguments to setLineDash()",
          "status": "PASS",
          "message": null
        },
        {
          "name": "setLineDash",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.nocontext.destination-atop.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_002.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawFocusIfNeeded does not draw a focus ring if the element is not in focus.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.join.round.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "lineJoin 'round' is rendered correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.object.return.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createLinearGradient() and createRadialGradient() returns objects implementing CanvasGradient",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsla-4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgb-percent.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgb-percent",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.get.double.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageData(w, h) double is converted to long",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsl-7",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.zero.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() draws nothing when startAngle = endAngle and anticlockwise",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsl-4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.modify.canvas2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.modify.canvas2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.transform.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadow offsets are not affected by transformations",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsl-9",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.reload.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.incomplete.reload",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.object.type.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "window.CanvasGradient exists and has the right properties",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.lineTo.nextpoint.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.lineTo.nextpoint",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageBitmap does not crash or reject the promise when passing very large sx",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap does not crash or reject the promise when passing very large sy",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap does not crash or reject the promise when passing very large sw",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap does not crash or reject the promise when passing very large sh",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap does not crash or reject the promise when passing very large sx, sy, sw and sh",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.closePath.nextpoint.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.closePath.nextpoint",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.textAlign.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() works for textAlign",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.animated.poster.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage() of an APNG draws the poster frame",
          "status": "FAIL",
          "message": "assert_approx_equals: Red channel of the pixel at (50, 25) expected 0 +/- 2 but got 255"
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.create2.negative.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageData(sw, sh) takes the absolute magnitude of the size arguments",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() with Infinity/NaN is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.moveTo.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "moveTo() with Infinity/NaN is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.rgba-4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.linear.transform.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Linear gradient coordinates are relative to the coordinate space at the time of filling",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.clip.lighter.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fill() does not affect pixels outside the clip region.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.overlap2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.interpolate.overlap2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/wide-gamut-canvas/canvas-colorManaged-toBlob-toDataURL.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Test if toBlob() respects legacy behavior in         color managed canvas: ImageFormat: image/jpeg, source color space: srgb, pixel format: uint8, alpha: 0.5",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toBlob() respects legacy behavior in         color managed canvas: ImageFormat: image/jpeg, source color space: srgb, pixel format: uint8, alpha: 1",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toBlob() respects legacy behavior in         color managed canvas: ImageFormat: image/jpeg, source color space: srgb, pixel format: float16, alpha: 0.5",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toBlob() respects legacy behavior in         color managed canvas: ImageFormat: image/jpeg, source color space: srgb, pixel format: float16, alpha: 1",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toBlob() respects legacy behavior in         color managed canvas: ImageFormat: image/png, source color space: srgb, pixel format: uint8, alpha: 0.5",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toBlob() respects legacy behavior in         color managed canvas: ImageFormat: image/png, source color space: srgb, pixel format: uint8, alpha: 1",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toBlob() respects legacy behavior in         color managed canvas: ImageFormat: image/png, source color space: srgb, pixel format: float16, alpha: 0.5",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toBlob() respects legacy behavior in         color managed canvas: ImageFormat: image/png, source color space: srgb, pixel format: float16, alpha: 1",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toBlob() respects legacy behavior in         color managed canvas: ImageFormat: image/webp, source color space: srgb, pixel format: uint8, alpha: 0.5",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toBlob() respects legacy behavior in         color managed canvas: ImageFormat: image/webp, source color space: srgb, pixel format: uint8, alpha: 1",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toBlob() respects legacy behavior in         color managed canvas: ImageFormat: image/webp, source color space: srgb, pixel format: float16, alpha: 0.5",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toBlob() respects legacy behavior in         color managed canvas: ImageFormat: image/webp, source color space: srgb, pixel format: float16, alpha: 1",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toDataURL() respects legacy behavior         in color managed canvas: ImageFormat: image/jpeg, source color space: srgb, pixel format: uint8, alpha: 0.5",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toDataURL() respects legacy behavior         in color managed canvas: ImageFormat: image/jpeg, source color space: srgb, pixel format: uint8, alpha: 1",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toDataURL() respects legacy behavior         in color managed canvas: ImageFormat: image/jpeg, source color space: srgb, pixel format: float16, alpha: 0.5",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toDataURL() respects legacy behavior         in color managed canvas: ImageFormat: image/jpeg, source color space: srgb, pixel format: float16, alpha: 1",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toDataURL() respects legacy behavior         in color managed canvas: ImageFormat: image/png, source color space: srgb, pixel format: uint8, alpha: 0.5",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toDataURL() respects legacy behavior         in color managed canvas: ImageFormat: image/png, source color space: srgb, pixel format: uint8, alpha: 1",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toDataURL() respects legacy behavior         in color managed canvas: ImageFormat: image/png, source color space: srgb, pixel format: float16, alpha: 0.5",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toDataURL() respects legacy behavior         in color managed canvas: ImageFormat: image/png, source color space: srgb, pixel format: float16, alpha: 1",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toDataURL() respects legacy behavior         in color managed canvas: ImageFormat: image/webp, source color space: srgb, pixel format: uint8, alpha: 0.5",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toDataURL() respects legacy behavior         in color managed canvas: ImageFormat: image/webp, source color space: srgb, pixel format: uint8, alpha: 1",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toDataURL() respects legacy behavior         in color managed canvas: ImageFormat: image/webp, source color space: srgb, pixel format: float16, alpha: 0.5",
          "status": "PASS",
          "message": null
        },
        {
          "name": "Test if toDataURL() respects legacy behavior         in color managed canvas: ImageFormat: image/webp, source color space: srgb, pixel format: float16, alpha: 1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.draw.baseline.top.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "textBaseline top is the top of the em square (not the bounding box)",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.transform.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fillRect is affected by transforms",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.stackdepth.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() stack depth is not unreasonably limited",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.canvas.lighter.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.canvas.lighter",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.hsla-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-6.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.hsl-6",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/conformance-requirements/2d.missingargs.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Missing arguments cause TypeError",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.orientation.canvas.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas patterns do not get flipped when painted",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.multiple.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.interpolate.multiple",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.nocontext.source-out.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.html4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.html4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.hex4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/scroll/2d.scrollPathIntoView.verticalLR.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "scrollPathIntoView() works in vertical-lr writing mode",
          "status": "FAIL",
          "message": "ctx.scrollPathIntoView is not a function"
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.isPointInPath.bezier.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "isPointInPath() works on Bezier curves",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hsla-clamp-6.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hsla-clamp-6",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.css-color-4-hsla-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.rotate.radians.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "rotate() uses radians",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.globalCompositeOperation.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() works for globalCompositeOperation",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.alpha.3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are affected by globalAlpha",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.width.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "lineWidth determines the width of line strokes",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.canvas.source-out.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.canvas.source-out",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.transform.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows take account of transformations",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.fillRect.nonfinite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fillRect() with Infinity/NaN is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.offset.negativeY.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows can be offset with negative y",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.offset.negativeX.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows can be offset with negative x",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.fill.winding.subtract.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.fill.winding.subtract.1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.clip.xor.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fill() does not affect pixels outside the clip region.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.fill.winding.subtract.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.fill.winding.subtract.2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.fill.destination-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.transparent.destination-out.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.transparent.destination-out",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.object.round.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "ImageData.data rounds numbers with round-to-zero",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.negative.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "strokeRect of negative sizes works",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.nocontext.copy.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage() of a canvas with no context draws pixels as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.object.ctor.size.bounds.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "ImageData has a usable constructor",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.clip.basic.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.clip.basic.2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.solid.source-out.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.solid.source-out",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.globalAlpha.image.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.globalAlpha.image",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.align.end.rtl.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "textAlign end with rtl is the left edge",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.miter.invalid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Setting miterLimit to invalid values is ignored",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-rgba-4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.css-color-4-rgba-3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.image.destination-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.image.destination-in",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.rect.zero.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.rect.zero.2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "2dcontext/wide-gamut-canvas/canvas-drawImage-offscreenCanvas.html",
      "status": "TIMEOUT",
      "message": null,
      "subtests": [
        {
          "status": "TIMEOUT",
          "xstatus": "SERVERTIMEOUT"
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.gradient.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn for gradient fills",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.path.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "strokeRect does not affect the current path",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.repeat.nullsuffix.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.repeat.nullsuffix",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.css-color-4-rgba-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.path.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() does not affect the current path",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.canvas.transparent.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are not drawn for transparent parts of canvases",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.image.source-out.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.fontface.repeat.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Draw with the font immediately, then wait a bit until and draw again. (This crashes some version of WebKit.)",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.get.clamp.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "getImageData() clamps colours to the range [0, 255]",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.css-color-4-hsl-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.fillRect.shadow.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fillRect draws shadows",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hex3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hex3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.rotate.zero.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "rotate() by 0 does nothing",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgb-num.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgb-num",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.create1.initial.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageData(imgdata) returns transparent black data of the right size",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.hex1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.stroke.prune.closed.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Zero-length line segments from closed paths are removed before stroking",
          "status": "FAIL",
          "message": "assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255"
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.put.unaffected.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "putImageData() is not affected by context state",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.negative.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createRadialGradient() throws INDEX_SIZE_ERR if either radius is negative",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.pattern.transparent.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are not drawn for transparent parts of fill patterns",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.maxWidth.bound.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fillText handles maxWidth based on line size, not bounding box size",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.operation.get.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.operation.get",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.transform.multiply.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "transform() multiplies the CTM",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.outside1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.outside1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.get.order.cols.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "getImageData() returns leftmost columns first",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.svg-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.svg-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.lineJoin.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() works for lineJoin",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.create1.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageData(imgdata) exists and returns something",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.composite.3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Areas outside shadows are drawn correctly with destination-out",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.isPointInPath.winding.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "isPointInPath() uses the non-zero winding number rule",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.alpha.4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows with alpha components are correctly affected by globalAlpha",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsla-7",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.get.solid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.get.solid",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.fillRect.path.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fillRect does not affect the current path",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.stroke.prune.line.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Zero-length line segments from lineTo are removed before stroking",
          "status": "FAIL",
          "message": "assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255"
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.css-color-4-hsla-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.canvas.destination-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.canvas.destination-in",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.rgba-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-hsla-9",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.image.copy.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.image.copy",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.outside3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.outside3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/wide-gamut-canvas/canvas-colorManaged-convertToBlob-roundtrip.html",
      "status": "ERROR",
      "message": "Uncaught TypeError: srcCanvas.convertToBlob is not a function",
      "subtests": [
        {
          "name": "Test canvas convertToBlob(): mimeType: image/png, blobPixelFormat: uint8, source color space: srgb, pixel format: uint8, alpha: 0.5",
          "status": "NOTRUN",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.measure.actualBoundingBox.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Testing actualBoundingBox",
          "status": "FAIL",
          "message": "assert_equals: Math.abs(ctx.measureText('A').actualBoundingBoxLeft) === 0 (got NaN[number], expected 0[number]) expected 0 but got NaN"
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.stroke.scale1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Stroke line widths are scaled by the current transformation matrix",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.clip.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are not drawn outside the clipping region",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.maxWidth.NaN.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fillText handles maxWidth correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.align.valid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.align.valid",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arcTo.ensuresubpath.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "If there is no subpath, the first control point is added",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.solid.source-atop.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.solid.source-atop",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.get.zero.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "getImageData() throws INDEX_SIZE_ERR if size is zero",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.transparent.source-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.transparent.source-in",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.get.order.alpha.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "getImageData() returns A in the fourth component",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.image.copy.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.stroke.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.interpolate.zerosize.stroke",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.strokeStyle.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() works for strokeStyle",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.bezierCurveTo.shape.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.bezierCurveTo.shape",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_001.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawFocusIfNeeded draws a focus ring.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.rect.winding.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.rect.winding",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.attributes.shadowOffset.valid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.shadow.attributes.shadowOffset.valid",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.scale.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Non-uniformly scaled arcs are the right shape",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.isPointInPath.transform.4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "isPointInPath() handles transformations correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.quadraticCurveTo.ensuresubpath.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "If there is no subpath, the first control point is added",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.hsl-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.cone.front.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.cone.front",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.solid.xor.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.solid.xor",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.hex3",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.image.destination-atop.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.image.destination-atop",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.hex4.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.hex4",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.image.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Shadows are drawn for images",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.rect.zero.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.rect.zero.1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.hsl-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.operation.darker.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.operation.darker",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.paint.repeat.outside.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.paint.repeat.outside",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/imagebitmap/canvas-createImageBitmap-resize.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageBitmap from a Blob with resize option.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a HTMLCanvasElement with resize option.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from a HTMLImageElement with resize option.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an ImageBitmap with resize option.",
          "status": "PASS",
          "message": null
        },
        {
          "name": "createImageBitmap from an ImageData with resize option.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.object.string.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "ImageData.data converts strings to numbers with ToNumber",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.transparent.destination-in.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.transparent.destination-in",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.image.broken.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.image.broken",
          "status": "FAIL",
          "message": "assert_throws: function \"function() { ctx.createPattern(img, 'repeat'); }\" did not throw"
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-rectangles-to-the-canvas/2d.fillRect.zero.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fillRect of zero pixels has no effect",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.rgb-clamp-2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.clip.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() affects the clipping path",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.rect.end.1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.rect.end.1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.repeat.null.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.pattern.repeat.null",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.isPointInPath.transform.3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "isPointInPath() handles transformations correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.object.nan.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "ImageData.data converts NaN to 0",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.uncovered.fill.source-out.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fill() draws pixels not covered by the source object as (0,0,0,0), and does not leave the pixels unchanged.",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.invalid.css-color-4-rgb-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.unaffected.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "fillText does not start a new path or subpath",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.composite.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.composite",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.font.parse.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.font.parse.basic",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/text-styles/2d.text.baseline.invalid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.text.baseline.invalid",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/compositing/2d.composite.canvas.destination-atop.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.composite.canvas.destination-atop",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.cone.top.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.cone.top",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.join.parallel.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Line joins are drawn at 180-degree joins",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.9arg.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.9arg.basic",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.quadraticCurveTo.scaled.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.path.quadraticCurveTo.scaled",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.empty.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arc() with an empty path does not draw a straight line to the start point",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.radial.inside2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.radial.inside2",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arcTo.zero.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arcTo() with zero radius draws a straight line from P0 to P1, even when all points are collinear",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arcTo.collinear.3.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "arcTo() with all points on a line, and P0 between P1/P2, draws a straight line to P1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.isPointInPath.arc.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "isPointInPath() works on arcs",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.lineTo.ensuresubpath.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "If there is no subpath, the point is added and used for subsequent drawing",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/path-objects/2d.path.arc.scale.2.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Highly scaled arcs are the right shape",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.pattern.animated.gif.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createPattern() of an animated GIF draws the first frame",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.css-color-4-rgb-5",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.null.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.drawImage.null",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerosource.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "drawImage with zero-sized source rectangle draws nothing without exception",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.gradient.object.update.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.gradient.object.update",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.transparent-1.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.fillStyle.parse.transparent-1",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.object.properties.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "ImageData objects have the right properties",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.put.alpha.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "putImageData() puts non-solid image data correctly",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/pixel-manipulation/2d.imageData.create2.basic.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "createImageData(sw, sh) exists and returns something",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/line-styles/2d.line.miter.obtuse.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Miter joins are drawn correctly with obtuse angles",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/transformations/2d.transformation.scale.negative.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "scale() with negative scale factors works",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/the-canvas-state/2d.state.saverestore.textBaseline.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "save()/restore() works for textBaseline",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.space.collapse.nonspace.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Non-space characters are not converted to U+0020 and collapsed",
          "status": "PASS",
          "message": null
        }
      ]
    },
    {
      "test": "/2dcontext/shadows/2d.shadow.attributes.shadowColor.valid.html",
      "status": "OK",
      "message": null,
      "subtests": [
        {
          "name": "Canvas test: 2d.shadow.attributes.shadowColor.valid",
          "status": "PASS",
          "message": null
        }
      ]
    }
  ]
}