initial keyboard event

This commit is contained in:
nikneym
2025-09-10 17:14:34 +03:00
parent 66e403c5b4
commit 3964f8649d
4 changed files with 113 additions and 2 deletions

View File

@@ -33,11 +33,20 @@ const AbortSignal = @import("../html/AbortController.zig").AbortSignal;
const CustomEvent = @import("custom_event.zig").CustomEvent; const CustomEvent = @import("custom_event.zig").CustomEvent;
const ProgressEvent = @import("../xhr/progress_event.zig").ProgressEvent; const ProgressEvent = @import("../xhr/progress_event.zig").ProgressEvent;
const MouseEvent = @import("mouse_event.zig").MouseEvent; const MouseEvent = @import("mouse_event.zig").MouseEvent;
const KeyboardEvent = @import("keyboard_event.zig").KeyboardEvent;
const ErrorEvent = @import("../html/error_event.zig").ErrorEvent; const ErrorEvent = @import("../html/error_event.zig").ErrorEvent;
const MessageEvent = @import("../dom/MessageChannel.zig").MessageEvent; const MessageEvent = @import("../dom/MessageChannel.zig").MessageEvent;
// Event interfaces // Event interfaces
pub const Interfaces = .{ Event, CustomEvent, ProgressEvent, MouseEvent, ErrorEvent, MessageEvent }; pub const Interfaces = .{
Event,
CustomEvent,
ProgressEvent,
MouseEvent,
KeyboardEvent,
ErrorEvent,
MessageEvent,
};
pub const Union = generate.Union(Interfaces); pub const Union = generate.Union(Interfaces);

View File

@@ -0,0 +1,80 @@
const std = @import("std");
const log = @import("../../log.zig");
const netsurf = @import("../netsurf.zig");
const Event = @import("event.zig").Event;
const JsObject = @import("../env.zig").JsObject;
const c = @cImport({
@cInclude("dom/dom.h");
@cInclude("core/pi.h");
@cInclude("dom/bindings/hubbub/parser.h");
@cInclude("events/event_target.h");
@cInclude("events/event.h");
@cInclude("events/mouse_event.h");
@cInclude("events/keyboard_event.h");
@cInclude("utils/validate.h");
@cInclude("html/html_element.h");
@cInclude("html/html_document.h");
});
// TODO: We currently don't have a UIEvent interface so we skip it in the prototype chain.
// https://developer.mozilla.org/en-US/docs/Web/API/UIEvent
const UIEvent = Event;
// https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
pub const KeyboardEvent = struct {
pub const Self = netsurf.KeyboardEvent;
pub const prototype = *UIEvent;
pub const KeyLocationCode = enum(u16) {
standard = 0x00,
left = 0x01,
right = 0x02,
numpad = 0x03,
mobile = 0x04, // Non-standard, deprecated.
joystick = 0x05, // Non-standard, deprecated.
};
pub const ConstructorOptions = struct {
key: []const u8 = "",
code: []const u8 = "",
location: KeyLocationCode = .standard,
char_code: u32 = 0,
key_code: u32 = 0,
which: u32 = 0,
repeat: bool = false,
ctrl_key: bool = false,
shift_key: bool = false,
alt_key: bool = false,
meta_key: bool = false,
is_composing: bool = false,
};
pub fn constructor(event_type: []const u8, maybe_options: ?ConstructorOptions) !*netsurf.KeyboardEvent {
const options = maybe_options orelse ConstructorOptions{};
const event = try netsurf.keyboardEventCreate();
try netsurf.keyboardEventInit(
event,
event_type,
.{
.bubbles = false,
.cancelable = false,
.key = options.key,
.code = options.code,
.alt = options.alt_key,
.ctrl = options.ctrl_key,
.meta = options.meta_key,
.shift = options.shift_key,
},
);
return event;
}
};
const testing = @import("../../testing.zig");
test "Browser: Events.Keyboard" {
try testing.htmlRunner("events/keyboard.html");
}

View File

@@ -388,7 +388,7 @@ pub const DOMError = error{
const DOMException = c.dom_exception; const DOMException = c.dom_exception;
fn DOMErr(except: DOMException) DOMError!void { pub fn DOMErr(except: DOMException) DOMError!void {
return switch (except) { return switch (except) {
c.DOM_NO_ERR => return, c.DOM_NO_ERR => return,
c.DOM_INDEX_SIZE_ERR => DOMError.IndexSize, c.DOM_INDEX_SIZE_ERR => DOMError.IndexSize,

View File

@@ -0,0 +1,22 @@
<script src="../testing.js"></script>
<script id=default>
const button = document.createElement("button");
document.addEventListener("keydown", (event) => {
console.log(event.target);
});
document.addEventListener("DOMContentLoaded", () => {
document.body.appendChild(button);
button.focus();
});
testing.expectEqual(true, true);
</script>
<script id=keyboardEvent>
const keyboardEvent = new KeyboardEvent("a");
console.lp(keyboardEvent.type);
testing.expectEqual(true, true);
</script>