diff --git a/src/browser/tests/canvas/canvas_rendering_context_2d.html b/src/browser/tests/canvas/canvas_rendering_context_2d.html
index 9b1b1806..66a673ad 100644
--- a/src/browser/tests/canvas/canvas_rendering_context_2d.html
+++ b/src/browser/tests/canvas/canvas_rendering_context_2d.html
@@ -148,3 +148,13 @@
}
+
+
diff --git a/src/browser/tests/canvas/webgl_rendering_context.html b/src/browser/tests/canvas/webgl_rendering_context.html
index 24bad4fd..7c0e8637 100644
--- a/src/browser/tests/canvas/webgl_rendering_context.html
+++ b/src/browser/tests/canvas/webgl_rendering_context.html
@@ -85,3 +85,13 @@
loseContext.restoreContext();
}
+
+
diff --git a/src/browser/webapi/element/html/Canvas.zig b/src/browser/webapi/element/html/Canvas.zig
index 13002f66..70da796b 100644
--- a/src/browser/webapi/element/html/Canvas.zig
+++ b/src/browser/webapi/element/html/Canvas.zig
@@ -29,6 +29,9 @@ const OffscreenCanvas = @import("../../canvas/OffscreenCanvas.zig");
const Canvas = @This();
_proto: *HtmlElement,
+_cached: ?DrawingContext = null,
+
+const ContextType = enum { none, @"2d", webgl };
pub fn asElement(self: *Canvas) *Element {
return self._proto._proto;
@@ -68,17 +71,28 @@ const DrawingContext = union(enum) {
};
pub fn getContext(self: *Canvas, context_type: []const u8, page: *Page) !?DrawingContext {
- if (std.mem.eql(u8, context_type, "2d")) {
- const ctx = try page._factory.create(CanvasRenderingContext2D{ ._canvas = self });
- return .{ .@"2d" = ctx };
+ if (self._cached) |cached| {
+ const matches = switch (cached) {
+ .@"2d" => std.mem.eql(u8, context_type, "2d"),
+ .webgl => std.mem.eql(u8, context_type, "webgl") or std.mem.eql(u8, context_type, "experimental-webgl"),
+ };
+ return if (matches) cached else null;
}
- if (std.mem.eql(u8, context_type, "webgl") or std.mem.eql(u8, context_type, "experimental-webgl")) {
- const ctx = try page._factory.create(WebGLRenderingContext{});
- return .{ .webgl = ctx };
- }
+ const drawing_context: DrawingContext = blk: {
+ if (std.mem.eql(u8, context_type, "2d")) {
+ const ctx = try page._factory.create(CanvasRenderingContext2D{ ._canvas = self });
+ break :blk .{ .@"2d" = ctx };
+ }
- return null;
+ if (std.mem.eql(u8, context_type, "webgl") or std.mem.eql(u8, context_type, "experimental-webgl")) {
+ const ctx = try page._factory.create(WebGLRenderingContext{});
+ break :blk .{ .webgl = ctx };
+ }
+ return null;
+ };
+ self._cached = drawing_context;
+ return drawing_context;
}
/// Transfers control of the canvas to an OffscreenCanvas.