LibWeb: Update run_timer_initialization_steps to the latest spec

This fixes a number of WPT tests, which expect an error to be reported
if an exception is thrown in the timer callback.
This commit is contained in:
Tim Ledbetter 2024-12-03 22:21:38 +00:00 committed by Tim Ledbetter
commit 4a6e457d4b
Notes: github-actions[bot] 2024-12-19 15:26:45 +00:00
5 changed files with 124 additions and 31 deletions

View file

@ -0,0 +1,31 @@
<!doctype html>
<meta charset=utf-8>
<title>window.setInterval() reports the exception from its callback in the callback's global object</title>
<script src=../../../resources/testharness.js></script>
<script src=../../../resources/testharnessreport.js></script>
<iframe></iframe>
<iframe></iframe>
<iframe></iframe>
<script>
setup({ allow_uncaught_exception: true });
const onerrorCalls = [];
window.onerror = () => { onerrorCalls.push("top"); };
frames[0].onerror = () => { onerrorCalls.push("frame0"); };
frames[1].onerror = () => { onerrorCalls.push("frame1"); };
frames[2].onerror = () => { onerrorCalls.push("frame2"); };
async_test(t => {
window.onload = t.step_func(() => {
const id = frames[0].setInterval(new frames[1].Function(`
parent.clearThisInterval();
throw new parent.frames[2].Error("PASS");
`), 4);
window.clearThisInterval = () => { frames[0].clearInterval(id); };
t.step_wait_func_done(() => onerrorCalls.length > 0,
() => assert_array_equals(onerrorCalls, ["frame1"]),
undefined, 1000, 10);
});
});
</script>

View file

@ -0,0 +1,27 @@
<!doctype html>
<meta charset=utf-8>
<title>window.setTimeout() reports the exception from its callback in the callback's global object</title>
<script src=../../../resources/testharness.js></script>
<script src=../../../resources/testharnessreport.js></script>
<iframe></iframe>
<iframe></iframe>
<iframe></iframe>
<script>
setup({ allow_uncaught_exception: true });
const onerrorCalls = [];
window.onerror = () => { onerrorCalls.push("top"); };
frames[0].onerror = () => { onerrorCalls.push("frame0"); };
frames[1].onerror = () => { onerrorCalls.push("frame1"); };
frames[2].onerror = () => { onerrorCalls.push("frame2"); };
async_test(t => {
window.onload = t.step_func(() => {
frames[0].setTimeout(new frames[1].Function(`throw new parent.frames[2].Error("PASS");`), 4);
t.step_wait_func_done(() => onerrorCalls.length > 0,
() => assert_array_equals(onerrorCalls, ["frame1"]),
undefined, 1000, 10);
});
});
</script>