more legacy test fixes

This commit is contained in:
Karl Seguin
2025-12-25 09:08:01 +08:00
parent b2b890b8b1
commit 9f3cb4349d
8 changed files with 57 additions and 103 deletions

View File

@@ -135,7 +135,7 @@ pub fn callWithThis(self: *const Function, comptime T: type, this: anytype, args
.pointer => blk: { .pointer => blk: {
var values = try context.call_arena.alloc(v8.Value, args.len); var values = try context.call_arena.alloc(v8.Value, args.len);
for (args, 0..) |a, i| { for (args, 0..) |a, i| {
values[i] = try context.zigValueToJs(a); values[i] = try context.zigValueToJs(a, .{});
} }
break :blk values; break :blk values;
}, },

View File

@@ -2,8 +2,8 @@
<script src="../testing.js"></script> <script src="../testing.js"></script>
<script id=location> <script id=location>
testing.expectEqual('"http://localhost:9589/html/location.html', location.href); testing.expectEqual('http://localhost:9589/html/location.html', location.href);
testing.expectEqual('"http://localhost:9589/html/location.html', document.location.href); testing.expectEqual('http://localhost:9589/html/location.html', document.location.href);
testing.expectEqual("localhost:9589", location.host); testing.expectEqual("localhost:9589", location.host);
testing.expectEqual("localhost", location.hostname); testing.expectEqual("localhost", location.hostname);
@@ -17,17 +17,17 @@
<script id=location_hash> <script id=location_hash>
location.hash = ""; location.hash = "";
testing.expectEqual("", location.hash); testing.expectEqual("", location.hash);
testing.expectEqual('"http://localhost:9589/html/location.html', location.href); testing.expectEqual('http://localhost:9589/html/location.html', location.href);
location.hash = "#abcdef"; location.hash = "#abcdef";
testing.expectEqual("#abcdef", location.hash); testing.expectEqual("#abcdef", location.hash);
testing.expectEqual('"http://localhost:9589/html/location.html#abcdef', location.href); testing.expectEqual('http://localhost:9589/html/location.html#abcdef', location.href);
location.hash = "xyzxyz"; location.hash = "xyzxyz";
testing.expectEqual("#xyzxyz", location.hash); testing.expectEqual("#xyzxyz", location.hash);
testing.expectEqual('"http://localhost:9589/html/location.html#xyzxyz', location.href); testing.expectEqual('http://localhost:9589/html/location.html#xyzxyz', location.href);
location.hash = ""; location.hash = "";
testing.expectEqual("", location.hash); testing.expectEqual("", location.hash);
testing.expectEqual('"http://localhost:9589/html/location.html', location.href); testing.expectEqual('http://localhost:9589/html/location.html', location.href);
</script> </script>

View File

@@ -9,5 +9,4 @@
<script id=frames> <script id=frames>
testing.expectEqual(2, frames.length); testing.expectEqual(2, frames.length);
testing.expectEqual(undefined, frames[3]) testing.expectEqual(undefined, frames[3])
testing.expectError('Error: TODO', () => { frames[1] });
</script> </script>

View File

@@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<script src="../testing.js"></script> <script src="../testing.js"></script>
<body style=height:4000px;width:4000px></body> <body style=height:4000px;width:4000px></body>
<script id=aliases> <script id=aliases>
testing.expectEqual(window, window.self); testing.expectEqual(window, window.self);
testing.expectEqual(window, window.parent); testing.expectEqual(window, window.parent);
@@ -26,23 +27,6 @@
testing.eventually(() => testing.expectEqual(true, start > 0)); testing.eventually(() => testing.expectEqual(true, start > 0));
</script> </script>
<script id=dimensions>
testing.expectEqual(5, innerHeight);
// Width is 5 even if there are no elements
testing.expectEqual(5, innerWidth);
let div1 = document.createElement('div');
document.body.appendChild(div1);
div1.getClientRects()
let div2 = document.createElement('div');
document.body.appendChild(div2);
div2.getClientRects();
testing.expectEqual(5, innerHeight);
testing.expectEqual(10, innerWidth);
</script>
<script id=setTimeout> <script id=setTimeout>
let longCall = false; let longCall = false;
window.setTimeout(() => {longCall = true}, 5001); window.setTimeout(() => {longCall = true}, 5001);
@@ -53,7 +37,9 @@
testing.eventually(() => testing.expectEqual(1, wst1)); testing.eventually(() => testing.expectEqual(1, wst1));
let wst2 = 1; let wst2 = 1;
window.setTimeout((a, b) => {wst2 = a+ b}, 1, 2, 3); window.setTimeout((a, b) => {
wst2 = a + b;
}, 1, 2, 3);
testing.eventually(() => testing.expectEqual(5, wst2)); testing.eventually(() => testing.expectEqual(5, wst2));
</script> </script>
@@ -81,46 +67,6 @@
}); });
</script> </script>
<script id=scroll>
let scroll = false;
let scrollend = false
window.addEventListener('scroll', () => {scroll = true});
document.addEventListener('scrollend', () => {scrollend = true});
window.scrollTo(0, 0);
testing.expectEqual(0, scrollX);
testing.expectEqual(0, pageXOffset);
testing.expectEqual(0, scrollY);
testing.expectEqual(0, pageYOffset);
testing.expectEqual(true, scroll);
testing.expectEqual(true, scrollend);
window.scrollTo(10, 20);
testing.expectEqual(10, scrollX);
testing.expectEqual(10, pageXOffset);
testing.expectEqual(20, scrollY);
testing.expectEqual(20, pageYOffset);
window.scrollTo(-10, -20);
testing.expectEqual(0, scrollX);
testing.expectEqual(0, pageXOffset);
testing.expectEqual(0, scrollY);
testing.expectEqual(0, pageYOffset);
window.scrollTo({top: 30, left: 40});
testing.expectEqual(40, scrollX);
testing.expectEqual(40, pageXOffset);
testing.expectEqual(30, scrollY);
testing.expectEqual(30, pageYOffset);
window.scrollTo({top: -30, left: -40});
testing.expectEqual(0, scrollX);
testing.expectEqual(0, pageXOffset);
testing.expectEqual(0, scrollY);
testing.expectEqual(0, pageYOffset);
</script>
<script id=queueMicroTask> <script id=queueMicroTask>
var qm = false; var qm = false;
window.queueMicrotask(() => {qm = true }); window.queueMicrotask(() => {qm = true });
@@ -137,9 +83,11 @@
</script> </script>
<script id=window.onload> <script id=window.onload>
let isWindowTarget = false; let isDocumentTarget = false;
const callback = (e) => isWindowTarget = e.target === window; const callback = (e) => {
isDocumentTarget = e.target === document;
};
// Callback is not set yet. // Callback is not set yet.
testing.expectEqual(null, window.onload); testing.expectEqual(null, window.onload);
// Setting an object. // Setting an object.
@@ -149,7 +97,7 @@
window.onload = callback; window.onload = callback;
testing.expectEqual(callback, window.onload); testing.expectEqual(callback, window.onload);
testing.eventually(() => testing.expectEqual(true, isWindowTarget)); testing.eventually(() => testing.expectEqual(true, isDocumentTarget));
</script> </script>
<script id=reportError> <script id=reportError>

