diff --git a/src/events/event.zig b/src/events/event.zig index f192430d..83f12824 100644 --- a/src/events/event.zig +++ b/src/events/event.zig @@ -13,12 +13,12 @@ const DOMException = @import("../dom/exceptions.zig").DOMException; const EventTarget = @import("../dom/event_target.zig").EventTarget; const EventTargetUnion = @import("../dom/event_target.zig").Union; -const xhr = @import("../xhr/xhr.zig"); +const ProgressEvent = @import("../xhr/progress_event.zig").ProgressEvent; // Event interfaces pub const Interfaces = generate.Tuple(.{ Event, - xhr.ProgressEvent, + ProgressEvent, }); const Generated = generate.Union.compile(Interfaces); pub const Union = Generated._union; @@ -41,7 +41,7 @@ pub const Event = struct { pub fn toInterface(evt: *parser.Event) !Union { return switch (try parser.eventGetInternalType(evt)) { .event => .{ .Event = evt }, - .progress_event => .{ .ProgressEvent = @as(*xhr.ProgressEvent, @ptrCast(evt)).* }, + .progress_event => .{ .ProgressEvent = @as(*ProgressEvent, @ptrCast(evt)).* }, }; } diff --git a/src/run_tests.zig b/src/run_tests.zig index 4e22c04f..7bebe7b1 100644 --- a/src/run_tests.zig +++ b/src/run_tests.zig @@ -7,6 +7,7 @@ const generate = @import("generate.zig"); const parser = @import("netsurf.zig"); const apiweb = @import("apiweb.zig"); const Window = @import("html/window.zig").Window; +const xhr = @import("xhr/xhr.zig"); const documentTestExecFn = @import("dom/document.zig").testExecFn; const HTMLDocumentTestExecFn = @import("html/document.zig").testExecFn; @@ -23,8 +24,8 @@ const NodeListTestExecFn = @import("dom/nodelist.zig").testExecFn; const AttrTestExecFn = @import("dom/attribute.zig").testExecFn; const EventTargetTestExecFn = @import("dom/event_target.zig").testExecFn; const EventTestExecFn = @import("events/event.zig").testExecFn; -const xhr = @import("xhr/xhr.zig"); const XHRTestExecFn = xhr.testExecFn; +const ProgressEventTestExecFn = @import("xhr/progress_event.zig").testExecFn; pub const Types = jsruntime.reflect(apiweb.Interfaces); @@ -81,6 +82,7 @@ fn testsAllExecFn( EventTargetTestExecFn, EventTestExecFn, XHRTestExecFn, + ProgressEventTestExecFn, }; inline for (testFns) |testFn| { diff --git a/src/xhr/progress_event.zig b/src/xhr/progress_event.zig new file mode 100644 index 00000000..afdf36a9 --- /dev/null +++ b/src/xhr/progress_event.zig @@ -0,0 +1,72 @@ +const std = @import("std"); + +const jsruntime = @import("jsruntime"); +const Case = jsruntime.test_utils.Case; +const checkCases = jsruntime.test_utils.checkCases; + +const parser = @import("../netsurf.zig"); +const Event = @import("../events/event.zig").Event; + +const DOMException = @import("../dom/exceptions.zig").DOMException; + +pub const ProgressEvent = struct { + pub const prototype = *Event; + pub const Exception = DOMException; + pub const mem_guarantied = true; + + pub const EventInit = struct { + lengthComputable: bool = false, + loaded: u64 = 0, + total: u64 = 0, + }; + + proto: parser.Event, + lengthComputable: bool, + loaded: u64 = 0, + total: u64 = 0, + + pub fn constructor(eventType: []const u8, opts: ?EventInit) !ProgressEvent { + const event = try parser.eventCreate(); + defer parser.eventDestroy(event); + try parser.eventInit(event, eventType, .{}); + try parser.eventSetInternalType(event, .progress_event); + + const o = opts orelse EventInit{}; + + return .{ + .proto = event.*, + .lengthComputable = o.lengthComputable, + .loaded = o.loaded, + .total = o.total, + }; + } + + pub fn get_lengthComputable(self: ProgressEvent) bool { + return self.lengthComputable; + } + + pub fn get_loaded(self: ProgressEvent) u64 { + return self.loaded; + } + + pub fn get_total(self: ProgressEvent) u64 { + return self.total; + } +}; + +pub fn testExecFn( + _: std.mem.Allocator, + js_env: *jsruntime.Env, +) anyerror!void { + var progress_event = [_]Case{ + .{ .src = "let pevt = new ProgressEvent('foo');", .ex = "undefined" }, + .{ .src = "pevt.loaded", .ex = "0" }, + .{ .src = "pevt instanceof ProgressEvent", .ex = "true" }, + .{ .src = "var nnb = 0; var eevt = null; function ccbk(event) { nnb ++; eevt = event; }", .ex = "undefined" }, + .{ .src = "document.addEventListener('foo', ccbk)", .ex = "undefined" }, + .{ .src = "document.dispatchEvent(pevt)", .ex = "true" }, + .{ .src = "eevt.type", .ex = "foo" }, + .{ .src = "eevt instanceof ProgressEvent", .ex = "true" }, + }; + try checkCases(js_env, &progress_event); +} diff --git a/src/xhr/xhr.zig b/src/xhr/xhr.zig index 26a3e4aa..d294c3ef 100644 --- a/src/xhr/xhr.zig +++ b/src/xhr/xhr.zig @@ -7,6 +7,7 @@ const generate = @import("../generate.zig"); const EventTarget = @import("../dom/event_target.zig").EventTarget; const Event = @import("../events/event.zig").Event; +const ProgressEvent = @import("progress_event.zig").ProgressEvent; const Callback = jsruntime.Callback; const DOMError = @import("../netsurf.zig").DOMError; const DOMException = @import("../dom/exceptions.zig").DOMException; @@ -123,51 +124,6 @@ pub const XMLHttpRequestUpload = struct { proto: XMLHttpRequestEventTarget = XMLHttpRequestEventTarget{}, }; -pub const ProgressEvent = struct { - pub const prototype = *Event; - pub const Exception = DOMException; - pub const mem_guarantied = true; - - pub const EventInit = struct { - lengthComputable: bool = false, - loaded: u64 = 0, - total: u64 = 0, - }; - - proto: parser.Event, - lengthComputable: bool, - loaded: u64 = 0, - total: u64 = 0, - - pub fn constructor(eventType: []const u8, opts: ?EventInit) !ProgressEvent { - const event = try parser.eventCreate(); - defer parser.eventDestroy(event); - try parser.eventInit(event, eventType, .{}); - try parser.eventSetInternalType(event, .progress_event); - - const o = opts orelse EventInit{}; - - return .{ - .proto = event.*, - .lengthComputable = o.lengthComputable, - .loaded = o.loaded, - .total = o.total, - }; - } - - pub fn get_lengthComputable(self: ProgressEvent) bool { - return self.lengthComputable; - } - - pub fn get_loaded(self: ProgressEvent) u64 { - return self.loaded; - } - - pub fn get_total(self: ProgressEvent) u64 { - return self.total; - } -}; - pub const XMLHttpRequest = struct { pub const prototype = *XMLHttpRequestEventTarget; pub const mem_guarantied = true; @@ -595,16 +551,4 @@ pub fn testExecFn( .{ .src = "req.responseText.length > 1024", .ex = "true" }, }; try checkCases(js_env, &send); - - var progress_event = [_]Case{ - .{ .src = "let pevt = new ProgressEvent('foo');", .ex = "undefined" }, - .{ .src = "pevt.loaded", .ex = "0" }, - .{ .src = "pevt instanceof ProgressEvent", .ex = "true" }, - .{ .src = "var nnb = 0; var eevt = null; function ccbk(event) { nnb ++; eevt = event; }", .ex = "undefined" }, - .{ .src = "document.addEventListener('foo', ccbk)", .ex = "undefined" }, - .{ .src = "document.dispatchEvent(pevt)", .ex = "true" }, - .{ .src = "eevt.type", .ex = "foo" }, - .{ .src = "eevt instanceof ProgressEvent", .ex = "true" }, - }; - try checkCases(js_env, &progress_event); }