<!-- webkit-test-runner [ enableBackForwardCache=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>
