Skip to content

Commit a1aba06

Browse files
WIP UIEvent
Signed-off-by: Francis Bouvier <[email protected]>
1 parent 85a8dec commit a1aba06

File tree

4 files changed

+84
-0
lines changed

4 files changed

+84
-0
lines changed

src/events/event.zig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const parser = @import("../netsurf.zig");
1212
const DOMException = @import("../dom/exceptions.zig").DOMException;
1313
const EventTarget = @import("../dom/event_target.zig").EventTarget;
1414
const EventTargetUnion = @import("../dom/event_target.zig").Union;
15+
const UIEvent = @import("event_ui.zig").UIEvent;
1516

1617
// https://dom.spec.whatwg.org/#event
1718
pub const Event = struct {
@@ -107,6 +108,7 @@ pub const Event = struct {
107108
// Event interfaces
108109
pub const Interfaces = generate.Tuple(.{
109110
Event,
111+
UIEvent,
110112
});
111113
const Generated = generate.Union.compile(Interfaces);
112114
pub const Union = Generated._union;

src/events/event_ui.zig

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
const std = @import("std");
2+
3+
const jsruntime = @import("jsruntime");
4+
const Case = jsruntime.test_utils.Case;
5+
const checkCases = jsruntime.test_utils.checkCases;
6+
7+
const parser = @import("../netsurf.zig");
8+
9+
const Event = @import("event.zig").Event;
10+
const Window = @import("../html/window.zig").Window;
11+
12+
pub const UIEvent = struct {
13+
pub const Self = parser.UIEvent;
14+
pub const mem_guarantied = true;
15+
16+
pub const UIEventInit = parser.UIEventInit;
17+
18+
// JS
19+
// --
20+
21+
pub fn constructor(typ: []const u8, opts: ?UIEventInit) !*parser.UIEvent {
22+
const evt = try parser.uiEventCreate();
23+
try parser.uiEventInit(evt, typ, opts orelse UIEventInit{});
24+
return evt;
25+
}
26+
27+
// pub fn get_detail(self: parser.EventUI) !u32 {
28+
// return try parser.eventUIDetail(self);
29+
// }
30+
31+
// pub fn get_view(self: parser.Event) !?Window {
32+
// return try parser.eventUIView(self);
33+
// }
34+
};
35+
36+
pub fn testExecFn(
37+
_: std.mem.Allocator,
38+
js_env: *jsruntime.Env,
39+
) anyerror!void {
40+
var ui_event = [_]Case{
41+
.{ .src = "let content = document.getElementById('content')", .ex = "undefined" },
42+
.{ .src = "var evt", .ex = "undefined" },
43+
.{ .src = "content.addEventListener('evt', function(e) {evt = e})", .ex = "undefined" },
44+
.{ .src = "content.dispatchEvent(new UIEvent('evt'))", .ex = "true" },
45+
.{ .src = "evt instanceof UIEvent", .ex = "true" },
46+
};
47+
try checkCases(js_env, &ui_event);
48+
}

src/netsurf.zig

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ const c = @cImport({
77

88
const Callback = @import("jsruntime").Callback;
99

10+
const Window = @import("html/window.zig").Window;
11+
1012
// Vtable
1113
// ------
1214

@@ -443,6 +445,36 @@ pub fn eventPreventDefault(evt: *Event) !void {
443445
try DOMErr(err);
444446
}
445447

448+
// UIEvent
449+
pub const UIEvent = c.dom_ui_event;
450+
451+
pub fn uiEventCreate() !*UIEvent {
452+
var evt: ?*UIEvent = undefined;
453+
const err = c._dom_ui_event_create(&evt);
454+
try DOMErr(err);
455+
return evt.?;
456+
}
457+
458+
pub const UIEventInit = struct {
459+
bubbles: bool = false,
460+
cancelable: bool = false,
461+
462+
view: ?Window = null,
463+
detail: i32 = 0,
464+
};
465+
466+
pub fn uiEventInit(evt: *UIEvent, typ: []const u8, opts: UIEventInit) !void {
467+
const err = c._dom_ui_event_init(
468+
evt,
469+
try strFromData(typ),
470+
opts.bubbles,
471+
opts.cancelable,
472+
null,
473+
opts.detail,
474+
);
475+
try DOMErr(err);
476+
}
477+
446478
// EventHandler
447479
fn event_handler_cbk(data: *anyopaque) *Callback {
448480
const ptr: *align(@alignOf(*Callback)) anyopaque = @alignCast(data);

src/run_tests.zig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const NodeListTestExecFn = @import("dom/nodelist.zig").testExecFn;
2222
const AttrTestExecFn = @import("dom/attribute.zig").testExecFn;
2323
const EventTargetTestExecFn = @import("dom/event_target.zig").testExecFn;
2424
const EventTestExecFn = @import("events/event.zig").testExecFn;
25+
const UIEventTestExecFn = @import("events/event_ui.zig").testExecFn;
2526

2627
pub const Types = jsruntime.reflect(apiweb.Interfaces);
2728

@@ -77,6 +78,7 @@ fn testsAllExecFn(
7778
AttrTestExecFn,
7879
EventTargetTestExecFn,
7980
EventTestExecFn,
81+
UIEventTestExecFn,
8082
};
8183

8284
inline for (testFns) |testFn| {

0 commit comments

Comments
 (0)