From e239f69f6974594046f4e94728a116be0005a3a5 Mon Sep 17 00:00:00 2001 From: egrs Date: Mon, 9 Mar 2026 10:09:11 +0100 Subject: [PATCH] delegate Range rect methods to container element Instead of always returning zeros, delegate getBoundingClientRect and getClientRects to the common ancestor container element. Return zeros only when the range is collapsed or has no element ancestor. --- src/browser/tests/range.html | 31 +++++++++++++++++++++++++++++-- src/browser/webapi/Range.zig | 28 +++++++++++++++++++++++----- 2 files changed, 52 insertions(+), 7 deletions(-) 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 {