diff --git a/src/browser/actions.zig b/src/browser/actions.zig index c79a4d6dc..7bbe3371f 100644 --- a/src/browser/actions.zig +++ b/src/browser/actions.zig @@ -143,16 +143,12 @@ pub fn press(node: ?*DOMNode, key: []const u8, frame: *Frame) !void { .key = canonical, }, frame); - // Keep the event alive past dispatch so we can read defaultPrevented. - keydown_event.asEvent().acquireRef(); - defer _ = keydown_event.asEvent().releaseRef(frame._page); - - frame._event_manager.dispatch(target, keydown_event.asEvent()) catch |err| { + const prevented = frame._event_manager.dispatchCancelable(target, keydown_event.asEvent()) catch |err| { lp.log.err(.app, "press keydown failed", .{ .err = err }); return error.ActionFailed; }; - if (std.mem.eql(u8, canonical, "Enter") and !keydown_event.asEvent().getDefaultPrevented()) { + if (std.mem.eql(u8, canonical, "Enter") and !prevented) { if (target_el) |el| implicitFormSubmit(el, frame) catch |err| { // Don't skip keyup on a submit-listener throw — UIs that gate // state on keyup (e.g. clearing a "submitting" flag) would hang. diff --git a/src/browser/frame/user_input.zig b/src/browser/frame/user_input.zig index a0f791db2..6364fc9da 100644 --- a/src/browser/frame/user_input.zig +++ b/src/browser/frame/user_input.zig @@ -295,12 +295,7 @@ pub fn triggerMouseWheel(frame: *Frame, x: f64, y: f64, delta_x: f64, delta_y: f .deltaY = delta_y, }, frame); - // Keep the event alive past dispatch so we can read _prevent_default. - wheel_event.asEvent().acquireRef(); - defer _ = wheel_event.asEvent().releaseRef(frame._page); - try frame._event_manager.dispatch(target.asEventTarget(), wheel_event.asEvent()); - - if (wheel_event.asEvent()._prevent_default) { + if (try frame._event_manager.dispatchCancelable(target.asEventTarget(), wheel_event.asEvent())) { return; } @@ -320,9 +315,8 @@ fn deltaToScroll(d: f64) i32 { return @trunc(std.math.clamp(d, std.math.minInt(i32), std.math.maxInt(i32))); } -// callback when the "click" event reaches the frame. -// Whether the element has a click activation behavior that handleClick -// implements. +/// Whether the element has a click activation behavior that handleClick +/// implements. fn hasClickActivationBehavior(node: *Node) bool { const element = node.is(Element) orelse return false; @@ -353,7 +347,7 @@ fn isNativelyFocusable(el: *Element) bool { return switch (el.getTag()) { .button, .select, .textarea, .iframe => true, .input => el.as(Element.Html.Input)._input_type != .hidden, - .anchor, .area => el.getAttributeSafe(comptime .wrap("href")) != null, + .anchor, .area => el.getAttributeInterned("href") != null, else => false, }; } @@ -368,8 +362,6 @@ fn isEditingHost(node: *Node) bool { return std.ascii.eqlIgnoreCase(value, "false") == false; } -/// Find the outermost element of the contiguous editable chain containing the -/// target. fn outermostEditingHost(target: *Element) ?*Element { var node: ?*Node = target.asNode(); var editable: ?*Node = null; @@ -394,7 +386,7 @@ fn outermostEditingHost(target: *Element) ?*Element { fn isMouseFocusable(el: *Element) bool { if (el.isDisabled()) return false; - if (el.getAttributeSafe(comptime .wrap("tabindex"))) |attr| { + if (el.getAttributeInterned("tabindex")) |attr| { if (Element.Html.parseInteger(attr) != null) return true; } return isNativelyFocusable(el); @@ -815,12 +807,7 @@ fn dispatchKeypress(frame: *Frame, target: *Node, keydown: *KeyboardEvent) !bool .metaKey = keydown.getMetaKey(), }, frame)).asEvent(); - // Keep the event alive past dispatch so we can read _prevent_default. - event.acquireRef(); - defer _ = event.releaseRef(frame._page); - - try frame._event_manager.dispatch(target.asEventTarget(), event); - return event._prevent_default; + return frame._event_manager.dispatchCancelable(target.asEventTarget(), event); } // keydown+enter or keyup+space trigger this syntthetic pointer event (under diff --git a/src/script/Runtime.zig b/src/script/Runtime.zig index 31aa95c97..5410bb132 100644 --- a/src/script/Runtime.zig +++ b/src/script/Runtime.zig @@ -1490,8 +1490,7 @@ test "agent script runtime: mousedown focus follows mouse-focusability rules" { \\expectActive("inp", "setup failed"); \\page.click("#toolbarBtn"); \\expectActive("inp", "preventDefault on mousedown did not protect focus"); - \\// Verified against Chrome: a click inside a contenteditable focuses the - \\// host, and a nested host resolves to the outer one. + \\// Verified against Chrome. \\page.click("#dynHostSpan"); \\expectActive("dynHost", "span inside contenteditable did not focus host"); \\page.click("#dynInnerSpan");