<!DOCTYPE html>
<title>Payment request delegation test</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>

<div>
  Verifies that PaymentRequest.show() call from a cross-origin subframe without user activation
  works if and only if the top frame has user activation and it delegates the capability to the
  subframe.
</div>

<iframe allow="payment" width="300px" height="50px"
        src="https://{{hosts[alt][www]}}:{{ports[https][0]}}/payment-request/resources/delegate-request-subframe.sub.html">
</iframe>

<script>
  // Returns a |Promise| that gets resolved with |event.data| when |window|
  // receives from |source| a "message" event whose |event.data.type| matches the string
  // |message_data_type|.
  function getMessageData(message_data_type, source) {
      return new Promise(resolve => {
          function waitAndRemove(e) {
              if (e.source != source || !e.data || e.data.type != message_data_type)
                  return;
              window.removeEventListener("message", waitAndRemove);
              resolve(e.data);
          }
          window.addEventListener("message", waitAndRemove);
      });
  }

  promise_setup(async () => {
      // Make sure the iframe has loaded.
      await getMessageData("subframe-loaded", frames[0]);
  });

  const target_origin = "https://{{hosts[alt][www]}}:{{ports[https][0]}}";
  const request = {"type": "make-payment-request"};

  promise_test(async () => {
      let result_promise = getMessageData("result", frames[0]);
      frames[0].postMessage(request, {targetOrigin: target_origin});
      let data = await result_promise;

      assert_equals(data.result, "failure");
  }, "Payment-request from a subframe fails without delegation when the top frame has no user activation");

  promise_test(async () => {
      let result_promise = getMessageData("result", frames[0]);
      await test_driver.bless();
      frames[0].postMessage(request, {targetOrigin: target_origin});
      let data = await result_promise;

      assert_equals(data.result, "failure");
  }, "Payment-request from a subframe fails without delegation when the top frame has user activation");

  promise_test(async () => {
      let result_promise = getMessageData("result", frames[0]);
      await test_driver.bless();
      frames[0].postMessage(request, {targetOrigin: target_origin,
                                      delegate: "payment"});
      let data = await result_promise;

      assert_equals(data.result, "success");
  }, "Payment-request from a subframe succeeds with delegation when the top frame has user activation");

  // This test must follow the successful test case above so that the user activation state there
  // gets consumed.
  promise_test(async () => {
      let result_promise = getMessageData("result", frames[0]);
      frames[0].postMessage(request, {targetOrigin: target_origin,
                                      delegate: "payment"});
      let data = await result_promise;

      assert_equals(data.result, "failure");
  }, "Payment-request from a subframe fails with delegation when the top frame has no user activation");

</script>
