Re: [whatwg/streams] better-assert is broken (#985)

> When rethrowAssertionErrorRejection rethrows the exception, it loses the original stack.

I investigated this a bit further. It turns out `rethrowAssertionErrorRejection` **does not** lose the stack trace! The problem lies in how `jsdom` propagates errors, and how the `VirtualConsole` logs errors by default.

When `jsdom` turns an uncaught error into a `jsdomError` event, it places the original error in `e.detail` ([source](https://github.com/jsdom/jsdom/blob/13.0.0/lib/jsdom/living/helpers/runtime-script-errors.js#L67)). When a `VirtualConsole` receives such event, it calls `console.error(e.stack, e.detail)` ([source](https://github.com/jsdom/jsdom/blob/13.0.0/lib/jsdom/virtual-console.js#L29)). This logs the stack trace of the `jsdomError`, and the own properties of the original error:
```
Error: Uncaught [AssertionError: false == true]
    at reportException (C:\Users\Mattias\Documents\GitHub\whatwg-streams\reference-implementation\node_modules\jsdom\lib\jsdom\living\helpers\runtime-script-errors.js:66:24)
    at Timeout.callback [as _onTimeout] (C:\Users\Mattias\Documents\GitHub\whatwg-streams\reference-implementation\node_modules\jsdom\lib\jsdom\browser\Window.js:663:7)
    at ontimeout (timers.js:436:11)
    at tryOnTimeout (timers.js:300:5)
    at listOnTimeout (timers.js:263:5)
    at Timer.processTimers (timers.js:223:10) AssertionError {
  name: 'AssertionError',
  actual: false,
  expected: true,
  operator: '==',
  message: 'false == true',
  generatedMessage: true }
```
Instead, we could have it log the stack trace of the original error instead with `console.error(e.detail.stack)`:
```
AssertionError: false == true
    at ReadableStreamDefaultControllerClose (eval at setup (C:\Users\Mattias\Documents\GitHub\whatwg-streams\reference-implementation\run-web-platform-tests.js:41:14), <anonymous>:1535:3)
    at ReadableStreamDefaultReaderRead.then.result (eval at setup (C:\Users\Mattias\Documents\GitHub\whatwg-streams\reference-implementation\run-web-platform-tests.js:41:14), <anonymous>:888:11)
    at process._tickCallback (internal/process/next_tick.js:68:7)
```
We could change this in `wpt-runner` by passing a custom `VirtualConsole` in `runTest` ([source](https://github.com/domenic/wpt-runner/blob/v2.7.0/lib/wpt-runner.js#L117)):
```js
function runTest(url, setup, reporter) {
  return new Promise(resolve => {
    const virtualConsole = new VirtualConsole()
      .sendTo(console, { omitJSDOMErrors: true })
      .on("jsdomError", e => console.error(e.detail.stack));

    JSDOM.fromURL(url, {
      resources: "usable",
      runScripts: "dangerously",
      virtualConsole
    }).then(dom => {
```
Thoughts?

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/streams/issues/985#issuecomment-466709728

Received on Saturday, 23 February 2019 23:12:23 UTC