Merge pull request #1049 from lightpanda-io/netsurf_event_errors
Some checks failed
e2e-test / zig build release (push) Has been cancelled
e2e-test / demo-scripts (push) Has been cancelled
e2e-test / cdp-and-hyperfine-bench (push) Has been cancelled
e2e-test / perf-fmt (push) Has been cancelled
zig-test / zig build dev (push) Has been cancelled
zig-test / browser fetch (push) Has been cancelled
zig-test / zig test (push) Has been cancelled
zig-test / perf-fmt (push) Has been cancelled
nightly build / build-linux-x86_64 (push) Has been cancelled
nightly build / build-linux-aarch64 (push) Has been cancelled
nightly build / build-macos-aarch64 (push) Has been cancelled
nightly build / build-macos-x86_64 (push) Has been cancelled
wpt / web platform tests json output (push) Has been cancelled
wpt / perf-fmt (push) Has been cancelled

Remove unnecessary error handling from non-erroring netsurf event fun…
This commit is contained in:
Karl Seguin
2025-09-15 21:55:18 +08:00
committed by GitHub
12 changed files with 69 additions and 76 deletions

View File

@@ -649,10 +649,7 @@ const Script = struct {
defer parser.eventDestroy(loadevt); defer parser.eventDestroy(loadevt);
var result: Env.Function.Result = undefined; var result: Env.Function.Result = undefined;
const iface = Event.toInterface(loadevt) catch |err| { const iface = Event.toInterface(loadevt);
log.err(.browser, "SM event interface", .{ .err = err });
return;
};
f.tryCall(void, .{iface}, &result) catch { f.tryCall(void, .{iface}, &result) catch {
log.warn(.user_script, "script callback", .{ log.warn(.user_script, "script callback", .{
.url = self.url, .url = self.url,

View File

@@ -252,7 +252,7 @@ pub const MessageEvent = struct {
const event = try parser.eventCreate(); const event = try parser.eventCreate();
defer parser.eventDestroy(event); defer parser.eventDestroy(event);
try parser.eventInit(event, "message", .{}); try parser.eventInit(event, "message", .{});
try parser.eventSetInternalType(event, .message_event); parser.eventSetInternalType(event, .message_event);
return .{ return .{
.proto = event.*, .proto = event.*,

View File

@@ -278,7 +278,7 @@ const Observer = struct {
var mutation_observer = self.mutation_observer; var mutation_observer = self.mutation_observer;
const node = blk: { const node = blk: {
const event_target = try parser.eventTarget(event) orelse return; const event_target = parser.eventTarget(event) orelse return;
break :blk parser.eventTargetToNode(event_target); break :blk parser.eventTargetToNode(event_target);
}; };

View File

@@ -64,8 +64,8 @@ pub const Event = struct {
pub const _AT_TARGET = 2; pub const _AT_TARGET = 2;
pub const _BUBBLING_PHASE = 3; pub const _BUBBLING_PHASE = 3;
pub fn toInterface(evt: *parser.Event) !Union { pub fn toInterface(evt: *parser.Event) Union {
return switch (try parser.eventGetInternalType(evt)) { return switch (parser.eventGetInternalType(evt)) {
.event, .abort_signal, .xhr_event => .{ .Event = evt }, .event, .abort_signal, .xhr_event => .{ .Event = evt },
.custom_event => .{ .CustomEvent = @as(*CustomEvent, @ptrCast(evt)).* }, .custom_event => .{ .CustomEvent = @as(*CustomEvent, @ptrCast(evt)).* },
.progress_event => .{ .ProgressEvent = @as(*ProgressEvent, @ptrCast(evt)).* }, .progress_event => .{ .ProgressEvent = @as(*ProgressEvent, @ptrCast(evt)).* },
@@ -89,41 +89,41 @@ pub const Event = struct {
} }
pub fn get_target(self: *parser.Event, page: *Page) !?EventTargetUnion { pub fn get_target(self: *parser.Event, page: *Page) !?EventTargetUnion {
const et = try parser.eventTarget(self); const et = parser.eventTarget(self);
if (et == null) return null; if (et == null) return null;
return try EventTarget.toInterface(et.?, page); return try EventTarget.toInterface(et.?, page);
} }
pub fn get_currentTarget(self: *parser.Event, page: *Page) !?EventTargetUnion { pub fn get_currentTarget(self: *parser.Event, page: *Page) !?EventTargetUnion {
const et = try parser.eventCurrentTarget(self); const et = parser.eventCurrentTarget(self);
if (et == null) return null; if (et == null) return null;
return try EventTarget.toInterface(et.?, page); return try EventTarget.toInterface(et.?, page);
} }
pub fn get_eventPhase(self: *parser.Event) !u8 { pub fn get_eventPhase(self: *parser.Event) u8 {
return try parser.eventPhase(self); return parser.eventPhase(self);
} }
pub fn get_bubbles(self: *parser.Event) !bool { pub fn get_bubbles(self: *parser.Event) bool {
return try parser.eventBubbles(self); return parser.eventBubbles(self);
} }
pub fn get_cancelable(self: *parser.Event) !bool { pub fn get_cancelable(self: *parser.Event) bool {
return try parser.eventCancelable(self); return parser.eventCancelable(self);
} }
pub fn get_defaultPrevented(self: *parser.Event) !bool { pub fn get_defaultPrevented(self: *parser.Event) bool {
return try parser.eventDefaultPrevented(self); return parser.eventDefaultPrevented(self);
} }
pub fn get_isTrusted(self: *parser.Event) !bool { pub fn get_isTrusted(self: *parser.Event) bool {
return try parser.eventIsTrusted(self); return parser.eventIsTrusted(self);
} }
// Even though this is supposed to to provide microsecond resolution, browser // Even though this is supposed to to provide microsecond resolution, browser
// return coarser values to protect against fingerprinting. libdom returns // return coarser values to protect against fingerprinting. libdom returns
// seconds, which is good enough. // seconds, which is good enough.
pub fn get_timeStamp(self: *parser.Event) !u64 { pub fn get_timeStamp(self: *parser.Event) u64 {
return parser.eventTimestamp(self); return parser.eventTimestamp(self);
} }
@@ -143,19 +143,19 @@ pub const Event = struct {
} }
pub fn _stopPropagation(self: *parser.Event) !void { pub fn _stopPropagation(self: *parser.Event) !void {
return try parser.eventStopPropagation(self); return parser.eventStopPropagation(self);
} }
pub fn _stopImmediatePropagation(self: *parser.Event) !void { pub fn _stopImmediatePropagation(self: *parser.Event) !void {
return try parser.eventStopImmediatePropagation(self); return parser.eventStopImmediatePropagation(self);
} }
pub fn _preventDefault(self: *parser.Event) !void { pub fn _preventDefault(self: *parser.Event) !void {
return try parser.eventPreventDefault(self); return parser.eventPreventDefault(self);
} }
pub fn _composedPath(self: *parser.Event, page: *Page) ![]const EventTargetUnion { pub fn _composedPath(self: *parser.Event, page: *Page) ![]const EventTargetUnion {
const et_ = try parser.eventTarget(self); const et_ = parser.eventTarget(self);
const et = et_ orelse return &.{}; const et = et_ orelse return &.{};
var node: ?*parser.Node = switch (try parser.eventTargetInternalType(et)) { var node: ?*parser.Node = switch (try parser.eventTargetInternalType(et)) {
@@ -326,11 +326,7 @@ pub const EventHandler = struct {
} }
fn handle(node: *parser.EventNode, event: *parser.Event) void { fn handle(node: *parser.EventNode, event: *parser.Event) void {
const ievent = Event.toInterface(event) catch |err| { const ievent = Event.toInterface(event);
log.err(.app, "toInterface error", .{ .err = err });
return;
};
const self: *EventHandler = @fieldParentPtr("node", node); const self: *EventHandler = @fieldParentPtr("node", node);
var result: Function.Result = undefined; var result: Function.Result = undefined;
self.callback.tryCall(void, .{ievent}, &result) catch { self.callback.tryCall(void, .{ievent}, &result) catch {
@@ -342,7 +338,7 @@ pub const EventHandler = struct {
}; };
if (self.once) { if (self.once) {
const target = (parser.eventTarget(event) catch return).?; const target = parser.eventTarget(event).?;
const typ = parser.eventType(event) catch return; const typ = parser.eventType(event) catch return;
parser.eventTargetRemoveEventListener( parser.eventTargetRemoveEventListener(
target, target,

View File

@@ -20,7 +20,7 @@ const std = @import("std");
const log = @import("../../log.zig"); const log = @import("../../log.zig");
const builtin = @import("builtin"); const builtin = @import("builtin");
const netsurf = @import("../netsurf.zig"); const parser = @import("../netsurf.zig");
const Event = @import("event.zig").Event; const Event = @import("event.zig").Event;
const JsObject = @import("../env.zig").JsObject; const JsObject = @import("../env.zig").JsObject;
@@ -30,13 +30,13 @@ const UIEvent = Event;
// https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
pub const KeyboardEvent = struct { pub const KeyboardEvent = struct {
pub const Self = netsurf.KeyboardEvent; pub const Self = parser.KeyboardEvent;
pub const prototype = *UIEvent; pub const prototype = *UIEvent;
pub const ConstructorOptions = struct { pub const ConstructorOptions = struct {
key: []const u8 = "", key: []const u8 = "",
code: []const u8 = "", code: []const u8 = "",
location: netsurf.KeyboardEventOpts.LocationCode = .standard, location: parser.KeyboardEventOpts.LocationCode = .standard,
repeat: bool = false, repeat: bool = false,
isComposing: bool = false, isComposing: bool = false,
// Currently not supported but we take as argument. // Currently not supported but we take as argument.
@@ -51,13 +51,13 @@ pub const KeyboardEvent = struct {
metaKey: bool = false, metaKey: bool = false,
}; };
pub fn constructor(event_type: []const u8, maybe_options: ?ConstructorOptions) !*netsurf.KeyboardEvent { pub fn constructor(event_type: []const u8, maybe_options: ?ConstructorOptions) !*parser.KeyboardEvent {
const options: ConstructorOptions = maybe_options orelse .{}; const options: ConstructorOptions = maybe_options orelse .{};
var event = try netsurf.keyboardEventCreate(); var event = try parser.keyboardEventCreate();
try netsurf.eventSetInternalType(@ptrCast(&event), .keyboard_event); parser.eventSetInternalType(@ptrCast(&event), .keyboard_event);
try netsurf.keyboardEventInit( try parser.keyboardEventInit(
event, event,
event_type, event_type,
.{ .{
@@ -122,19 +122,19 @@ pub const KeyboardEvent = struct {
// Getters. // Getters.
pub fn get_altKey(self: *Self) bool { pub fn get_altKey(self: *Self) bool {
return netsurf.keyboardEventKeyIsSet(self, .alt); return parser.keyboardEventKeyIsSet(self, .alt);
} }
pub fn get_ctrlKey(self: *Self) bool { pub fn get_ctrlKey(self: *Self) bool {
return netsurf.keyboardEventKeyIsSet(self, .ctrl); return parser.keyboardEventKeyIsSet(self, .ctrl);
} }
pub fn get_metaKey(self: *Self) bool { pub fn get_metaKey(self: *Self) bool {
return netsurf.keyboardEventKeyIsSet(self, .meta); return parser.keyboardEventKeyIsSet(self, .meta);
} }
pub fn get_shiftKey(self: *Self) bool { pub fn get_shiftKey(self: *Self) bool {
return netsurf.keyboardEventKeyIsSet(self, .shift); return parser.keyboardEventKeyIsSet(self, .shift);
} }
pub fn get_isComposing(self: *Self) bool { pub fn get_isComposing(self: *Self) bool {
@@ -146,7 +146,7 @@ pub const KeyboardEvent = struct {
} }
pub fn get_key(self: *Self) ![]const u8 { pub fn get_key(self: *Self) ![]const u8 {
return netsurf.keyboardEventGetKey(self); return parser.keyboardEventGetKey(self);
} }
pub fn get_repeat(self: *Self) bool { pub fn get_repeat(self: *Self) bool {

View File

@@ -56,7 +56,7 @@ pub const MouseEvent = struct {
const opts = opts_ orelse MouseEventInit{}; const opts = opts_ orelse MouseEventInit{};
var mouse_event = try parser.mouseEventCreate(); var mouse_event = try parser.mouseEventCreate();
try parser.eventSetInternalType(@ptrCast(&mouse_event), .mouse_event); parser.eventSetInternalType(@ptrCast(&mouse_event), .mouse_event);
try parser.mouseEventInit(mouse_event, event_type, .{ try parser.mouseEventInit(mouse_event, event_type, .{
.x = opts.clientX, .x = opts.clientX,

View File

@@ -91,7 +91,7 @@ pub const AbortSignal = struct {
self.reason = reason_ orelse DEFAULT_REASON; self.reason = reason_ orelse DEFAULT_REASON;
const abort_event = try parser.eventCreate(); const abort_event = try parser.eventCreate();
try parser.eventSetInternalType(abort_event, .abort_signal); parser.eventSetInternalType(abort_event, .abort_signal);
defer parser.eventDestroy(abort_event); defer parser.eventDestroy(abort_event);
try parser.eventInit(abort_event, "abort", .{}); try parser.eventInit(abort_event, "abort", .{});

View File

@@ -42,7 +42,7 @@ pub const ErrorEvent = struct {
const event = try parser.eventCreate(); const event = try parser.eventCreate();
defer parser.eventDestroy(event); defer parser.eventDestroy(event);
try parser.eventInit(event, event_type, .{}); try parser.eventInit(event, event_type, .{});
try parser.eventSetInternalType(event, .event); parser.eventSetInternalType(event, .event);
const o = opts orelse ErrorEventInit{}; const o = opts orelse ErrorEventInit{};

View File

@@ -456,87 +456,87 @@ pub fn eventType(evt: *Event) ![]const u8 {
return strToData(s.?); return strToData(s.?);
} }
pub fn eventTarget(evt: *Event) !?*EventTarget { pub fn eventTarget(evt: *Event) ?*EventTarget {
var et: ?*EventTarget = null; var et: ?*EventTarget = null;
const err = c._dom_event_get_target(evt, &et); const err = c._dom_event_get_target(evt, &et);
try DOMErr(err); std.debug.assert(err == c.DOM_NO_ERR);
return et; return et;
} }
pub fn eventCurrentTarget(evt: *Event) !?*EventTarget { pub fn eventCurrentTarget(evt: *Event) ?*EventTarget {
var et: ?*EventTarget = null; var et: ?*EventTarget = null;
const err = c._dom_event_get_current_target(evt, &et); const err = c._dom_event_get_current_target(evt, &et);
try DOMErr(err); std.debug.assert(err == c.DOM_NO_ERR);
return et; return et;
} }
pub fn eventPhase(evt: *Event) !u8 { pub fn eventPhase(evt: *Event) u8 {
var phase: c.dom_event_flow_phase = undefined; var phase: c.dom_event_flow_phase = undefined;
const err = c._dom_event_get_event_phase(evt, &phase); const err = c._dom_event_get_event_phase(evt, &phase);
try DOMErr(err); std.debug.assert(err == c.DOM_NO_ERR);
return @as(u8, @intCast(phase)); return @as(u8, @intCast(phase));
} }
pub fn eventBubbles(evt: *Event) !bool { pub fn eventBubbles(evt: *Event) bool {
var res: bool = undefined; var res: bool = undefined;
const err = c._dom_event_get_bubbles(evt, &res); const err = c._dom_event_get_bubbles(evt, &res);
try DOMErr(err); std.debug.assert(err == c.DOM_NO_ERR);
return res; return res;
} }
pub fn eventCancelable(evt: *Event) !bool { pub fn eventCancelable(evt: *Event) bool {
var res: bool = undefined; var res: bool = undefined;
const err = c._dom_event_get_cancelable(evt, &res); const err = c._dom_event_get_cancelable(evt, &res);
try DOMErr(err); std.debug.assert(err == c.DOM_NO_ERR);
return res; return res;
} }
pub fn eventDefaultPrevented(evt: *Event) !bool { pub fn eventDefaultPrevented(evt: *Event) bool {
var res: bool = undefined; var res: bool = undefined;
const err = c._dom_event_is_default_prevented(evt, &res); const err = c._dom_event_is_default_prevented(evt, &res);
try DOMErr(err); std.debug.assert(err == c.DOM_NO_ERR);
return res; return res;
} }
pub fn eventIsTrusted(evt: *Event) !bool { pub fn eventIsTrusted(evt: *Event) bool {
var res: bool = undefined; var res: bool = undefined;
const err = c._dom_event_get_is_trusted(evt, &res); const err = c._dom_event_get_is_trusted(evt, &res);
try DOMErr(err); std.debug.assert(err == c.DOM_NO_ERR);
return res; return res;
} }
pub fn eventTimestamp(evt: *Event) !u64 { pub fn eventTimestamp(evt: *Event) u64 {
var ts: u64 = 0; var ts: u64 = 0;
const err = c._dom_event_get_timestamp(evt, &ts); const err = c._dom_event_get_timestamp(evt, &ts);
try DOMErr(err); std.debug.assert(err == c.DOM_NO_ERR);
return ts; return ts;
} }
pub fn eventStopPropagation(evt: *Event) !void { pub fn eventStopPropagation(evt: *Event) void {
const err = c._dom_event_stop_propagation(evt); const err = c._dom_event_stop_propagation(evt);
try DOMErr(err); std.debug.assert(err == c.DOM_NO_ERR);
} }
pub fn eventStopImmediatePropagation(evt: *Event) !void { pub fn eventStopImmediatePropagation(evt: *Event) void {
const err = c._dom_event_stop_immediate_propagation(evt); const err = c._dom_event_stop_immediate_propagation(evt);
try DOMErr(err); std.debug.assert(err == c.DOM_NO_ERR);
} }
pub fn eventPreventDefault(evt: *Event) !void { pub fn eventPreventDefault(evt: *Event) void {
const err = c._dom_event_prevent_default(evt); const err = c._dom_event_prevent_default(evt);
try DOMErr(err); std.debug.assert(err == c.DOM_NO_ERR);
} }
pub fn eventGetInternalType(evt: *Event) !EventType { pub fn eventGetInternalType(evt: *Event) EventType {
var res: u32 = undefined; var res: u32 = undefined;
const err = c._dom_event_get_internal_type(evt, &res); const err = c._dom_event_get_internal_type(evt, &res);
try DOMErr(err); std.debug.assert(err == c.DOM_NO_ERR);
return @enumFromInt(res); return @enumFromInt(res);
} }
pub fn eventSetInternalType(evt: *Event, internal_type: EventType) !void { pub fn eventSetInternalType(evt: *Event, internal_type: EventType) void {
const err = c._dom_event_set_internal_type(evt, @intFromEnum(internal_type)); const err = c._dom_event_set_internal_type(evt, @intFromEnum(internal_type));
try DOMErr(err); std.debug.assert(err == c.DOM_NO_ERR);
} }
pub const EventType = enum(u8) { pub const EventType = enum(u8) {

View File

@@ -881,7 +881,7 @@ pub const Page = struct {
} }
fn _windowClicked(self: *Page, event: *parser.Event) !void { fn _windowClicked(self: *Page, event: *parser.Event) !void {
const target = (try parser.eventTarget(event)) orelse return; const target = parser.eventTarget(event) orelse return;
const node = parser.eventTargetToNode(target); const node = parser.eventTargetToNode(target);
const tag = (try parser.nodeHTMLGetTagType(node)) orelse return; const tag = (try parser.nodeHTMLGetTagType(node)) orelse return;
switch (tag) { switch (tag) {
@@ -958,7 +958,7 @@ pub const Page = struct {
} }
fn _keydownCallback(self: *Page, event: *parser.Event) !void { fn _keydownCallback(self: *Page, event: *parser.Event) !void {
const target = (try parser.eventTarget(event)) orelse return; const target = parser.eventTarget(event) orelse return;
const node = parser.eventTargetToNode(target); const node = parser.eventTargetToNode(target);
const tag = (try parser.nodeHTMLGetTagType(node)) orelse return; const tag = (try parser.nodeHTMLGetTagType(node)) orelse return;

View File

@@ -41,7 +41,7 @@ pub const ProgressEvent = struct {
const event = try parser.eventCreate(); const event = try parser.eventCreate();
defer parser.eventDestroy(event); defer parser.eventDestroy(event);
try parser.eventInit(event, event_type, .{}); try parser.eventInit(event, event_type, .{});
try parser.eventSetInternalType(event, .progress_event); parser.eventSetInternalType(event, .progress_event);
const o = opts orelse EventInit{}; const o = opts orelse EventInit{};

View File

@@ -273,7 +273,7 @@ pub const XMLHttpRequest = struct {
// We can we defer event destroy once the event is dispatched. // We can we defer event destroy once the event is dispatched.
defer parser.eventDestroy(evt); defer parser.eventDestroy(evt);
try parser.eventSetInternalType(evt, .xhr_event); parser.eventSetInternalType(evt, .xhr_event);
try parser.eventInit(evt, typ, .{ .bubbles = true, .cancelable = true }); try parser.eventInit(evt, typ, .{ .bubbles = true, .cancelable = true });
_ = try parser.eventTargetDispatchEvent(@as(*parser.EventTarget, @ptrCast(self)), evt); _ = try parser.eventTargetDispatchEvent(@as(*parser.EventTarget, @ptrCast(self)), evt);