window.assertReturnValue = (result, w = window) => { assert_equals(Object.getPrototypeOf(result), w.Object.prototype, "result object must be from the right realm"); assert_array_equals(Reflect.ownKeys(result), ["committed", "finished"]); assert_true(result.committed instanceof w.Promise); assert_true(result.finished instanceof w.Promise); assert_not_equals(result.committed, result.finished); }; window.assertNeverSettles = (t, result, w = window) => { assertReturnValue(result, w); result.committed.then( t.unreached_func("committed must not fulfill"), t.unreached_func("committed must not reject") ); result.finished.then( t.unreached_func("finished must not fulfill"), t.unreached_func("finished must not reject") ); }; window.assertBothFulfillEntryNotAvailable = async (t, result, w = window) => { assertReturnValue(result, w); // Don't use await here so that we can catch out-of-order settlements. let committedValue; result.committed.then( t.step_func(v => { committedValue = v;}), t.unreached_func("committed must not reject") ); const finishedValue = await result.finished; assert_not_equals(committedValue, undefined, "committed must fulfill before finished"); assert_equals(finishedValue, committedValue, "committed and finished must fulfill with the same value"); assert_true(finishedValue instanceof w.NavigationHistoryEntry, "fulfillment value must be a NavigationHistoryEntry"); }; window.assertBothFulfill = async (t, result, expected, w = window) => { assertReturnValue(result, w); // Don't use await here so that we can catch out-of-order settlements. let committedValue; result.committed.then( t.step_func(v => { committedValue = v; }), t.unreached_func("committed must not reject") ); const finishedValue = await result.finished; assert_not_equals(committedValue, undefined, "committed must fulfill before finished"); assert_equals(finishedValue, committedValue, "committed and finished must fulfill with the same value"); assert_true(finishedValue instanceof w.NavigationHistoryEntry, "fulfillment value must be a NavigationHistoryEntry"); assert_equals(finishedValue, expected); }; window.assertCommittedFulfillsFinishedRejectsExactly = async (t, result, expectedEntry, expectedRejection, w = window) => { assertReturnValue(result, w); // Don't use await here so that we can catch out-of-order settlements. let committedValue; result.committed.then( t.step_func(v => { committedValue = v; }), t.unreached_func("committed must not reject") ); await promise_rejects_exactly(t, expectedRejection, result.finished); assert_not_equals(committedValue, undefined, "committed must fulfill before finished rejects"); assert_true(committedValue instanceof w.NavigationHistoryEntry, "fulfillment value must be a NavigationHistoryEntry"); assert_equals(committedValue, expectedEntry); }; window.assertCommittedFulfillsFinishedRejectsDOM = async (t, result, expectedEntry, expectedDOMExceptionCode, w = window, domExceptionConstructor = w.DOMException, navigationHistoryEntryConstuctor = w.NavigationHistoryEntry) => { assertReturnValue(result, w); let committedValue; result.committed.then( t.step_func(v => { committedValue = v; }), t.unreached_func("committed must not reject") ); await promise_rejects_dom(t, expectedDOMExceptionCode, domExceptionConstructor, result.finished); assert_not_equals(committedValue, undefined, "committed must fulfill before finished rejects"); assert_true(committedValue instanceof navigationHistoryEntryConstuctor, "fulfillment value must be an NavigationHistoryEntry"); assert_equals(committedValue, expectedEntry); }; window.assertBothRejectExactly = async (t, result, expectedRejection, w = window) => { assertReturnValue(result, w); let committedReason, finishedReason; await Promise.all([ result.committed.then( t.unreached_func("committed must not fulfill"), t.step_func(r => { committedReason = r; }) ), result.finished.then( t.unreached_func("finished must not fulfill"), t.step_func(r => { finishedReason = r; }) ) ]); assert_equals(committedReason, finishedReason, "committed and finished must reject with the same value"); assert_equals(expectedRejection, committedReason); }; window.assertBothRejectDOM = async (t, result, expectedDOMExceptionCode, w = window, domExceptionConstructor = w.DOMException) => { assertReturnValue(result, w); // Don't use await here so that we can catch out-of-order settlements. let committedReason, finishedReason; await Promise.all([ result.committed.then( t.unreached_func("committed must not fulfill"), t.step_func(r => { committedReason = r; }) ), result.finished.then( t.unreached_func("finished must not fulfill"), t.step_func(r => { finishedReason = r; }) ) ]); assert_equals(committedReason, finishedReason, "committed and finished must reject with the same value"); assert_throws_dom(expectedDOMExceptionCode, domExceptionConstructor, () => { throw committedReason; }); };