From c4176a282fac76fcb474d864656a81ef13b75b4e Mon Sep 17 00:00:00 2001 From: sjhddh Date: Sat, 14 Mar 2026 06:50:26 +0000 Subject: [PATCH] fix: resolve memory leak in Option.getText() by using page arena --- src/SemanticTree.zig | 4 ++-- src/browser/webapi/element/html/Option.zig | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/SemanticTree.zig b/src/SemanticTree.zig index 8f5eb755..3433ca6b 100644 --- a/src/SemanticTree.zig +++ b/src/SemanticTree.zig @@ -231,7 +231,7 @@ fn extractSelectOptions(node: *Node, page: *Page, arena: std.mem.Allocator) ![]O if (child.is(Element)) |el| { if (el.getTag() == .option) { if (el.is(Element.Html.Option)) |opt| { - const text = opt.getText(); + const text = opt.getText(page); const value = opt.getValue(page); const selected = opt.getSelected(); try options.append(arena, .{ .text = text, .value = value, .selected = selected }); @@ -240,7 +240,7 @@ fn extractSelectOptions(node: *Node, page: *Page, arena: std.mem.Allocator) ![]O var group_it = child.childrenIterator(); while (group_it.next()) |group_child| { if (group_child.is(Element.Html.Option)) |opt| { - const text = opt.getText(); + const text = opt.getText(page); const value = opt.getValue(page); const selected = opt.getSelected(); try options.append(arena, .{ .text = text, .value = value, .selected = selected }); diff --git a/src/browser/webapi/element/html/Option.zig b/src/browser/webapi/element/html/Option.zig index c93e6820..5a275970 100644 --- a/src/browser/webapi/element/html/Option.zig +++ b/src/browser/webapi/element/html/Option.zig @@ -61,10 +61,9 @@ pub fn setValue(self: *Option, value: []const u8, page: *Page) !void { self._value = owned; } -pub fn getText(self: *const Option) []const u8 { +pub fn getText(self: *const Option, page: *Page) []const u8 { const node: *Node = @constCast(self.asConstElement().asConstNode()); - const allocator = std.heap.page_allocator; // TODO: use proper allocator - return node.getTextContentAlloc(allocator) catch ""; + return node.getTextContentAlloc(page.call_arena) catch ""; } pub fn setText(self: *Option, value: []const u8, page: *Page) !void {