View File

@@ -22,3 +22,12 @@
testing.expectEqual(false, set_interval2); testing.expectEqual(false, set_interval2);
}); });
</script> </script>
<script id=setTimeout>
let wst2 = 1;
window.setTimeout((a, b) => {
wst2 = a + b;
}, 1, 2, 3);
testing.eventually(() => testing.expectEqual(5, wst2));
</script>

View File

@@ -5,6 +5,9 @@
testing.expectEqual(window, globalThis); testing.expectEqual(window, globalThis);
testing.expectEqual(window, self); testing.expectEqual(window, self);
testing.expectEqual(window, window.self); testing.expectEqual(window, window.self);
testing.expectEqual(1080, innerHeight);
testing.expectEqual(1920, innerWidth);
</script> </script>
<script id=load> <script id=load>

View File

@@ -149,60 +149,40 @@ pub fn getOnLoad(self: *const Window) ?js.Function {
return self._on_load; return self._on_load;
} }
pub fn setOnLoad(self: *Window, cb_: ?js.Function) !void { pub fn setOnLoad(self: *Window, setter: ?FunctionSetter) !void {
if (cb_) |cb| { self._on_load = getFunctionFromSetter(setter);
self._on_load = cb;
} else {
self._on_load = null;
}
} }
pub fn getOnPageShow(self: *const Window) ?js.Function { pub fn getOnPageShow(self: *const Window) ?js.Function {
return self._on_pageshow; return self._on_pageshow;
} }
pub fn setOnPageShow(self: *Window, cb_: ?js.Function) !void { pub fn setOnPageShow(self: *Window, setter: ?FunctionSetter) !void {
if (cb_) |cb| { self._on_pageshow = getFunctionFromSetter(setter);
self._on_pageshow = cb;
} else {
self._on_pageshow = null;
}
} }
pub fn getOnPopState(self: *const Window) ?js.Function { pub fn getOnPopState(self: *const Window) ?js.Function {
return self._on_popstate; return self._on_popstate;
} }
pub fn setOnPopState(self: *Window, cb_: ?js.Function) !void { pub fn setOnPopState(self: *Window, setter: ?FunctionSetter) !void {
if (cb_) |cb| { self._on_popstate = getFunctionFromSetter(setter);
self._on_popstate = cb;
} else {
self._on_popstate = null;
}
} }
pub fn getOnError(self: *const Window) ?js.Function { pub fn getOnError(self: *const Window) ?js.Function {
return self._on_error; return self._on_error;
} }
pub fn setOnError(self: *Window, cb_: ?js.Function) !void { pub fn setOnError(self: *Window, setter: ?FunctionSetter) !void {
if (cb_) |cb| { self._on_error = getFunctionFromSetter(setter);
self._on_error = cb;
} else {
self._on_error = null;
}
} }
pub fn getOnUnhandledRejection(self: *const Window) ?js.Function { pub fn getOnUnhandledRejection(self: *const Window) ?js.Function {
return self._on_unhandled_rejection; return self._on_unhandled_rejection;
} }
pub fn setOnUnhandledRejection(self: *Window, cb_: ?js.Function) !void { pub fn setOnUnhandledRejection(self: *Window, setter: ?FunctionSetter) !void {
if (cb_) |cb| { self._on_unhandled_rejection = getFunctionFromSetter(setter);
self._on_unhandled_rejection = cb;
} else {
self._on_unhandled_rejection = null;
}
} }
pub fn fetch(_: *const Window, input: Fetch.Input, options: ?Fetch.InitOpts, page: *Page) !js.Promise { pub fn fetch(_: *const Window, input: Fetch.Input, options: ?Fetch.InitOpts, page: *Page) !js.Promise {
@@ -351,9 +331,9 @@ pub fn btoa(_: *const Window, input: []const u8, page: *Page) ![]const u8 {
} }
pub fn atob(_: *const Window, input: []const u8, page: *Page) ![]const u8 { pub fn atob(_: *const Window, input: []const u8, page: *Page) ![]const u8 {
const decoded_len = try std.base64.standard.Decoder.calcSizeForSlice(input); const decoded_len = std.base64.standard.Decoder.calcSizeForSlice(input) catch return error.InvalidCharacterError;
const decoded = try page.call_arena.alloc(u8, decoded_len); const decoded = try page.call_arena.alloc(u8, decoded_len);
try std.base64.standard.Decoder.decode(decoded, input); std.base64.standard.Decoder.decode(decoded, input) catch return error.InvalidCharacterError;
return decoded; return decoded;
} }
@@ -575,7 +555,7 @@ const ScheduleCallback = struct {
}; };
}, },
.normal => { .normal => {
self.cb.call(void, .{self.params}) catch |err| { self.cb.call(void, self.params) catch |err| {
log.warn(.js, "window.timer", .{ .name = self.name, .err = err }); log.warn(.js, "window.timer", .{ .name = self.name, .err = err });
}; };
}, },
@@ -621,6 +601,22 @@ const PostMessageCallback = struct {
} }
}; };
const FunctionSetter = union(enum) {
func: js.Function,
anything: js.Value,
};
// window.onload = {}; doesn't fail, but it doesn't do anything.
// seems like setting to null is ok (though, at least on Firefix, it preserves
// the original value, which we could do, but why?)
fn getFunctionFromSetter(setter_: ?FunctionSetter) ?js.Function {
const setter = setter_ orelse return null;
return switch (setter) {
.func => |func| func,
.anything => null,
};
}
pub const JsApi = struct { pub const JsApi = struct {
pub const bridge = js.Bridge(Window); pub const bridge = js.Bridge(Window);

View File

@@ -63,7 +63,6 @@ pub fn main() !void {
} }
// These are crashing, comment this out to skip them. // These are crashing, comment this out to skip them.
// if (std.mem.indexOf(u8, entry.basename, "navigation") != null) { // if (std.mem.indexOf(u8, entry.basename, "navigation") != null) {
// continue; // continue;
// } // }