LibWeb/HTML: Include better information in 'report an exception' event

Instead of always reporting a colno and lineno of zero try and use the
values from the Error object that may be provided, falling back to the
source location of the invocation if not provided. We can definitely
improve the reporting even more, but this is a start!

Also update this function to latest spec while we're in the area.
This commit is contained in:
Shannon Booth 2025-01-12 18:57:16 +13:00 committed by Tim Ledbetter
commit 57479c2d4b
Notes: github-actions[bot] 2025-01-12 18:50:52 +00:00
6 changed files with 204 additions and 72 deletions

View file

@ -0,0 +1,15 @@
<!doctype html>
<meta charset=utf-8>
<script>
self.GLOBAL = {
isWindow: function() { return true; },
isWorker: function() { return false; },
isShadowRealm: function() { return false; },
};
</script>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<div id=log></div>
<script src="../../../html/webappapis/scripting/reporterror.any.js"></script>

View file

@ -0,0 +1,49 @@
setup({ allow_uncaught_exception:true });
[
1,
new TypeError(),
undefined
].forEach(throwable => {
test(t => {
let happened = false;
self.addEventListener("error", t.step_func(e => {
assert_true(e.message !== "");
assert_equals(e.filename, new URL("reporterror.any.js", location.href).href);
assert_greater_than(e.lineno, 0);
assert_greater_than(e.colno, 0);
assert_equals(e.error, throwable);
happened = true;
}), { once:true });
self.reportError(throwable);
assert_true(happened);
}, `self.reportError(${throwable})`);
});
test(() => {
assert_throws_js(TypeError, () => self.reportError());
}, `self.reportError() (without arguments) throws`);
test(() => {
// Workaround for https://github.com/web-platform-tests/wpt/issues/32105
let invoked = false;
self.reportError({
get name() {
invoked = true;
assert_unreached('get name')
},
get message() {
invoked = true;
assert_unreached('get message');
},
get fileName() {
invoked = true;
assert_unreached('get fileName');
},
get lineNumber() {
invoked = true;
assert_unreached('get lineNumber');
}
});
assert_false(invoked);
}, `self.reportError() doesn't invoke getters`);