mirror of
https://github.com/lightpanda-io/browser.git
synced 2026-03-22 12:44:43 +00:00
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:
38
src/browser/tests/event/report_error.html
Normal file
38
src/browser/tests/event/report_error.html
Normal 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>
|
||||||
@@ -348,7 +348,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) {
|
||||||
@@ -880,3 +884,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", .{});
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user