<!DOCTYPE html>
<meta charset=utf-8>
<link rel="help" href="https://w3c.github.io/web-based-payment-handler/">
<title>Test for untrusted event</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
<script>

async function getResultFromSW(serviceWorkerContainer) {
  return new Promise((resolve, reject) => {
    serviceWorkerContainer.addEventListener('message', listener = e => {
      serviceWorkerContainer.removeEventListener('message', listener);
      if (e.data) {
        resolve(e.data);
      } else {
        reject();
      }
    });
  });
}

promise_test(async t => {
  const registration = await service_worker_unregister_and_register(
      t, 'untrusted-event.js', 'payment-app/');
  await wait_for_state(t, registration.installing, 'activated');

  const controlled_window = (await with_iframe('payment-app/payment.html')).contentWindow;

  // Test for untrusted PaymentRequestEvent
  {
    const result = getResultFromSW(controlled_window.navigator.serviceWorker);
    controlled_window.navigator.serviceWorker.controller.postMessage('paymentrequest');

    const expected = [
      "InvalidStateError", /* respondWith */
      "InvalidStateError"  /* openWindow */
    ];

    assert_array_equals(await result, expected);
  }

  // Test for untrusted CanMakePaymentEvent
  {
    const result = getResultFromSW(controlled_window.navigator.serviceWorker);
    controlled_window.navigator.serviceWorker.controller.postMessage('canmakepayment');

    const expected = [
      "InvalidStateError", /* respondWith */
    ];

    assert_array_equals(await result, expected);
  }
});

</script>
