@@ -2,6 +2,11 @@ const std = @import("std");
22
33const generate = @import ("../generate.zig" );
44
5+ const jsruntime = @import ("jsruntime" );
6+ const Callback = jsruntime .Callback ;
7+ const Case = jsruntime .test_utils .Case ;
8+ const checkCases = jsruntime .test_utils .checkCases ;
9+
510const parser = @import ("../netsurf.zig" );
611
712const DOMException = @import ("../dom/exceptions.zig" ).DOMException ;
@@ -73,15 +78,15 @@ pub const Event = struct {
7378
7479 // Methods
7580
76- pub fn get_stopPropagation (self : * parser.Event ) ! void {
81+ pub fn _stopPropagation (self : * parser.Event ) ! void {
7782 return try parser .eventStopPropagation (self );
7883 }
7984
80- pub fn get_stopImmediatePropagation (self : * parser.Event ) ! void {
85+ pub fn _stopImmediatePropagation (self : * parser.Event ) ! void {
8186 return try parser .eventStopImmediatePropagation (self );
8287 }
8388
84- pub fn get_preventDefault (self : * parser.Event ) ! void {
89+ pub fn _preventDefault (self : * parser.Event ) ! void {
8590 return try parser .eventPreventDefault (self );
8691 }
8792};
@@ -92,3 +97,77 @@ pub const Interfaces = generate.Tuple(.{
9297});
9398const Generated = generate .Union .compile (Interfaces );
9499pub const Union = Generated ._union ;
100+
101+ pub fn testExecFn (
102+ _ : std.mem.Allocator ,
103+ js_env : * jsruntime.Env ,
104+ ) anyerror ! void {
105+ var common = [_ ]Case {
106+ .{ .src = "let content = document.getElementById('content')" , .ex = "undefined" },
107+ .{ .src = "let para = document.getElementById('para')" , .ex = "undefined" },
108+ .{ .src = "var nb = 0; var evt" , .ex = "undefined" },
109+ };
110+ try checkCases (js_env , & common );
111+
112+ var basic = [_ ]Case {
113+ .{ .src =
114+ \\content.addEventListener('target',
115+ \\function(e) {
116+ \\evt = e; nb = nb + 1;
117+ \\e.preventDefault();
118+ \\})
119+ , .ex = "undefined" },
120+ .{ .src = "content.dispatchEvent(new Event('target', {bubbles: true, cancelable: true}))" , .ex = "false" },
121+ .{ .src = "nb" , .ex = "1" },
122+ .{ .src = "evt.target === content" , .ex = "true" },
123+ .{ .src = "evt.bubbles" , .ex = "true" },
124+ .{ .src = "evt.cancelable" , .ex = "true" },
125+ .{ .src = "evt.defaultPrevented" , .ex = "true" },
126+ .{ .src = "evt.isTrusted" , .ex = "true" },
127+ .{ .src = "evt.timestamp > 1704063600" , .ex = "true" }, // 2024/01/01 00:00
128+ // event.type, event.currentTarget, event.phase checked in EventTarget
129+ };
130+ try checkCases (js_env , & basic );
131+
132+ var stop = [_ ]Case {
133+ .{ .src = "nb = 0" , .ex = "0" },
134+ .{ .src =
135+ \\content.addEventListener('stop',
136+ \\function(e) {
137+ \\e.stopPropagation();
138+ \\nb = nb + 1;
139+ \\}, true)
140+ , .ex = "undefined" },
141+ // the following event listener will not be invoked
142+ .{ .src =
143+ \\para.addEventListener('stop',
144+ \\function(e) {
145+ \\nb = nb + 1;
146+ \\})
147+ , .ex = "undefined" },
148+ .{ .src = "para.dispatchEvent(new Event('stop'))" , .ex = "true" },
149+ .{ .src = "nb" , .ex = "1" }, // will be 2 if event was not stopped at content event listener
150+ };
151+ try checkCases (js_env , & stop );
152+
153+ var stop_immediate = [_ ]Case {
154+ .{ .src = "nb = 0" , .ex = "0" },
155+ .{ .src =
156+ \\content.addEventListener('immediate',
157+ \\function(e) {
158+ \\e.stopImmediatePropagation();
159+ \\nb = nb + 1;
160+ \\})
161+ , .ex = "undefined" },
162+ // the following event listener will not be invoked
163+ .{ .src =
164+ \\content.addEventListener('immediate',
165+ \\function(e) {
166+ \\nb = nb + 1;
167+ \\})
168+ , .ex = "undefined" },
169+ .{ .src = "content.dispatchEvent(new Event('immediate'))" , .ex = "true" },
170+ .{ .src = "nb" , .ex = "1" }, // will be 2 if event was not stopped at first content event listener
171+ };
172+ try checkCases (js_env , & stop_immediate );
173+ }
0 commit comments