From 4841f8cc8f40b75d54393e6e419e31c8517d0c14 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Tue, 13 Jan 2026 12:55:10 +0800 Subject: [PATCH] add trycatch to Intersection and Performance Observers --- src/browser/webapi/Document.zig | 4 ++-- src/browser/webapi/IntersectionObserver.zig | 8 +++++++- src/browser/webapi/PerformanceObserver.zig | 8 +++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/browser/webapi/Document.zig b/src/browser/webapi/Document.zig index 96ce7f03..1782b062 100644 --- a/src/browser/webapi/Document.zig +++ b/src/browser/webapi/Document.zig @@ -934,8 +934,8 @@ pub const JsApi = struct { pub const compatMode = bridge.accessor(Document.getCompatMode, null, .{}); pub const referrer = bridge.accessor(Document.getReferrer, null, .{}); pub const domain = bridge.accessor(Document.getDomain, null, .{}); - pub const createElement = bridge.function(Document.createElement, .{.dom_exception = true}); - pub const createElementNS = bridge.function(Document.createElementNS, .{.dom_exception = true}); + pub const createElement = bridge.function(Document.createElement, .{ .dom_exception = true }); + pub const createElementNS = bridge.function(Document.createElementNS, .{ .dom_exception = true }); pub const createDocumentFragment = bridge.function(Document.createDocumentFragment, .{}); pub const createComment = bridge.function(Document.createComment, .{}); pub const createTextNode = bridge.function(Document.createTextNode, .{}); diff --git a/src/browser/webapi/IntersectionObserver.zig b/src/browser/webapi/IntersectionObserver.zig index 5bc94428..57e86c47 100644 --- a/src/browser/webapi/IntersectionObserver.zig +++ b/src/browser/webapi/IntersectionObserver.zig @@ -17,6 +17,8 @@ // along with this program. If not, see . const std = @import("std"); const js = @import("../js/js.zig"); +const log = @import("../../log.zig"); + const Page = @import("../Page.zig"); const Element = @import("Element.zig"); const DOMRect = @import("DOMRect.zig"); @@ -238,7 +240,11 @@ pub fn deliverEntries(self: *IntersectionObserver, page: *Page) !void { } const entries = try self.takeRecords(page); - try self._callback.call(void, .{ entries, self }); + var result: js.Function.Result = undefined; + self._callback.tryCall(void, .{ entries, self }, &result) catch |err| { + log.err(.page, "IntsctObserver.deliverEntries", .{ .err = result.exception, .stack = result.stack }); + return err; + }; } pub const IntersectionObserverEntry = struct { diff --git a/src/browser/webapi/PerformanceObserver.zig b/src/browser/webapi/PerformanceObserver.zig index 7e4d9c5d..3ca0732f 100644 --- a/src/browser/webapi/PerformanceObserver.zig +++ b/src/browser/webapi/PerformanceObserver.zig @@ -19,6 +19,8 @@ const std = @import("std"); const js = @import("../js/js.zig"); +const log = @import("../../log.zig"); + const Page = @import("../Page.zig"); const Performance = @import("Performance.zig"); @@ -149,7 +151,11 @@ pub inline fn hasRecords(self: *const PerformanceObserver) bool { /// Runs the PerformanceObserver's callback with records; emptying it out. pub fn dispatch(self: *PerformanceObserver, page: *Page) !void { const records = try self.takeRecords(page); - _ = try self._callback.call(void, .{ EntryList{ ._entries = records }, self }); + var result: js.Function.Result = undefined; + self._callback.tryCall(void, .{ EntryList{ ._entries = records }, self }, &result) catch |err| { + log.err(.page, "PerfObserver.dispatch", .{ .err = result.exception, .stack = result.stack }); + return err; + }; } pub const JsApi = struct {