Merge pull request #1882 from Tenith01/fix/window-onerror-special-case

fix: special-case Window#onerror per WHATWG spec (5-arg signature)
This commit is contained in:
Karl Seguin
2026-03-17 18:36:11 +08:00
committed by GitHub
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

@@ -348,7 +348,11 @@ pub fn reportError(self: *Window, err: js.Value, page: *Page) !void {
const event = error_event.asEvent();
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 (!event._prevent_default) {
@@ -880,3 +884,7 @@ test "WebApi: Window" {
test "WebApi: Window scroll" {
try testing.htmlRunner("window_scroll.html", .{});
}
test "WebApi: Window.onerror" {
try testing.htmlRunner("event/report_error.html", .{});
}