
Harness Error (FAIL), message = Unhandled rejection

PASS Aborting a WritableStream before it starts should cause the writer's unsettled ready promise to reject 
FAIL Aborting a WritableStream should cause the writer's fulfilled ready promise to reset to a rejected one assert_not_equals: the ready promise property should change got disallowed value object "[object Promise]"
PASS abort() on a released writer rejects 
PASS Aborting a WritableStream immediately prevents future writes 
PASS Aborting a WritableStream prevents further writes after any that are in progress 
PASS Fulfillment value of writer.abort() call must be undefined even if the underlying sink returns a non-undefined value 
PASS WritableStream if sink's abort throws, the promise returned by writer.abort() rejects 
PASS WritableStream if sink's abort throws, the promise returned by multiple writer.abort()s is the same and rejects 
PASS WritableStream if sink's abort throws, the promise returned by ws.abort() rejects 
PASS WritableStream if sink's abort throws, for an abort performed during a write, the promise returned by ws.abort() rejects 
PASS Aborting a WritableStream passes through the given reason 
FAIL Aborting a WritableStream puts it in an errored state with the error passed to abort() assert_unreached: Should have rejected: ready should reject with error1 Reached unreachable code
PASS Aborting a WritableStream causes any outstanding write() promises to be rejected with the reason supplied 
PASS Closing but then immediately aborting a WritableStream causes the stream to error 
PASS Closing a WritableStream and aborting it while it closes causes the stream to ignore the abort attempt 
PASS Aborting a WritableStream after it is closed is a no-op 
PASS WritableStream should NOT call underlying sink's close if no abort is supplied (historical) 
PASS returning a thenable from abort() should work 
PASS .closed should not resolve before fulfilled write() 
PASS .closed should not resolve before rejected write(); write() error should not overwrite abort() error 
PASS writes should be satisfied in order when aborting 
PASS writes should be satisfied in order after rejected write when aborting 
PASS close() should reject with abort reason why abort() is first error 
PASS underlying abort() should not be called until underlying write() completes 
PASS underlying abort() should not be called if underlying close() has started 
PASS if underlying close() has started and then rejects, the abort() and close() promises should reject with the underlying close rejection reason 
PASS an abort() that happens during a write() should trigger the underlying abort() even with a close() queued 
PASS if a writer is created for a stream with a pending abort, its ready should be rejected with the abort error 
PASS writer close() promise should resolve before abort() promise 
PASS writer.ready should reject on controller error without waiting for underlying write 
FAIL writer.abort() while there is an in-flight write, and then finish the write with rejection promise_rejects_js: writer.ready must be rejected with an error indicating release function "function () { throw e }" threw object "error1: error1" ("error1") expected instance of function "function TypeError() {
    [native code]
}" ("TypeError")
FAIL writer.abort(), controller.error() while there is an in-flight write, and then finish the write promise_rejects_js: writer.ready must be rejected with an error indicating release function "function () { throw e }" threw object "error1: error1" ("error1") expected instance of function "function TypeError() {
    [native code]
}" ("TypeError")
FAIL writer.abort(), controller.error() while there is an in-flight close, and then finish the close assert_unreached: Should have rejected: writer.ready must reject with the error from abort Reached unreachable code
FAIL controller.error(), writer.abort() while there is an in-flight write, and then finish the write promise_rejects_js: writer.ready must be rejected with an error indicating release function "function () { throw e }" threw object "error2: error2" ("error2") expected instance of function "function TypeError() {
    [native code]
}" ("TypeError")
FAIL controller.error(), writer.abort() while there is an in-flight close, and then finish the close assert_unreached: Should have rejected: writer.ready must reject with the error passed to the controller's error method Reached unreachable code
PASS releaseLock() while aborting should reject the original closed promise 
PASS releaseLock() during delayed async abort() should reject the writer.closed promise 
PASS sink abort() should not be called until sink start() is done 
PASS if start attempts to error the controller after abort() has been called, then it should lose 
PASS stream abort() promise should still resolve if sink start() rejects 
FAIL writer abort() during sink start() should replace the writer.ready promise synchronously assert_not_equals: abort() should replace the ready promise with a rejected one got disallowed value object "[object Promise]"
PASS promises returned from other writer methods should be rejected when writer abort() happens during sink start() 
PASS abort() should succeed despite rejection from write 
PASS abort() should be rejected with the rejection returned from close() 
PASS a rejecting sink.write() should not prevent sink.abort() from being called 
PASS when start errors after stream abort(), underlying sink abort() should be called anyway 
PASS when calling abort() twice on the same stream, both should give the same promise that fulfills with undefined 
PASS when calling abort() twice on the same stream, but sequentially so so there's no pending abort the second time, both should fulfill with undefined 
PASS calling abort() on an errored stream should fulfill with undefined 
PASS sink abort() should not be called if stream was erroring due to controller.error() before abort() was called 
PASS sink abort() should not be called if stream was erroring due to bad strategy before abort() was called 
PASS abort with no arguments should set the stored error to undefined 
PASS abort with an undefined argument should set the stored error to undefined 
PASS abort with a string argument should set the stored error to that argument 
PASS abort on a locked stream should reject 

