<!-- webkit-test-runner [ UsesBackForwardCache=true ] -->
<!DOCTYPE html>
<html>
<body>
<script src='/js-test-resources/js-test.js'></script>
<script src='/js-test-resources/ui-helper.js'></script>
<script src='/resources/payment-request.js'></script>
<script>
description('Tests that a page with a PaymentResponse in the Created state goes into the back/forward cache.');
window.jsTestIsAsync = true;

window.addEventListener('pageshow', async function(event) {
    debug('pageshow - ' + (event.persisted ? '' : 'not ') + 'from cache');

    if (!event.persisted)
        return;

    testPassed('Page did enter and was restored from the back/forward cache');

    debug('Testing that PaymentResponse is now in the Closed state.');
    await shouldRejectWithErrorName('response.complete()', 'AbortError');
    await shouldRejectWithErrorName('response.retry()', 'AbortError');

    finishJSTest();
}, false);

window.addEventListener('pagehide', function(event) {
    debug('pagehide - ' + (event.persisted ? '' : 'not ') + 'entering cache');

    if (event.persisted)
        return;

    testFailed('Page failed to enter the back/forward cache.');
    finishJSTest();
}, false);

window.addEventListener('load', function() {
    UIHelper.withUserGesture(async function() {
        debug('Creating a PaymentResponse in the Created state.');

        const request = new PaymentRequest([validPaymentMethod()], validPaymentDetails());
        const responsePromise = request.show();
        internals.mockPaymentCoordinator.acceptPayment();
        response = await responsePromise;

        setTimeout(function() {
            window.location.href = '/navigation/resources/page-cache-helper.html';
        }, 0);
    });
}, false);
</script>
</body>
</html>
