// Test should set these:
// const expectSuccess = {'iframe': bool, 'frame': bool, 'object': bool, 'embed': bool};
// const setAllowPayment = bool;
// const testCrossOrigin = bool;

const tests = {};

window.onmessage = e => {
  const result = e.data;
  const tagName = result.urlQuery;
  const t = tests[tagName];
  t.step(() => {
    if (expectSuccess[tagName]) {
      assert_equals(result.message, "Success");
      if (result.message === "Exception") {
        const [, code, name, stack] = result.details;
        assert_unreached(`Unexpected exception "${name}" (${code}) ${stack}`);
      }
    } else {
      assert_equals(result.message, "Exception");
      const detailsArray = result.details.slice(0,3);
      assert_array_equals(detailsArray, [
        true /*ex instanceof DOMException*/,
        DOMException.SECURITY_ERR /*ex.code*/,
        "SecurityError" /*ex.name*/,
      ]);
    }
    t.done();
  });
};

["iframe", "frame", "object", "embed"].forEach((tagName, i) => {
  tests[tagName] = async_test(t => {
    const elm = document.createElement(tagName);
    if (setAllowPayment) {
      elm.setAttribute("allow", "payment");
    }
    const path = location.pathname.substring(
      0,
      location.pathname.lastIndexOf("/") + 1
    );
    const url =
      (testCrossOrigin ? "https://{{domains[www1]}}:{{ports[https][0]}}" : "") +
      path +
      "echo-PaymentRequest.html?" +
      tagName;
    if (tagName === "object") {
      elm.data = url;
    } else {
      elm.src = url;
    }
    elm.onload = t.step_func(() => {
      window[i].postMessage(
        "What is the result of new PaymentRequest(...)?",
        "*"
      );
    });
    elm.onerror = t.unreached_func("elm.onerror");
    document.body.appendChild(elm);
  }, tagName);
});
