Skip to content

Instantly share code, notes, and snippets.

@jeregrine
Last active December 9, 2021 23:02
Show Gist options
  • Save jeregrine/63f66d288221e89e6f90a8a6d5c868bb to your computer and use it in GitHub Desktop.
Save jeregrine/63f66d288221e89e6f90a8a6d5c868bb to your computer and use it in GitHub Desktop.
LiveBook Canvas Example. You will need to run this locally and apply a patch to make it possible.

Canvas Example

Setup

First clone livebook and apply the following diff (time of writing commit 973fc51c9d5cdcc8863016de0cf9127add0a90fb)

diff --git a/assets/js/app.js b/assets/js/app.js
index 5742422..bf6bd2f 100644
--- a/assets/js/app.js
+++ b/assets/js/app.js
@@ -20,6 +20,7 @@ import VirtualizedLines from "./virtualized_lines";
 import UserForm from "./user_form";
 import EditorSettings from "./editor_settings";
 import VegaLite from "./vega_lite";
+import Canvas from "./canvas";
 import Timer from "./timer";
 import MarkdownRenderer from "./markdown_renderer";
 import Highlight from "./highlight";
@@ -39,6 +40,7 @@ const hooks = {
   UserForm,
   EditorSettings,
   VegaLite,
+  Canvas,
   Timer,
   MarkdownRenderer,
   Highlight,
diff --git a/assets/js/canvas.js b/assets/js/canvas.js
new file mode 100644
index 0000000..3622f6d
--- /dev/null
+++ b/assets/js/canvas.js
@@ -0,0 +1,89 @@
+import { getAttributeOrThrow, getAttributeOrDefault } from "./lib/attribute";
+
+/**
+ * A hook used to render graphics according to the given
+ * context ops list
+ *
+ * The hook expects a `canvas:<id>:init` event with `{ ops }` payload,
+ * where `ops` is a list of functions and args to call on the CanvasRenderingContext2d
+ * [["fillRect", [130, 190,40,60]]..]
+ * https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D
+ *
+ * Later `canvas:<id>:push` events may be sent with more `{ ops }` payload,
+ * to dynamically update the canbas.
+ *
+ * Configuration:
+ *
+ *   * `data-id` - canvas id
+ *
+ */
+const Canvas = {
+  mounted() {
+    this.props = getProps(this);
+    this.state = {
+      canvas: null,
+      ctx: null
+    };
+
+    this.state.canvas = document.createElement("canvas");
+    this.state.canvas.setAttribute("id", this.props.id);
+    this.state.canvas.setAttribute("width", this.props.width)
+    this.state.canvas.setAttribute("height", this.props.height)
+    this.el.appendChild(this.state.canvas);
+
+
+    this.state.ctx = this.state.canvas.getContext('2d');
+    const applyOps = ctxOperator(this.state.ctx)
+
+    this.handleEvent(`canvas:${this.props.id}:init`, ({ ops }) => {
+      applyOps(ops)
+    });
+
+    this.handleEvent(`canvas:${this.props.id}:push`, ({ ops }) => {
+      applyOps(ops)
+    });
+  },
+
+  updated() {
+    this.props = getProps(this);
+    this.state.canvas.setAttribute("width", this.props.width);
+    this.state.canvas.setAttribute("height", this.props.height);
+  },
+
+  destroyed() {
+    if (this.state.viewPromise) {
+      this.state.viewPromise.then((view) => view.finalize());
+    }
+  },
+};
+
+function ctxOperator(ctx) {
+  return function(ops) {
+    for (const [op, args] of ops) {
+      console.log({op, args})
+
+        try {
+          if (op == "set") {
+            ctx[args[0]] = args[1];
+          } else if (typeof ctx[op] === "function") {
+            const arg = args.filter(x => x != "unset")
+            ctx[op](...arg);
+          } else {
+            console.log("Recieved a bad function:" + op)
+          }
+      } catch (e) {
+        console.error(e)
+      }
+    }
+  }
+}
+
+function getProps(hook) {
+  return {
+    id: getAttributeOrThrow(hook.el, "data-id"),
+    width: getAttributeOrDefault(hook.el, "data-width", 300),
+    height: getAttributeOrDefault(hook.el, "data-height", 300),
+  };
+}
+
+export default Canvas
diff --git a/assets/package-lock.json b/assets/package-lock.json
index f3e4d8e..3e39498 100644
--- a/assets/package-lock.json
+++ b/assets/package-lock.json
@@ -61,7 +61,7 @@
       "version": "3.1.0"
     },
     "../deps/phoenix_live_view": {
-      "version": "0.17.4",
+      "version": "0.17.5",
       "license": "MIT"
     },
     "node_modules/@babel/code-frame": {
diff --git a/lib/livebook_web/live/output.ex b/lib/livebook_web/live/output.ex
index 0fdaf87..6faa64f 100644
--- a/lib/livebook_web/live/output.ex
+++ b/lib/livebook_web/live/output.ex
@@ -85,6 +85,10 @@ defmodule LivebookWeb.Output do
     live_component(LivebookWeb.Output.VegaLiteStaticComponent, id: id, spec: spec)
   end
 
+  defp render_output({:canvas_static, ops, width, height}, %{id: id}) do
+    live_component(LivebookWeb.Output.CanvasStaticComponent, id: id, ops: ops, width: width, height: height)
+  end
+
   defp render_output({:vega_lite_dynamic, pid}, %{id: id, socket: socket}) do
     live_render(socket, LivebookWeb.Output.VegaLiteDynamicLive,
       id: id,
diff --git a/lib/livebook_web/live/output/canvas_static_component.ex b/lib/livebook_web/live/output/canvas_static_component.ex
new file mode 100644
index 0000000..f8821ca
--- /dev/null
+++ b/lib/livebook_web/live/output/canvas_static_component.ex
@@ -0,0 +1,22 @@
+defmodule LivebookWeb.Output.CanvasStaticComponent do
+  use LivebookWeb, :live_component
+
+  @impl true
+  def update(assigns, socket) do
+    socket = 
+      socket
+      |> assign(id: assigns.id)
+      |> assign(width: assigns.width)
+      |> assign(height: assigns.height)
+
+    {:ok, push_event(socket, "canvas:#{socket.assigns.id}:init", %{"ops" => assigns.ops})}
+  end
+
+  @impl true
+  def render(assigns) do
+    ~H"""
+    <div id={"canvas-#{@id}"} phx-hook="Canvas" phx-update="ignore" data-id={@id} width={@width} height={@height} >
+    </div>
+    """
+  end
+end
Mix.install([
  {:kino, "~> 0.4.1"},
  {:jason, "~> 1.2"}
])
:ok

Ignore This Bit

canvas_ops = [
  {:op, :restore, "restore", [],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/restore",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-restore-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [],
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "restore",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :fill_text, "fillText",
   [
     {:required, "DOMString", {:text, [], nil}},
     {:required, "double", {:x, [], nil}},
     {:required, "double", {:y, [], nil}},
     {:optional, "double", {:max_width, [], nil}, nil}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/fillText",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-filltext-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2009-06-30", "version_added" => "3.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "DOMString",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "text",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "maxWidth",
         "optional" => true,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"},
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "fillText",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :arc, "arc",
   [
     {:required, "double", {:x, [], nil}},
     {:required, "double", {:y, [], nil}},
     {:required, "double", {:radius, [], nil}},
     {:required, "double", {:start_angle, [], nil}},
     {:required, "double", {:end_angle, [], nil}},
     {:optional, "boolean", {:anticlockwise, [], nil}, %{"type" => "boolean", "value" => false}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/arc",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-arc-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2011-12-06", "version_added" => "11.6"},
       "opera_android" => %{"release_date" => "2012-02-25", "version_added" => "12"},
       "safari" => %{"release_date" => "2007-10-26", "version_added" => "3"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "radius",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "startAngle",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "endAngle",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => %{"type" => "boolean", "value" => false},
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "boolean",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "anticlockwise",
         "optional" => true,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"},
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "arc",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :rotate, "rotate", [{:required, "double", {:angle, [], nil}}],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/rotate",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-rotate-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "angle",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"},
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "rotate",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_image_smoothing_enabled, "imageSmoothingEnabled",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-imagesmoothingenabled-dev",
     "status" => %{"deprecated" => false, "experimental" => true, "standard_track" => true},
     "support" => %{
       "chrome" => [
         %{"release_date" => "2013-10-01", "version_added" => "30"},
         %{
           "prefix" => "webkit",
           "release_date" => "2012-07-31",
           "version_added" => "21",
           "version_removed" => "30"
         }
       ],
       "chrome_android" => [
         %{"release_date" => "2013-10-02", "version_added" => "30"},
         %{
           "prefix" => "webkit",
           "release_date" => "2013-02-27",
           "version_added" => "25",
           "version_removed" => "30"
         }
       ],
       "edge" => [
         %{"release_date" => "2017-04-05", "version_added" => "15"},
         %{
           "prefix" => "ms",
           "release_date" => "2015-07-28",
           "version_added" => "12",
           "version_removed" => "15"
         }
       ],
       "firefox" => [
         %{"release_date" => "2017-01-24", "version_added" => "51"},
         %{
           "prefix" => "moz",
           "release_date" => "2010-01-21",
           "version_added" => "3.6",
           "version_removed" => "51"
         }
       ],
       "firefox_android" => [
         %{"release_date" => "2017-01-24", "version_added" => "51"},
         %{
           "prefix" => "moz",
           "release_date" => "2011-03-29",
           "version_added" => "4",
           "version_removed" => "51"
         }
       ],
       "ie" => %{"prefix" => "ms", "release_date" => "2013-10-17", "version_added" => "11"},
       "opera" => [
         %{"release_date" => "2013-10-08", "version_added" => "17"},
         %{
           "prefix" => "webkit",
           "release_date" => "2013-07-02",
           "version_added" => "15",
           "version_removed" => "17"
         }
       ],
       "opera_android" => [
         %{"release_date" => "2013-11-20", "version_added" => "18"},
         %{
           "prefix" => "webkit",
           "release_date" => "2013-05-21",
           "version_added" => "14",
           "version_removed" => "18"
         }
       ],
       "safari" => %{"release_date" => "2016-03-21", "version_added" => "9.1"},
       "safari_ios" => %{"release_date" => "2016-03-21", "version_added" => "9.3"},
       "samsunginternet_android" => [
         %{"release_date" => "2014-10-17", "version_added" => "2.0"},
         %{
           "prefix" => "webkit",
           "release_date" => "2013-09-25",
           "version_added" => "1.5",
           "version_removed" => "2.0"
         }
       ],
       "webview_android" => %{"release_date" => "2013-12-09", "version_added" => "4.4"}
     }
   },
   %{
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "boolean",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "imageSmoothingEnabled",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :fill, "fill",
   [
     {:required, "Path2D", {:path, [], nil}},
     {:optional, "CanvasWindingRule", {:winding, [], nil},
      %{"type" => "string", "value" => "nonzero"}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/fill",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-fill-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "Path2D",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "path",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => %{"type" => "string", "value" => "nonzero"},
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "CanvasWindingRule",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "winding",
         "optional" => true,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "fill",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_text_align, "textAlign",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/textAlign",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-textalign-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2009-06-30", "version_added" => "3.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "DOMString",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "textAlign",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :set_transform, "setTransform", [{:required, "SVGMatrix", {:matrix, [], nil}}],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/setTransform",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-settransform-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2008-06-17", "version_added" => "3"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "SVGMatrix",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "matrix",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "setTransform",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :line_to, "lineTo",
   [{:required, "double", {:x, [], nil}}, {:required, "double", {:y, [], nil}}],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/lineTo",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-lineto-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2011-12-06", "version_added" => "11.6"},
       "opera_android" => %{"release_date" => "2012-02-25", "version_added" => "12"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "lineTo",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :begin_path, "beginPath", [],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/beginPath",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-beginpath-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [],
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "beginPath",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_shadow_offset_x, "shadowOffsetX",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/shadowOffsetX",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-shadowoffsetx-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "double",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "shadowOffsetX",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:setter, :set_font, "font",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/font",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-font-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2009-06-30", "version_added" => "3.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "SetterThrows",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "DOMString",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "font",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:setter, :set_line_width, "lineWidth",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/lineWidth",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linewidth-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "double",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "lineWidth",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:setter, :set_miter_limit, "miterLimit",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/miterLimit",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-miterlimit-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "double",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "miterLimit",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:setter, :set_global_composite_operation, "globalCompositeOperation",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-globalcompositeoperation-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2006-06-20", "version_added" => "9"},
       "opera_android" => %{"release_date" => "2010-11-09", "version_added" => "10.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "DOMString",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "globalCompositeOperation",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:setter, :set_global_alpha, "globalAlpha",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/globalAlpha",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-globalalpha-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "unrestricted double",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "globalAlpha",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :fill_rect, "fillRect",
   [
     {:required, "double", {:x, [], nil}},
     {:required, "double", {:y, [], nil}},
     {:required, "double", {:w, [], nil}},
     {:required, "double", {:h, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/fillRect",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-fillrect-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2006-06-20", "version_added" => "9"},
       "opera_android" => %{"release_date" => "2010-11-09", "version_added" => "10.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "w",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "h",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "fillRect",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_line_join, "lineJoin",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linejoin-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "GetterThrows",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "DOMString",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "lineJoin",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :put_image_data, "putImageData",
   [
     {:required, "ImageData", {:imagedata, [], nil}},
     {:required, "double", {:dx, [], nil}},
     {:required, "double", {:dy, [], nil}},
     {:required, "double", {:dirty_x, [], nil}},
     {:required, "double", {:dirty_y, [], nil}},
     {:required, "double", {:dirty_width, [], nil}},
     {:required, "double", {:dirty_height, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/putImageData",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-putimagedata-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2006-10-24", "version_added" => "2"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "ImageData",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "imagedata",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "dx",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "dy",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "dirtyX",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "dirtyY",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "dirtyWidth",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "dirtyHeight",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "putImageData",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :clip, "clip",
   [
     {:required, "Path2D", {:path, [], nil}},
     {:optional, "CanvasWindingRule", {:winding, [], nil},
      %{"type" => "string", "value" => "nonzero"}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/clip",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-clip-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "Path2D",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "path",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => %{"type" => "string", "value" => "nonzero"},
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "CanvasWindingRule",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "winding",
         "optional" => true,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "clip",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :get_line_dash, "getLineDash", [],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/getLineDash",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-getlinedash-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2012-11-06", "version_added" => "23"},
       "chrome_android" => %{"release_date" => "2013-02-27", "version_added" => "25"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2014-02-04", "version_added" => "27"},
       "firefox_android" => %{"release_date" => "2014-02-04", "version_added" => "27"},
       "ie" => %{"release_date" => "2013-10-17", "version_added" => "11"},
       "opera" => %{"release_date" => "2013-07-02", "version_added" => "15"},
       "opera_android" => %{"release_date" => "2013-05-21", "version_added" => "14"},
       "safari" => %{"release_date" => "2013-10-22", "version_added" => "7"},
       "safari_ios" => %{"release_date" => "2013-09-18", "version_added" => "7"},
       "samsunginternet_android" => %{"release_date" => "2013-09-25", "version_added" => "1.5"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "arguments" => [],
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "sequence",
       "idlType" => [
         %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "return-type",
           "union" => false
         }
       ],
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "getLineDash",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :bezier_curve_to, "bezierCurveTo",
   [
     {:required, "double", {:cp1x, [], nil}},
     {:required, "double", {:cp1y, [], nil}},
     {:required, "double", {:cp2x, [], nil}},
     {:required, "double", {:cp2y, [], nil}},
     {:required, "double", {:x, [], nil}},
     {:required, "double", {:y, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/bezierCurveTo",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-beziercurveto-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2011-12-06", "version_added" => "11.6"},
       "opera_android" => %{"release_date" => "2012-02-25", "version_added" => "12"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "cp1x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "cp1y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "cp2x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "cp2y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "bezierCurveTo",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_text_baseline, "textBaseline",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/textBaseline",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-textbaseline-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2009-06-30", "version_added" => "3.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "DOMString",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "textBaseline",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :is_point_in_path, "isPointInPath",
   [
     {:required, "Path2D", {:path, [], nil}},
     {:required, "unrestricted double", {:x, [], nil}},
     {:required, "unrestricted double", {:y, [], nil}},
     {:optional, "CanvasWindingRule", {:winding, [], nil},
      %{"type" => "string", "value" => "nonzero"}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/isPointInPath",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-ispointinpath-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2006-10-24", "version_added" => "2"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2008-03-18", "version_added" => "3.1"},
       "safari_ios" => %{"release_date" => "2008-07-11", "version_added" => "2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "Path2D",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "path",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "unrestricted double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "unrestricted double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => %{"type" => "string", "value" => "nonzero"},
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "CanvasWindingRule",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "winding",
         "optional" => true,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "NeedsSubjectPrincipal",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "boolean",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "isPointInPath",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :stroke_rect, "strokeRect",
   [
     {:required, "double", {:x, [], nil}},
     {:required, "double", {:y, [], nil}},
     {:required, "double", {:w, [], nil}},
     {:required, "double", {:h, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/strokeRect",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-strokerect-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "w",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "h",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "strokeRect",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :stroke_text, "strokeText",
   [
     {:required, "DOMString", {:text, [], nil}},
     {:required, "double", {:x, [], nil}},
     {:required, "double", {:y, [], nil}},
     {:optional, "double", {:max_width, [], nil}, nil}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/strokeText",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-stroketext-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2009-06-30", "version_added" => "3.5"},
       "firefox_android" => %{"version_added" => true},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "DOMString",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "text",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "maxWidth",
         "optional" => true,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"},
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "strokeText",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :create_pattern, "createPattern",
   [
     {:required, "CanvasImageSource", {:image, [], nil}},
     {:required, "DOMString", {:repetition, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/createPattern",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-createpattern-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "CanvasImageSource",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "image",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [
           %{
             "arguments" => [],
             "name" => "TreatNullAs",
             "rhs" => %{"type" => "identifier", "value" => "EmptyString"},
             "type" => "extended-attribute"
           }
         ],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "DOMString",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "repetition",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "NewObject", "rhs" => nil, "type" => "extended-attribute"},
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "CanvasPattern",
       "nullable" => true,
       "type" => "return-type",
       "union" => false
     },
     "name" => "createPattern",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :measure_text, "measureText", [{:required, "DOMString", {:text, [], nil}}],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/measureText",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-measuretext-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2006-10-24", "version_added" => "2"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "DOMString",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "text",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "NewObject", "rhs" => nil, "type" => "extended-attribute"},
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "TextMetrics",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "measureText",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_filter, "filter",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/filter",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-filter-dev",
     "status" => %{"deprecated" => false, "experimental" => true, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2016-07-20", "version_added" => "52"},
       "chrome_android" => %{"release_date" => "2016-07-27", "version_added" => "52"},
       "edge" => %{"release_date" => "2020-01-15", "version_added" => "79"},
       "firefox" => %{"release_date" => "2016-09-20", "version_added" => "49"},
       "firefox_android" => %{"release_date" => "2016-09-20", "version_added" => "49"},
       "ie" => %{"version_added" => false},
       "opera" => %{"release_date" => "2016-08-02", "version_added" => "39"},
       "opera_android" => %{"release_date" => "2016-10-25", "version_added" => "41"},
       "safari" => %{"version_added" => false},
       "safari_ios" => %{"version_added" => false},
       "samsunginternet_android" => %{"release_date" => "2017-08-23", "version_added" => "6.0"},
       "webview_android" => %{"release_date" => "2016-07-27", "version_added" => "52"}
     }
   },
   %{
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "Pref",
         "rhs" => %{"type" => "string", "value" => "canvas.filters.enabled"},
         "type" => "extended-attribute"
       },
       %{
         "arguments" => [],
         "name" => "SetterThrows",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "DOMString",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "filter",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :draw_image, "drawImage",
   [
     {:required, "CanvasImageSource", {:image, [], nil}},
     {:required, "double", {:sx, [], nil}},
     {:required, "double", {:sy, [], nil}},
     {:required, "double", {:sw, [], nil}},
     {:required, "double", {:sh, [], nil}},
     {:required, "double", {:dx, [], nil}},
     {:required, "double", {:dy, [], nil}},
     {:required, "double", {:dw, [], nil}},
     {:required, "double", {:dh, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-drawimage-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2006-06-20", "version_added" => "9"},
       "opera_android" => %{"release_date" => "2010-11-09", "version_added" => "10.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "CanvasImageSource",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "image",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "sx",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "sy",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "sw",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "sh",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "dx",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "dy",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "dw",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "dh",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"},
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "drawImage",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :is_point_in_stroke, "isPointInStroke",
   [
     {:required, "Path2D", {:path, [], nil}},
     {:required, "unrestricted double", {:x, [], nil}},
     {:required, "unrestricted double", {:y, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/isPointInStroke",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-ispointinstroke-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2013-03-26", "version_added" => "26"},
       "chrome_android" => %{"release_date" => "2013-04-03", "version_added" => "26"},
       "edge" => %{"release_date" => "2020-01-15", "version_added" => "79"},
       "firefox" => [
         %{"release_date" => "2013-04-02", "version_added" => "20"},
         %{
           "prefix" => "moz",
           "release_date" => "2013-02-19",
           "version_added" => "19",
           "version_removed" => "20"
         }
       ],
       "firefox_android" => [
         %{"release_date" => "2013-04-02", "version_added" => "20"},
         %{
           "prefix" => "moz",
           "release_date" => "2013-02-19",
           "version_added" => "19",
           "version_removed" => "20"
         }
       ],
       "ie" => %{"version_added" => false},
       "opera" => %{"release_date" => "2013-07-02", "version_added" => "15"},
       "opera_android" => %{"release_date" => "2013-05-21", "version_added" => "14"},
       "safari" => %{"release_date" => "2013-10-22", "version_added" => "7"},
       "safari_ios" => %{"release_date" => "2013-09-18", "version_added" => "7"},
       "samsunginternet_android" => %{"release_date" => "2013-09-25", "version_added" => "1.5"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "Path2D",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "path",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "unrestricted double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "unrestricted double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "NeedsSubjectPrincipal",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "boolean",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "isPointInStroke",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :save, "save", [],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/save",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-save-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [],
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "save",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :stroke, "stroke", [{:required, "Path2D", {:path, [], nil}}],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/stroke",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-stroke-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "Path2D",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "path",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "stroke",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :move_to, "moveTo",
   [{:required, "double", {:x, [], nil}}, {:required, "double", {:y, [], nil}}],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/moveTo",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-moveto-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2011-12-06", "version_added" => "11.6"},
       "opera_android" => %{"release_date" => "2012-02-25", "version_added" => "12"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "moveTo",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :create_radial_gradient, "createRadialGradient",
   [
     {:required, "double", {:x0, [], nil}},
     {:required, "double", {:y0, [], nil}},
     {:required, "double", {:r0, [], nil}},
     {:required, "double", {:x1, [], nil}},
     {:required, "double", {:y1, [], nil}},
     {:required, "double", {:r1, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/createRadialGradient",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-createradialgradient-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x0",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y0",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "r0",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x1",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y1",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "r1",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "NewObject", "rhs" => nil, "type" => "extended-attribute"},
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "CanvasGradient",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "createRadialGradient",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_fill_style, "fillStyle",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/fillStyle",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-fillstyle-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => [
         %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "DOMString",
           "nullable" => false,
           "type" => nil,
           "union" => false
         },
         %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "CanvasGradient",
           "nullable" => false,
           "type" => nil,
           "union" => false
         },
         %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "CanvasPattern",
           "nullable" => false,
           "type" => nil,
           "union" => false
         }
       ],
       "nullable" => false,
       "type" => "attribute-type",
       "union" => true
     },
     "name" => "fillStyle",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :clear_rect, "clearRect",
   [
     {:required, "double", {:x, [], nil}},
     {:required, "double", {:y, [], nil}},
     {:required, "double", {:w, [], nil}},
     {:required, "double", {:h, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/clearRect",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-clearrect-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "w",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "h",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "clearRect",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_stroke_style, "strokeStyle",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/strokeStyle",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-strokestyle-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => [
         %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "DOMString",
           "nullable" => false,
           "type" => nil,
           "union" => false
         },
         %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "CanvasGradient",
           "nullable" => false,
           "type" => nil,
           "union" => false
         },
         %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "CanvasPattern",
           "nullable" => false,
           "type" => nil,
           "union" => false
         }
       ],
       "nullable" => false,
       "type" => "attribute-type",
       "union" => true
     },
     "name" => "strokeStyle",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :set_line_dash, "setLineDash",
   [
     {:required,
      [
        %{
          "extAttrs" => [],
          "generic" => "",
          "idlType" => "double",
          "nullable" => false,
          "type" => "argument-type",
          "union" => false
        }
      ], {:segments, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-setlinedash-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2012-11-06", "version_added" => "23"},
       "chrome_android" => %{"release_date" => "2013-02-27", "version_added" => "25"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2014-02-04", "version_added" => "27"},
       "firefox_android" => %{"release_date" => "2014-02-04", "version_added" => "27"},
       "ie" => %{"release_date" => "2013-10-17", "version_added" => "11"},
       "opera" => %{"release_date" => "2013-07-02", "version_added" => "15"},
       "opera_android" => %{"release_date" => "2013-05-21", "version_added" => "14"},
       "safari" => %{"release_date" => "2013-10-22", "version_added" => "7"},
       "safari_ios" => %{"release_date" => "2013-09-18", "version_added" => "7"},
       "samsunginternet_android" => %{"release_date" => "2013-09-25", "version_added" => "1.5"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "sequence",
           "idlType" => [
             %{
               "extAttrs" => [],
               "generic" => "",
               "idlType" => "double",
               "nullable" => false,
               "type" => "argument-type",
               "union" => false
             }
           ],
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "segments",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       },
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "setLineDash",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :reset_transform, "resetTransform", [],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/resetTransform",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-resettransform-dev",
     "status" => %{"deprecated" => false, "experimental" => true, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2013-11-12", "version_added" => "31"},
       "chrome_android" => %{"release_date" => "2013-11-14", "version_added" => "31"},
       "edge" => %{"release_date" => "2020-01-15", "version_added" => "79"},
       "firefox" => %{"release_date" => "2015-02-24", "version_added" => "36"},
       "firefox_android" => %{"release_date" => "2015-02-27", "version_added" => "36"},
       "ie" => %{"version_added" => false},
       "opera" => %{"release_date" => "2013-11-19", "version_added" => "18"},
       "opera_android" => %{"release_date" => "2013-11-20", "version_added" => "18"},
       "safari" => %{"release_date" => "2017-03-27", "version_added" => "10.1"},
       "safari_ios" => %{"release_date" => "2017-03-27", "version_added" => "10.3"},
       "samsunginternet_android" => %{"release_date" => "2014-10-17", "version_added" => "2.0"},
       "webview_android" => %{"release_date" => "2013-12-09", "version_added" => "4.4"}
     }
   },
   %{
     "arguments" => [],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "resetTransform",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :ellipse, "ellipse",
   [
     {:required, "double", {:x, [], nil}},
     {:required, "double", {:y, [], nil}},
     {:required, "double", {:radius_x, [], nil}},
     {:required, "double", {:radius_y, [], nil}},
     {:required, "double", {:rotation, [], nil}},
     {:required, "double", {:start_angle, [], nil}},
     {:required, "double", {:end_angle, [], nil}},
     {:optional, "boolean", {:anticlockwise, [], nil}, %{"type" => "boolean", "value" => false}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/ellipse",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-ellipse-dev",
     "status" => %{"deprecated" => false, "experimental" => true, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2013-11-12", "version_added" => "31"},
       "chrome_android" => %{"release_date" => "2013-11-14", "version_added" => "31"},
       "edge" => %{"release_date" => "2015-11-12", "version_added" => "13"},
       "firefox" => %{"release_date" => "2016-08-02", "version_added" => "48"},
       "firefox_android" => %{"release_date" => "2016-08-02", "version_added" => "48"},
       "ie" => %{"version_added" => false},
       "opera" => %{"release_date" => "2013-11-19", "version_added" => "18"},
       "opera_android" => %{"release_date" => "2013-11-20", "version_added" => "18"},
       "safari" => %{"release_date" => "2015-09-30", "version_added" => "9"},
       "safari_ios" => %{"release_date" => "2015-09-16", "version_added" => "9"},
       "samsunginternet_android" => %{"release_date" => "2014-10-17", "version_added" => "2.0"},
       "webview_android" => %{"release_date" => "2014-06-02", "version_added" => "4.4.3"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "radiusX",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "radiusY",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "rotation",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "startAngle",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "endAngle",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => %{"type" => "boolean", "value" => false},
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "boolean",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "anticlockwise",
         "optional" => true,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"},
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "ellipse",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_shadow_color, "shadowColor",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/shadowColor",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-shadowcolor-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "DOMString",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "shadowColor",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :transform, "transform",
   [
     {:required, "double", {:a, [], nil}},
     {:required, "double", {:b, [], nil}},
     {:required, "double", {:c, [], nil}},
     {:required, "double", {:d, [], nil}},
     {:required, "double", {:e, [], nil}},
     {:required, "double", {:f, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/transform",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-transform-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2008-06-17", "version_added" => "3"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2008-03-18", "version_added" => "3.1"},
       "safari_ios" => %{"release_date" => "2008-07-11", "version_added" => "2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "a",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "b",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "c",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "d",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "e",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "f",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"},
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "transform",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :create_image_data, "createImageData", [{:required, "ImageData", {:imagedata, [], nil}}],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/createImageData",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-createimagedata-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2006-10-24", "version_added" => "2"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "ImageData",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "imagedata",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "NewObject", "rhs" => nil, "type" => "extended-attribute"},
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "ImageData",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "createImageData",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_line_cap, "lineCap",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linecap-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "DOMString",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "lineCap",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :draw_focus_if_needed, "drawFocusIfNeeded", [{:required, "Element", {:element, [], nil}}],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/drawFocusIfNeeded",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-drawfocusifneeded-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2014-08-26", "version_added" => "37"},
       "chrome_android" => %{"release_date" => "2014-09-03", "version_added" => "37"},
       "edge" => %{"release_date" => "2016-08-02", "version_added" => "14"},
       "firefox" => [
         %{"release_date" => "2014-09-02", "version_added" => "32"},
         %{
           "alternative_name" => "drawSystemFocusRing",
           "release_date" => "2014-03-18",
           "version_added" => "28"
         }
       ],
       "firefox_android" => [
         %{"release_date" => "2014-09-02", "version_added" => "32"},
         %{
           "alternative_name" => "drawSystemFocusRing",
           "release_date" => "2014-03-18",
           "version_added" => "28"
         }
       ],
       "ie" => %{"version_added" => false},
       "opera" => %{"release_date" => "2014-09-02", "version_added" => "24"},
       "opera_android" => %{"release_date" => "2014-09-10", "version_added" => "24"},
       "safari" => %{"release_date" => "2014-10-16", "version_added" => "8"},
       "safari_ios" => %{"release_date" => "2014-09-17", "version_added" => "8"},
       "samsunginternet_android" => %{"release_date" => "2015-04-10", "version_added" => "3.0"},
       "webview_android" => %{"release_date" => "2014-09-03", "version_added" => "37"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "Element",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "element",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "Pref",
         "rhs" => %{"type" => "string", "value" => "canvas.focusring.enabled"},
         "type" => "extended-attribute"
       },
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "drawFocusIfNeeded",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_shadow_blur, "shadowBlur",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/shadowBlur",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-shadowblur-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "double",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "shadowBlur",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:setter, :set_line_dash_offset, "lineDashOffset",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linedashoffset-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2012-11-06", "version_added" => "23"},
       "chrome_android" => %{"release_date" => "2013-02-27", "version_added" => "25"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => [
         %{"release_date" => "2014-02-04", "version_added" => "27"},
         %{
           "alternative_name" => "mozDashOffset",
           "release_date" => "2011-09-27",
           "version_added" => "7"
         }
       ],
       "firefox_android" => [
         %{"release_date" => "2014-02-04", "version_added" => "27"},
         %{
           "alternative_name" => "mozDashOffset",
           "release_date" => "2011-09-27",
           "version_added" => "7"
         }
       ],
       "ie" => %{"release_date" => "2013-10-17", "version_added" => "11"},
       "opera" => %{"release_date" => "2013-07-02", "version_added" => "15"},
       "opera_android" => %{"release_date" => "2013-05-21", "version_added" => "14"},
       "safari" => %{"release_date" => "2013-10-22", "version_added" => "7"},
       "safari_ios" => %{"release_date" => "2013-09-18", "version_added" => "7"},
       "samsunginternet_android" => %{"release_date" => "2013-09-25", "version_added" => "1.5"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "double",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "lineDashOffset",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :scale, "scale",
   [{:required, "double", {:x, [], nil}}, {:required, "double", {:y, [], nil}}],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/scale",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-scale-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"},
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "scale",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :create_linear_gradient, "createLinearGradient",
   [
     {:required, "double", {:x0, [], nil}},
     {:required, "double", {:y0, [], nil}},
     {:required, "double", {:x1, [], nil}},
     {:required, "double", {:y1, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/createLinearGradient",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-createlineargradient-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x0",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y0",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x1",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y1",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "NewObject", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "CanvasGradient",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "createLinearGradient",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :translate, "translate",
   [{:required, "double", {:x, [], nil}}, {:required, "double", {:y, [], nil}}],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/translate",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-translate-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"},
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "translate",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :close_path, "closePath", [],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/closePath",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-closepath-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2011-12-06", "version_added" => "11.6"},
       "opera_android" => %{"release_date" => "2012-02-25", "version_added" => "12"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [],
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "closePath",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :arc_to, "arcTo",
   [
     {:required, "double", {:x1, [], nil}},
     {:required, "double", {:y1, [], nil}},
     {:required, "double", {:x2, [], nil}},
     {:required, "double", {:y2, [], nil}},
     {:required, "double", {:radius, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/arcTo",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-arcto-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2011-12-06", "version_added" => "11.6"},
       "opera_android" => %{"release_date" => "2012-02-25", "version_added" => "12"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x1",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y1",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x2",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y2",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "radius",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"},
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "arcTo",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :quadratic_curve_to, "quadraticCurveTo",
   [
     {:required, "double", {:cpx, [], nil}},
     {:required, "double", {:cpy, [], nil}},
     {:required, "double", {:x, [], nil}},
     {:required, "double", {:y, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/quadraticCurveTo",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-quadraticcurveto-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2011-12-06", "version_added" => "11.6"},
       "opera_android" => %{"release_date" => "2012-02-25", "version_added" => "12"},
       "safari" => %{"release_date" => "2007-10-26", "version_added" => "3"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "cpx",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "cpy",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "quadraticCurveTo",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :rect, "rect",
   [
     {:required, "double", {:x, [], nil}},
     {:required, "double", {:y, [], nil}},
     {:required, "double", {:w, [], nil}},
     {:required, "double", {:h, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/rect",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-rect-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2011-12-06", "version_added" => "11.6"},
       "opera_android" => %{"release_date" => "2012-02-25", "version_added" => "12"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "w",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "h",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "rect",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :get_image_data, "getImageData",
   [
     {:required, "double", {:sx, [], nil}},
     {:required, "double", {:sy, [], nil}},
     {:required, "double", {:sw, [], nil}},
     {:required, "double", {:sh, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/getImageData",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-getimagedata-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{
         "notes" =>
           "Since Firefox 5, <code>getImageData</code> now correctly accepts rectangles that extend beyond the bounds of the canvas; pixels outside the canvas are returned as transparent black and now also returns at least one pixel's worth of image data if a rectangle smaller than one pixel is specified.",
         "release_date" => "2006-10-24",
         "version_added" => "2"
       },
       "firefox_android" => %{
         "notes" =>
           "Since Firefox 5, <code>getImageData</code> now correctly accepts rectangles that extend beyond the bounds of the canvas; pixels outside the canvas are returned as transparent black and now also returns at least one pixel's worth of image data if a rectangle smaller than one pixel is specified.",
         "release_date" => "2011-03-29",
         "version_added" => "4"
       },
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2008-06-12", "version_added" => "9.5"},
       "opera_android" => %{"release_date" => "2010-11-09", "version_added" => "10.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "sx",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "sy",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "sw",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "sh",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "NewObject", "rhs" => nil, "type" => "extended-attribute"},
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"},
       %{
         "arguments" => [],
         "name" => "NeedsSubjectPrincipal",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "ImageData",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "getImageData",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :get_transform, "getTransform", [],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/getTransform",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-gettransform-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2018-07-24", "version_added" => "68"},
       "chrome_android" => %{"release_date" => "2018-07-24", "version_added" => "68"},
       "edge" => %{"release_date" => "2020-01-15", "version_added" => "79"},
       "firefox" => %{"release_date" => "2019-10-22", "version_added" => "70"},
       "firefox_android" => %{"version_added" => false},
       "ie" => %{"version_added" => false},
       "opera" => %{"release_date" => "2018-08-16", "version_added" => "55"},
       "opera_android" => %{"release_date" => "2018-11-08", "version_added" => "48"},
       "safari" => %{"release_date" => "2017-09-19", "version_added" => "11"},
       "safari_ios" => %{"release_date" => "2017-09-19", "version_added" => "11"},
       "samsunginternet_android" => %{"release_date" => "2019-08-22", "version_added" => "10.0"},
       "webview_android" => %{"release_date" => "2018-07-24", "version_added" => "68"}
     }
   },
   %{
     "arguments" => [],
     "extAttrs" => [
       %{"arguments" => [], "name" => "NewObject", "rhs" => nil, "type" => "extended-attribute"},
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "DOMMatrix",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "getTransform",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_shadow_offset_y, "shadowOffsetY",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/shadowOffsetY",
     "spec_url" =>
       "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-shadowoffsety-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "LenientFloat",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "double",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "shadowOffsetY",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }}
]
[
  {:op, :restore, "restore", [],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/restore",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-restore-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [],
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "restore",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :fill_text, "fillText",
   [
     {:required, "DOMString", {:text, [], nil}},
     {:required, "double", {:x, [], nil}},
     {:required, "double", {:y, [], nil}},
     {:optional, "double", {:max_width, [], nil}, nil}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/fillText",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-filltext-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2009-06-30", "version_added" => "3.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "DOMString",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "text",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "maxWidth",
         "optional" => true,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"},
       %{"arguments" => [], "name" => "LenientFloat", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "fillText",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :arc, "arc",
   [
     {:required, "double", {:x, [], nil}},
     {:required, "double", {:y, [], nil}},
     {:required, "double", {:radius, [], nil}},
     {:required, "double", {:start_angle, [], nil}},
     {:required, "double", {:end_angle, [], nil}},
     {:optional, "boolean", {:anticlockwise, [], nil}, %{"type" => "boolean", "value" => false}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/arc",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-arc-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2011-12-06", "version_added" => "11.6"},
       "opera_android" => %{"release_date" => "2012-02-25", "version_added" => "12"},
       "safari" => %{"release_date" => "2007-10-26", "version_added" => "3"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "radius",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "startAngle",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "endAngle",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => %{"type" => "boolean", "value" => false},
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "boolean",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "anticlockwise",
         "optional" => true,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"},
       %{"arguments" => [], "name" => "LenientFloat", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "arc",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :rotate, "rotate", [{:required, "double", {:angle, [], nil}}],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/rotate",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-rotate-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "angle",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"},
       %{"arguments" => [], "name" => "LenientFloat", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "rotate",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_image_smoothing_enabled, "imageSmoothingEnabled",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-imagesmoothingenabled-dev",
     "status" => %{"deprecated" => false, "experimental" => true, "standard_track" => true},
     "support" => %{
       "chrome" => [
         %{"release_date" => "2013-10-01", "version_added" => "30"},
         %{
           "prefix" => "webkit",
           "release_date" => "2012-07-31",
           "version_added" => "21",
           "version_removed" => "30"
         }
       ],
       "chrome_android" => [
         %{"release_date" => "2013-10-02", "version_added" => "30"},
         %{
           "prefix" => "webkit",
           "release_date" => "2013-02-27",
           "version_added" => "25",
           "version_removed" => "30"
         }
       ],
       "edge" => [
         %{"release_date" => "2017-04-05", "version_added" => "15"},
         %{
           "prefix" => "ms",
           "release_date" => "2015-07-28",
           "version_added" => "12",
           "version_removed" => "15"
         }
       ],
       "firefox" => [
         %{"release_date" => "2017-01-24", "version_added" => "51"},
         %{
           "prefix" => "moz",
           "release_date" => "2010-01-21",
           "version_added" => "3.6",
           "version_removed" => "51"
         }
       ],
       "firefox_android" => [
         %{"release_date" => "2017-01-24", "version_added" => "51"},
         %{
           "prefix" => "moz",
           "release_date" => "2011-03-29",
           "version_added" => "4",
           "version_removed" => "51"
         }
       ],
       "ie" => %{"prefix" => "ms", "release_date" => "2013-10-17", "version_added" => "11"},
       "opera" => [
         %{"release_date" => "2013-10-08", "version_added" => "17"},
         %{
           "prefix" => "webkit",
           "release_date" => "2013-07-02",
           "version_added" => "15",
           "version_removed" => "17"
         }
       ],
       "opera_android" => [
         %{"release_date" => "2013-11-20", "version_added" => "18"},
         %{
           "prefix" => "webkit",
           "release_date" => "2013-05-21",
           "version_added" => "14",
           "version_removed" => "18"
         }
       ],
       "safari" => %{"release_date" => "2016-03-21", "version_added" => "9.1"},
       "safari_ios" => %{"release_date" => "2016-03-21", "version_added" => "9.3"},
       "samsunginternet_android" => [
         %{"release_date" => "2014-10-17", "version_added" => "2.0"},
         %{
           "prefix" => "webkit",
           "release_date" => "2013-09-25",
           "version_added" => "1.5",
           "version_removed" => "2.0"
         }
       ],
       "webview_android" => %{"release_date" => "2013-12-09", "version_added" => "4.4"}
     }
   },
   %{
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "boolean",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "imageSmoothingEnabled",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :fill, "fill",
   [
     {:required, "Path2D", {:path, [], nil}},
     {:optional, "CanvasWindingRule", {:winding, [], nil},
      %{"type" => "string", "value" => "nonzero"}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/fill",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-fill-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "Path2D",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "path",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => %{"type" => "string", "value" => "nonzero"},
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "CanvasWindingRule",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "winding",
         "optional" => true,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "fill",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_text_align, "textAlign",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/textAlign",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-textalign-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2009-06-30", "version_added" => "3.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "DOMString",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "textAlign",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :set_transform, "setTransform", [{:required, "SVGMatrix", {:matrix, [], nil}}],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/setTransform",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-settransform-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2008-06-17", "version_added" => "3"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "SVGMatrix",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "matrix",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "setTransform",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :line_to, "lineTo",
   [{:required, "double", {:x, [], nil}}, {:required, "double", {:y, [], nil}}],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/lineTo",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-lineto-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2011-12-06", "version_added" => "11.6"},
       "opera_android" => %{"release_date" => "2012-02-25", "version_added" => "12"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "LenientFloat", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "lineTo",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :begin_path, "beginPath", [],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/beginPath",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-beginpath-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [],
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "beginPath",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_shadow_offset_x, "shadowOffsetX",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/shadowOffsetX",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-shadowoffsetx-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [
       %{"arguments" => [], "name" => "LenientFloat", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "double",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "shadowOffsetX",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:setter, :set_font, "font",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/font",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-font-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2009-06-30", "version_added" => "3.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "extAttrs" => [
       %{"arguments" => [], "name" => "SetterThrows", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "DOMString",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "font",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:setter, :set_line_width, "lineWidth",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/lineWidth",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linewidth-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [
       %{"arguments" => [], "name" => "LenientFloat", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "double",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "lineWidth",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:setter, :set_miter_limit, "miterLimit",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/miterLimit",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-miterlimit-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [
       %{"arguments" => [], "name" => "LenientFloat", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "double",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "miterLimit",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:setter, :set_global_composite_operation, "globalCompositeOperation",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-globalcompositeoperation-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2006-06-20", "version_added" => "9"},
       "opera_android" => %{"release_date" => "2010-11-09", "version_added" => "10.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "DOMString",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "globalCompositeOperation",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:setter, :set_global_alpha, "globalAlpha",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/globalAlpha",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-globalalpha-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "unrestricted double",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "globalAlpha",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :fill_rect, "fillRect",
   [
     {:required, "double", {:x, [], nil}},
     {:required, "double", {:y, [], nil}},
     {:required, "double", {:w, [], nil}},
     {:required, "double", {:h, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/fillRect",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-fillrect-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2006-06-20", "version_added" => "9"},
       "opera_android" => %{"release_date" => "2010-11-09", "version_added" => "10.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "w",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "h",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "LenientFloat", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "fillRect",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_line_join, "lineJoin",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linejoin-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "extAttrs" => [
       %{"arguments" => [], "name" => "GetterThrows", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "DOMString",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "lineJoin",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :put_image_data, "putImageData",
   [
     {:required, "ImageData", {:imagedata, [], nil}},
     {:required, "double", {:dx, [], nil}},
     {:required, "double", {:dy, [], nil}},
     {:required, "double", {:dirty_x, [], nil}},
     {:required, "double", {:dirty_y, [], nil}},
     {:required, "double", {:dirty_width, [], nil}},
     {:required, "double", {:dirty_height, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/putImageData",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-putimagedata-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2006-10-24", "version_added" => "2"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "ImageData",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "imagedata",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "dx",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "dy",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "dirtyX",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "dirtyY",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "dirtyWidth",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "dirtyHeight",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "putImageData",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :clip, "clip",
   [
     {:required, "Path2D", {:path, [], nil}},
     {:optional, "CanvasWindingRule", {:winding, [], nil},
      %{"type" => "string", "value" => "nonzero"}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/clip",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-clip-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "Path2D",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "path",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => %{"type" => "string", "value" => "nonzero"},
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "CanvasWindingRule",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "winding",
         "optional" => true,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "clip",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :get_line_dash, "getLineDash", [],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/getLineDash",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-getlinedash-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2012-11-06", "version_added" => "23"},
       "chrome_android" => %{"release_date" => "2013-02-27", "version_added" => "25"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2014-02-04", "version_added" => "27"},
       "firefox_android" => %{"release_date" => "2014-02-04", "version_added" => "27"},
       "ie" => %{"release_date" => "2013-10-17", "version_added" => "11"},
       "opera" => %{"release_date" => "2013-07-02", "version_added" => "15"},
       "opera_android" => %{"release_date" => "2013-05-21", "version_added" => "14"},
       "safari" => %{"release_date" => "2013-10-22", "version_added" => "7"},
       "safari_ios" => %{"release_date" => "2013-09-18", "version_added" => "7"},
       "samsunginternet_android" => %{"release_date" => "2013-09-25", "version_added" => "1.5"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "arguments" => [],
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "sequence",
       "idlType" => [
         %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "return-type",
           "union" => false
         }
       ],
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "getLineDash",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :bezier_curve_to, "bezierCurveTo",
   [
     {:required, "double", {:cp1x, [], nil}},
     {:required, "double", {:cp1y, [], nil}},
     {:required, "double", {:cp2x, [], nil}},
     {:required, "double", {:cp2y, [], nil}},
     {:required, "double", {:x, [], nil}},
     {:required, "double", {:y, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/bezierCurveTo",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-beziercurveto-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2011-12-06", "version_added" => "11.6"},
       "opera_android" => %{"release_date" => "2012-02-25", "version_added" => "12"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "cp1x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "cp1y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "cp2x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "cp2y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "LenientFloat", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "bezierCurveTo",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_text_baseline, "textBaseline",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/textBaseline",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-textbaseline-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2009-06-30", "version_added" => "3.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "DOMString",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "textBaseline",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :is_point_in_path, "isPointInPath",
   [
     {:required, "Path2D", {:path, [], nil}},
     {:required, "unrestricted double", {:x, [], nil}},
     {:required, "unrestricted double", {:y, [], nil}},
     {:optional, "CanvasWindingRule", {:winding, [], nil},
      %{"type" => "string", "value" => "nonzero"}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/isPointInPath",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-ispointinpath-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2006-10-24", "version_added" => "2"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2008-03-18", "version_added" => "3.1"},
       "safari_ios" => %{"release_date" => "2008-07-11", "version_added" => "2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "Path2D",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "path",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "unrestricted double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "unrestricted double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => %{"type" => "string", "value" => "nonzero"},
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "CanvasWindingRule",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "winding",
         "optional" => true,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "NeedsSubjectPrincipal",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "boolean",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "isPointInPath",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :stroke_rect, "strokeRect",
   [
     {:required, "double", {:x, [], nil}},
     {:required, "double", {:y, [], nil}},
     {:required, "double", {:w, [], nil}},
     {:required, "double", {:h, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/strokeRect",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-strokerect-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "w",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "h",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "LenientFloat", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "strokeRect",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :stroke_text, "strokeText",
   [
     {:required, "DOMString", {:text, [], nil}},
     {:required, "double", {:x, [], nil}},
     {:required, "double", {:y, [], nil}},
     {:optional, "double", {:max_width, [], nil}, nil}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/strokeText",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-stroketext-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2009-06-30", "version_added" => "3.5"},
       "firefox_android" => %{"version_added" => true},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "DOMString",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "text",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "maxWidth",
         "optional" => true,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"},
       %{"arguments" => [], "name" => "LenientFloat", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "strokeText",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :create_pattern, "createPattern",
   [
     {:required, "CanvasImageSource", {:image, [], nil}},
     {:required, "DOMString", {:repetition, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/createPattern",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-createpattern-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", "version_added" => "1"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"release_date" => "2008-09-23", "version_added" => "1"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "CanvasImageSource",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "image",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [
           %{
             "arguments" => [],
             "name" => "TreatNullAs",
             "rhs" => %{"type" => "identifier", "value" => "EmptyString"},
             "type" => "extended-attribute"
           }
         ],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "DOMString",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "repetition",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "NewObject", "rhs" => nil, "type" => "extended-attribute"},
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "CanvasPattern",
       "nullable" => true,
       "type" => "return-type",
       "union" => false
     },
     "name" => "createPattern",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :measure_text, "measureText", [{:required, "DOMString", {:text, [], nil}}],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/measureText",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-measuretext-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2006-10-24", "version_added" => "2"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{"release_date" => "2009-06-08", "version_added" => "4"},
       "safari_ios" => %{"release_date" => "2010-04-03", "version_added" => "3.2"},
       "samsunginternet_android" => %{"release_date" => "2013-04-27", "version_added" => "1.0"},
       "webview_android" => %{"version_added" => "≤37"}
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "DOMString",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "text",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "NewObject", "rhs" => nil, "type" => "extended-attribute"},
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "TextMetrics",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "measureText",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_filter, "filter",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/filter",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-filter-dev",
     "status" => %{"deprecated" => false, "experimental" => true, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2016-07-20", "version_added" => "52"},
       "chrome_android" => %{"release_date" => "2016-07-27", "version_added" => "52"},
       "edge" => %{"release_date" => "2020-01-15", "version_added" => "79"},
       "firefox" => %{"release_date" => "2016-09-20", "version_added" => "49"},
       "firefox_android" => %{"release_date" => "2016-09-20", "version_added" => "49"},
       "ie" => %{"version_added" => false},
       "opera" => %{"release_date" => "2016-08-02", "version_added" => "39"},
       "opera_android" => %{"release_date" => "2016-10-25", "version_added" => "41"},
       "safari" => %{"version_added" => false},
       "safari_ios" => %{"version_added" => false},
       "samsunginternet_android" => %{"release_date" => "2017-08-23", "version_added" => "6.0"},
       "webview_android" => %{"release_date" => "2016-07-27", ...}
     }
   },
   %{
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "Pref",
         "rhs" => %{"type" => "string", "value" => "canvas.filters.enabled"},
         "type" => "extended-attribute"
       },
       %{"arguments" => [], "name" => "SetterThrows", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "DOMString",
       "nullable" => false,
       "type" => "attribute-type",
       "union" => false
     },
     "name" => "filter",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :draw_image, "drawImage",
   [
     {:required, "CanvasImageSource", {:image, [], nil}},
     {:required, "double", {:sx, [], nil}},
     {:required, "double", {:sy, [], nil}},
     {:required, "double", {:sw, [], nil}},
     {:required, "double", {:sh, [], nil}},
     {:required, "double", {:dx, [], nil}},
     {:required, "double", {:dy, [], nil}},
     {:required, "double", {:dw, [], nil}},
     {:required, "double", {:dh, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-drawimage-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"release_date" => "2006-06-20", "version_added" => "9"},
       "opera_android" => %{"release_date" => "2010-11-09", "version_added" => "10.1"},
       "safari" => %{"release_date" => "2005-04-29", "version_added" => "2"},
       "safari_ios" => %{"release_date" => "2007-06-29", ...},
       "samsunginternet_android" => %{...},
       ...
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "CanvasImageSource",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "image",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "sx",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "sy",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "sw",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           ...
         },
         "name" => "sh",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           ...
         },
         "name" => "dx",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{"extAttrs" => [], "generic" => "", "idlType" => "double", ...},
         "name" => "dy",
         "optional" => false,
         "type" => "argument",
         ...
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{"extAttrs" => [], "generic" => "", ...},
         "name" => "dw",
         "optional" => false,
         ...
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{"extAttrs" => [], ...},
         "name" => "dh",
         ...
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"},
       %{"arguments" => [], "name" => "LenientFloat", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "drawImage",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :is_point_in_stroke, "isPointInStroke",
   [
     {:required, "Path2D", {:path, [], nil}},
     {:required, "unrestricted double", {:x, [], nil}},
     {:required, "unrestricted double", {:y, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/isPointInStroke",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-ispointinstroke-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2013-03-26", "version_added" => "26"},
       "chrome_android" => %{"release_date" => "2013-04-03", "version_added" => "26"},
       "edge" => %{"release_date" => "2020-01-15", "version_added" => "79"},
       "firefox" => [
         %{"release_date" => "2013-04-02", "version_added" => "20"},
         %{
           "prefix" => "moz",
           "release_date" => "2013-02-19",
           "version_added" => "19",
           "version_removed" => "20"
         }
       ],
       "firefox_android" => [
         %{"release_date" => "2013-04-02", "version_added" => "20"},
         %{"prefix" => "moz", "release_date" => "2013-02-19", "version_added" => "19", ...}
       ],
       "ie" => %{"version_added" => false},
       "opera" => %{"release_date" => "2013-07-02", "version_added" => "15"},
       "opera_android" => %{"release_date" => "2013-05-21", "version_added" => "14"},
       "safari" => %{"release_date" => "2013-10-22", ...},
       "safari_ios" => %{...},
       ...
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "Path2D",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "path",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "unrestricted double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "unrestricted double",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{
         "arguments" => [],
         "name" => "NeedsSubjectPrincipal",
         "rhs" => nil,
         "type" => "extended-attribute"
       }
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "boolean",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "isPointInStroke",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :save, "save", [],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/save",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-save-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{"version_added" => "≤12.1"},
       "safari" => %{...},
       ...
     }
   },
   %{
     "arguments" => [],
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "save",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :stroke, "stroke", [{:required, "Path2D", {:path, [], nil}}],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/stroke",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-stroke-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", "version_added" => "9"},
       "opera" => %{"version_added" => "≤12.1"},
       "opera_android" => %{...},
       ...
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "Path2D",
           "nullable" => false,
           "type" => "argument-type",
           "union" => false
         },
         "name" => "path",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "stroke",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :move_to, "moveTo",
   [{:required, "double", {:x, [], nil}}, {:required, "double", {:y, [], nil}}],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/moveTo",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-moveto-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", "version_added" => "4"},
       "ie" => %{"release_date" => "2011-03-14", ...},
       "opera" => %{...},
       ...
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           "type" => "argument-type",
           ...
         },
         "name" => "x",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           ...
         },
         "name" => "y",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       }
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "LenientFloat", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "moveTo",
     "special" => "",
     "type" => "operation"
   }},
  {:op, :create_radial_gradient, "createRadialGradient",
   [
     {:required, "double", {:x0, [], nil}},
     {:required, "double", {:y0, [], nil}},
     {:required, "double", {:r0, [], nil}},
     {:required, "double", {:x1, [], nil}},
     {:required, "double", {:y1, [], nil}},
     {:required, "double", {:r1, [], ...}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/createRadialGradient",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-createradialgradient-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", ...},
       "ie" => %{...},
       ...
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{
           "extAttrs" => [],
           "generic" => "",
           "idlType" => "double",
           "nullable" => false,
           ...
         },
         "name" => "x0",
         "optional" => false,
         "type" => "argument",
         "variadic" => false
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{"extAttrs" => [], "generic" => "", "idlType" => "double", ...},
         "name" => "y0",
         "optional" => false,
         "type" => "argument",
         ...
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{"extAttrs" => [], "generic" => "", ...},
         "name" => "r0",
         "optional" => false,
         ...
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{"extAttrs" => [], ...},
         "name" => "x1",
         ...
       },
       %{"default" => nil, "extAttrs" => [], "idlType" => %{...}, ...},
       %{"default" => nil, "extAttrs" => [], ...}
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "NewObject", "rhs" => nil, "type" => "extended-attribute"},
       %{"arguments" => [], "name" => "Throws", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "CanvasGradient",
       "nullable" => false,
       "type" => "return-type",
       "union" => false
     },
     "name" => "createRadialGradient",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_fill_style, "fillStyle",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/fillStyle",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-fillstyle-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", "version_added" => "12"},
       "firefox" => %{"release_date" => "2005-11-29", "version_added" => "1.5"},
       "firefox_android" => %{"release_date" => "2011-03-29", ...},
       "ie" => %{...},
       ...
     }
   },
   %{
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => [
         %{"extAttrs" => [], "generic" => "", "idlType" => "DOMString", ...},
         %{"extAttrs" => [], "generic" => "", ...},
         %{"extAttrs" => [], ...}
       ],
       "nullable" => false,
       "type" => "attribute-type",
       "union" => true
     },
     "name" => "fillStyle",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :clear_rect, "clearRect",
   [
     {:required, "double", {:x, [], nil}},
     {:required, "double", {:y, [], nil}},
     {:required, "double", {:w, [], nil}},
     {:required, "double", {:h, [], ...}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/clearRect",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-clearrect-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", ...},
       "firefox" => %{...},
       ...
     }
   },
   %{
     "arguments" => [
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{"extAttrs" => [], "generic" => "", ...},
         "name" => "x",
         "optional" => false,
         ...
       },
       %{
         "default" => nil,
         "extAttrs" => [],
         "idlType" => %{"extAttrs" => [], ...},
         "name" => "y",
         ...
       },
       %{"default" => nil, "extAttrs" => [], "idlType" => %{...}, ...},
       %{"default" => nil, "extAttrs" => [], ...}
     ],
     "extAttrs" => [
       %{"arguments" => [], "name" => "LenientFloat", "rhs" => nil, "type" => "extended-attribute"}
     ],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => "undefined",
       "nullable" => false,
       ...
     },
     "name" => "clearRect",
     "special" => "",
     "type" => "operation"
   }},
  {:setter, :set_stroke_style, "strokeStyle",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/strokeStyle",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-strokestyle-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2008-12-11", "version_added" => "1"},
       "chrome_android" => %{"release_date" => "2012-06-27", "version_added" => "18"},
       "edge" => %{"release_date" => "2015-07-28", ...},
       "firefox" => %{...},
       ...
     }
   },
   %{
     "extAttrs" => [],
     "idlType" => %{
       "extAttrs" => [],
       "generic" => "",
       "idlType" => [%{"extAttrs" => [], ...}, %{...}, ...],
       "nullable" => false,
       "type" => "attribute-type",
       ...
     },
     "name" => "strokeStyle",
     "readonly" => false,
     "special" => "",
     "type" => "attribute"
   }},
  {:op, :set_line_dash, "setLineDash",
   [
     {:required, [%{"extAttrs" => [], "generic" => "", "idlType" => "double", ...}],
      {:segments, [], nil}}
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-setlinedash-dev",
     "status" => %{"deprecated" => false, "experimental" => false, "standard_track" => true},
     "support" => %{
       "chrome" => %{"release_date" => "2012-11-06", ...},
       "chrome_android" => %{...},
       ...
     }
   },
   %{
     "arguments" => [%{"default" => nil, "extAttrs" => [], "idlType" => %{...}, ...}],
     "extAttrs" => [%{"arguments" => [], "name" => "LenientFloat", ...}, %{"arguments" => [], ...}],
     "idlType" => %{"extAttrs" => [], "generic" => "", ...},
     "name" => "setLineDash",
     "special" => "",
     ...
   }},
  {:op, :reset_transform, "resetTransform", [],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/resetTransform",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-resettransform-dev",
     "status" => %{"deprecated" => false, "experimental" => true, ...},
     "support" => %{"chrome" => %{...}, ...}
   },
   %{
     "arguments" => [],
     "extAttrs" => [%{"arguments" => [], ...}],
     "idlType" => %{"extAttrs" => [], ...},
     "name" => "resetTransform",
     ...
   }},
  {:op, :ellipse, "ellipse",
   [
     {:required, "double", {:x, ...}},
     {:required, "double", {...}},
     {:required, "double", ...},
     {:required, ...},
     {...},
     ...
   ],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/ellipse",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-ellipse-dev",
     "status" => %{"deprecated" => false, ...},
     "support" => %{...}
   },
   %{
     "arguments" => [%{"default" => nil, ...}, %{...}, ...],
     "extAttrs" => [%{...}, ...],
     "idlType" => %{...},
     ...
   }},
  {:setter, :set_shadow_color, "shadowColor",
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/shadowColor",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-shadowcolor-dev",
     "status" => %{"deprecated" => false, ...},
     "support" => %{...}
   }, %{"extAttrs" => [], "idlType" => %{"extAttrs" => [], ...}, "name" => "shadowColor", ...}},
  {:op, :transform, "transform", [{:required, "double", ...}, {:required, ...}, {...}, ...],
   %{
     "mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/transform",
     "spec_url" => "https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-transform-dev",
     ...
   }, %{"arguments" => [...], ...}},
  {:op, :create_image_data, "createImageData", [{:required, ...}],
   %{"mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/createImageData", ...}, %{...}},
  {:setter, :set_line_cap, "lineCap",
   %{"mdn_url" => "/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap", ...}, %{...}},
  {:op, :draw_focus_if_needed, "drawFocusIfNeeded", [...], ...},
  {:setter, :set_shadow_blur, "shadowBlur", ...},
  {:setter, :set_line_dash_offset, ...},
  {:op, ...},
  {...},
  ...
]

Section

defmodule Canvas do
  @moduledoc """
  This module represents a [CanvasRenderingContext2D](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D)

  All functons are snake cased and setable attributes are `set_attribute_name` functions with one argument
  """
  defstruct [:ops, :width, :height]

  def new(opts \\ []) do
    %__MODULE__{
      ops: [],
      width: Keyword.get(opts, :width, 300),
      height: Keyword.get(opts, :height, 300)
    }
  end

  def set(ctx, key, val) do
    push_op(ctx, ["set", [key, val]])
  end

  def call(ctx, op, arguments) do
    push_op(ctx, [op, arguments])
  end

  def render(ctx) do
    {:canvas_static, Enum.reverse(ctx.ops), ctx.width, ctx.height}
    |> Kino.Bridge.put_output()
  end

  defp push_op(ctx, op) do
    Map.update!(ctx, :ops, fn old -> [op | old] end)
  end

  for op <- canvas_ops do
    case op do
      {:op, fun_atom, func, arguments, _stuff, _i} ->
        def_map =
          arguments
          |> Enum.map(fn
            {:required, _, name} -> name
            {:optional, _, name, nil} -> {:\\, [], [name, Macro.escape(:unset)]}
            {:optional, _, name, %{"value" => value}} -> {:\\, [], [name, Macro.escape(value)]}
          end)
          |> Enum.reject(&is_nil/1)

        arg_map =
          arguments
          |> Enum.map(fn
            {:required, _, name} -> name
            {:optional, _, name, _} -> name
          end)

        def unquote(fun_atom)(ctx, unquote_splicing(def_map)) do
          push_op(ctx, [unquote(func), unquote(arg_map)])
        end

      {:setter, attr_atom, func, _stuff, _i} ->
        def unquote(attr_atom)(ctx, args) do
          set(ctx, unquote(func), args)
        end
    end
  end
end
{:module, Canvas, <<70, 79, 82, 49, 0, 0, 60, ...>>,
 [restore: 1, fill_text: 5, arc: 7, rotate: 2, set_image_smoothing_enabled: 2, fill: 3, ...]}

Example Usage

Canvas.new()
|> Canvas.restore()
|> Canvas.set_line_width(10)
|> Canvas.stroke_rect(100, 100, 100, 100)
|> Canvas.set_font("bold 20px monospace")
|> Canvas.fill_text("Hello World", 70, 70)
|> Canvas.render()
:ok
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment