diff --git a/src/browser/tests/element/svg/geometry.html b/src/browser/tests/element/svg/geometry.html
index e3d67b71f..2e57db8d0 100644
--- a/src/browser/tests/element/svg/geometry.html
+++ b/src/browser/tests/element/svg/geometry.html
@@ -210,3 +210,29 @@
testing.expectEqual(true, rootBox.height >= 100);
}
+
+
diff --git a/src/browser/webapi/element/svg/Graphics.zig b/src/browser/webapi/element/svg/Graphics.zig
index e4b4f9d05..d88c7e9d4 100644
--- a/src/browser/webapi/element/svg/Graphics.zig
+++ b/src/browser/webapi/element/svg/Graphics.zig
@@ -25,6 +25,7 @@ const Node = @import("../../Node.zig");
const Element = @import("../../Element.zig");
const Factory = @import("../../../Factory.zig");
const DOMRect = @import("../../DOMRect.zig");
+const DOMMatrix = @import("../../DOMMatrix.zig");
const DOMMatrixReadOnly = @import("../../DOMMatrixReadOnly.zig");
const SvgElement = @import("../Svg.zig");
const AnimatedTransformList = @import("../../svg/AnimatedTransformList.zig");
@@ -128,6 +129,8 @@ pub const JsApi = struct {
pub const requiredExtensions = bridge.accessor(Graphics.getRequiredExtensions, null, .{});
pub const systemLanguage = bridge.accessor(Graphics.getSystemLanguage, null, .{});
pub const getBBox = bridge.function(Graphics.getBBox, .{});
+ pub const getCTM = bridge.function(Graphics.getCTM, .{});
+ pub const getScreenCTM = bridge.function(Graphics.getScreenCTM, .{});
};
// SVGBoundingBoxOptions is not modelled: Chrome declares no parameter at all
@@ -218,6 +221,52 @@ fn accumulateChildren(parent: *Graphics, matrix: PathData.Matrix, bounds: *PathD
}
}
+/// Composes `transform` attributes from the element up to, excluding, its
+/// nearest