| <!DOCTYPE html> |
| <html> |
| <head> |
| <style> |
| iframe { |
| display: none; |
| } |
| </style> |
| <script src="../resources/js-test-pre.js"></script> |
| <script> |
| if (window.testRunner) { |
| testRunner.dumpAsText(); |
| testRunner.waitUntilDone(); |
| } |
| |
| function waitFor(target, eventName) { |
| return new Promise((resolve) => { |
| target.addEventListener(eventName, resolve, { once: true }); |
| }); |
| } |
| |
| window.addEventListener("load", async () => { |
| const action = "create-payment-request"; |
| for (const iframe of document.querySelectorAll("iframe")) { |
| iframe.src = iframe.dataset.src; |
| await waitFor(iframe, "load"); |
| const isAllowed = iframe.dataset.enabled === "true"; |
| iframe.contentWindow.postMessage({ action }, "*"); |
| const { data } = await waitFor(window, "message"); |
| const { exceptionMessage, exceptionName, result } = data; |
| |
| const msg = `iframe src: "${iframe.src}" with allow="${ |
| iframe.allow |
| }" ${ |
| isAllowed ? "is allowed to" : "MUST NOT" |
| } create a PaymentRequest. ${exceptionName ?? ""} ${ |
| exceptionMessage ?? "" |
| }`; |
| |
| if (isAllowed) { |
| // ApplePay session doesn't allow remote origins to create PaymentRequests |
| // so we need to distinguish between the two cases. |
| switch (result) { |
| case "payment request created": |
| testPassed(msg); |
| continue; |
| case "threw": |
| // This is ok! policy worked, but ApplePay intervened! |
| if (data.exceptionMessage?.includes("Apple Pay")) { |
| testPassed(msg); |
| continue; |
| } |
| testFailed(msg); |
| continue; |
| default: |
| testFailed(msg); |
| } |
| continue; |
| } |
| |
| if (!isAllowed) { |
| switch (result) { |
| case "payment request created": |
| testFailed(msg); |
| continue; |
| case "threw": |
| // The only legitimate reason for throwing is if the policy |
| // disallowed creating the PaymentRequest. |
| if ( |
| data.exceptionMessage === |
| "Third-party iframes are not allowed to request payments unless explicitly allowed via Feature-Policy (payment)" |
| ) { |
| testPassed(msg); |
| continue; |
| } |
| testFailed(msg); |
| continue; |
| default: |
| testFailed(msg); |
| } |
| } |
| } |
| testRunner.notifyDone(); |
| }); |
| |
| window.addEventListener("error", (ev) => { |
| testFailed(`Unexpected error. Threw exception ${ev.message}.`); |
| testRunner?.notifyDone(); |
| }); |
| </script> |
| </head> |
| <body> |
| <iframe |
| data-enabled="false" |
| data-src="https://localhost:8443/paymentrequest/resources/payment-postmessage.html" |
| ></iframe> |
| <iframe |
| data-enabled="true" |
| data-src="./resources/payment-postmessage.html" |
| ></iframe> |
| <iframe |
| allow="payment" |
| data-enabled="true" |
| data-src="https://localhost:8443/paymentrequest/resources/payment-postmessage.html" |
| ></iframe> |
| <iframe |
| allow="payment" |
| data-enabled="true" |
| data-src="./resources/payment-postmessage.html" |
| ></iframe> |
| <iframe |
| allow="payment *" |
| data-enabled="true" |
| data-src="https://localhost:8443/paymentrequest/resources/payment-postmessage.html" |
| ></iframe> |
| <iframe |
| allow="payment *" |
| data-enabled="true" |
| data-src="./resources/payment-postmessage.html" |
| ></iframe> |
| <iframe |
| allow="payment 'none'" |
| data-enabled="false" |
| data-src="https://localhost:8443/paymentrequest/resources/payment-postmessage.html" |
| ></iframe> |
| <iframe |
| allow="payment 'none'" |
| data-enabled="false" |
| data-src="./resources/payment-postmessage.html" |
| ></iframe> |
| <iframe |
| allow="payment 'self'" |
| data-enabled="false" |
| data-src="https://localhost:8443/paymentrequest/resources/payment-postmessage.html" |
| ></iframe> |
| <iframe |
| allow="payment 'self'" |
| data-enabled="true" |
| data-src="./resources/payment-postmessage.html" |
| ></iframe> |
| <iframe |
| allow="payment https://localhost:8443" |
| data-enabled="true" |
| data-src="https://localhost:8443/paymentrequest/resources/payment-postmessage.html" |
| ></iframe> |
| <iframe |
| allow="payment https://localhost:8443" |
| data-enabled="false" |
| data-src="./resources/payment-postmessage.html" |
| ></iframe> |
| </body> |
| </html> |