fix: special-case Window#onerror per WHATWG spec (5-arg signature)

This commit is contained in:
Tenith01
2026-03-17 13:49:59 +05:30
parent 5cc5e513dd
commit ce002b999c
2 changed files with 47 additions and 1 deletions

View File

@@ -0,0 +1,38 @@
<!DOCTYPE html>
<script src="../testing.js"></script>
<script id=onerrorFiveArguments>
let called = false;
let argCount = 0;
window.onerror = function() {
called = true;
argCount = arguments.length;
return true; // suppress default
};
try { undefinedVariable; } catch(e) { window.reportError(e); }
testing.expectEqual(true, called);
testing.expectEqual(5, argCount);
window.onerror = null;
</script>
<script id=onerrorCalledBeforeEventListener>
let callOrder = [];
window.onerror = function() { callOrder.push('onerror'); return true; };
window.addEventListener('error', function() { callOrder.push('listener'); });
try { undefinedVariable; } catch(e) { window.reportError(e); }
testing.expectEqual('onerror', callOrder[0]);
testing.expectEqual('listener', callOrder[1]);
window.onerror = null;
</script>
<script id=onerrorReturnTrueSuppresses>
let listenerCalled = false;
window.onerror = function() { return true; };
window.addEventListener('error', function(e) {
// listener still fires even when onerror returns true
listenerCalled = true;
});
try { undefinedVariable; } catch(e) { window.reportError(e); }
testing.expectEqual(true, listenerCalled);
window.onerror = null;
</script>

View File

@@ -343,7 +343,11 @@ pub fn reportError(self: *Window, err: js.Value, page: *Page) !void {
const event = error_event.asEvent(); const event = error_event.asEvent();
event._prevent_default = prevent_default; event._prevent_default = prevent_default;
try page._event_manager.dispatch(self.asEventTarget(), event); // Pass null as handler: onerror was already called above with 5 args.
// We still dispatch so that addEventListener('error', ...) listeners fire.
try page._event_manager.dispatchDirect(self.asEventTarget(), event, null, .{
.context = "window.reportError",
});
if (comptime builtin.is_test == false) { if (comptime builtin.is_test == false) {
if (!event._prevent_default) { if (!event._prevent_default) {
@@ -874,3 +878,7 @@ test "WebApi: Window" {
test "WebApi: Window scroll" { test "WebApi: Window scroll" {
try testing.htmlRunner("window_scroll.html", .{}); try testing.htmlRunner("window_scroll.html", .{});
} }
test "WebApi: Window.onerror" {
try testing.htmlRunner("event/report_error.html", .{});
}