[test_runner] include error stack in window.onerror if available.

According to the [Window.onerror MDN docs][1] an error object may be
provided as a 5th argument. This error object can be used to extract a
stack trace with more context about the error message.

[1]: https://developer.mozilla.org/en-US/docs/Web/API/Window/error_event

With this change, we can get a more precise error on uncuaght exceptions.

This is an example of a before and after on a unit test failing in
ddc-chrome-linux.

Before:

```
  Runtime window.onerror:
  window.onerror called:

  http://127.0.0.1:46235/root_build/gen/utils/ddc/stable/sdk/amd/dart_sdk.js:5082:
  Uncaught Error
```

After:

```
  Runtime window.onerror:
  window.onerror called:

  http://127.0.0.1:46235/root_build/gen/utils/ddc/stable/sdk/amd/dart_sdk.js:5082:
  Uncaught Error
  Error: Expected a value of type 'FutureOr<FileSystem>?', but got one of type 'LegacyJavaScriptObject'
      at Object.throw_ [as throw] (http://127.0.0.1:46235/root_build/gen/utils/ddc/stable/sdk/amd/dart_sdk.js:5082:11)
      at Object.castError (http://127.0.0.1:46235/root_build/gen/utils/ddc/stable/sdk/amd/dart_sdk.js:5041:15)
      at Object.cast [as as] (http://127.0.0.1:46235/root_build/gen/utils/ddc/stable/sdk/amd/dart_sdk.js:5385:19)
      at dart.NullableType.new.as (http://127.0.0.1:46235/root_build/gen/utils/ddc/stable/sdk/amd/dart_sdk.js:7243:60)
      at _AsyncCompleter.new.complete (http://127.0.0.1:46235/root_build/gen/utils/ddc/stable/sdk/amd/dart_sdk.js:31216:28)
      at http://127.0.0.1:46235/root_build/gen/utils/ddc/stable/sdk/amd/dart_sdk.js:99073:19
```

Change-Id: If89c253d8e6edee9b7102269466b40b605951a6c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/328804
Reviewed-by: Nicholas Shahan <nshahan@google.com>
Commit-Queue: Sigmund Cherem <sigmund@google.com>
This commit is contained in:
Sigmund Cherem
2023-10-06 00:58:54 +00:00
committed by Commit Queue
parent efc62a838e
commit 6f090565aa
2 changed files with 14 additions and 7 deletions
@@ -1388,12 +1388,15 @@ body div {
test_completed = false;
}
window.onerror = function (message, url, lineNumber) {
if (url) {
reportError(url + ':' + lineNumber + ':' + message);
} else {
reportError(message);
window.onerror = function (message, url, lineNumber, columnNumber, err) {
// Ensure the stack is included in the reported error, if available.
if (err && err.stack) {
message = message + '\\n' + err.stack;
}
if (url) {
message = url + ':' + lineNumber + ':' + columnNumber + ':' + message;
}
reportError(message);
}
function reportError(msg) {
+6 -2
View File
@@ -93,10 +93,14 @@ var hadTopLevelError = false;
// Set window onerror to make sure that we catch test harness errors across all
// browsers.
window.onerror = function (message, url, lineNumber) {
window.onerror = function (message, url, lineNumber, columnNumber, err) {
// Ensure the stack is included in the reported error, if available.
if (err && err.stack) {
message = message + '\n' + err.stack;
}
if (url) {
message = ('window.onerror called: \n\n' +
url + ':' + lineNumber + ':\n' + message + '\n\n');
url + ':' + lineNumber + ':' + columnNumber + ':\n' + message + '\n\n');
}
if (testExpectsGlobalError) {
testSuppressedGlobalErrors.push({