diff --git a/src/browser/tests/range.html b/src/browser/tests/range.html
index 2a25e272..d9a8637b 100644
--- a/src/browser/tests/range.html
+++ b/src/browser/tests/range.html
@@ -1023,7 +1023,7 @@
}
-
-
+
+
+
+
diff --git a/src/browser/webapi/Range.zig b/src/browser/webapi/Range.zig
index 6a785cde..f0c904a6 100644
--- a/src/browser/webapi/Range.zig
+++ b/src/browser/webapi/Range.zig
@@ -644,13 +644,31 @@ fn nextAfterSubtree(node: *Node, root: *Node) ?*Node {
return null;
}
-// Headless browser has no layout — return a zero-valued DOMRect.
-pub fn getBoundingClientRect(_: *const Range) DOMRect {
- return .{ ._x = 0, ._y = 0, ._width = 0, ._height = 0 };
+pub fn getBoundingClientRect(self: *const Range, page: *Page) DOMRect {
+ if (self._proto.getCollapsed()) {
+ return .{ ._x = 0, ._y = 0, ._width = 0, ._height = 0 };
+ }
+ const element = self.getContainerElement() orelse {
+ return .{ ._x = 0, ._y = 0, ._width = 0, ._height = 0 };
+ };
+ return element.getBoundingClientRect(page);
}
-pub fn getClientRects(_: *const Range) []DOMRect {
- return &.{};
+pub fn getClientRects(self: *const Range, page: *Page) ![]DOMRect {
+ if (self._proto.getCollapsed()) {
+ return &.{};
+ }
+ const element = self.getContainerElement() orelse {
+ return &.{};
+ };
+ return element.getClientRects(page);
+}
+
+fn getContainerElement(self: *const Range) ?*Node.Element {
+ const container = self._proto.getCommonAncestorContainer();
+ if (container.is(Node.Element)) |el| return el;
+ const parent = container.parentNode() orelse return null;
+ return parent.is(Node.Element);
}
pub const JsApi = struct {