| <!DOCTYPE html> |
| <meta charset="utf-8" /> |
| <title>Test cross-origin and same-origin use of setAppBadge</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <body></body> |
| <script> |
| function sendMessage(iframe, data) { |
| return new Promise((resolve) => { |
| window.addEventListener("message", function listener(event) { |
| if (event.data.message !== data.message) return; |
| window.removeEventListener("message", listener); |
| resolve(event); |
| }); |
| iframe.contentWindow.postMessage(data, "*"); |
| }); |
| } |
| |
| function loadIframe(src) { |
| const iframe = document.createElement("iframe"); |
| iframe.src = src; |
| return new Promise((resolve) => { |
| iframe.addEventListener("load", () => resolve(iframe)); |
| document.body.appendChild(iframe); |
| }); |
| } |
| |
| test(() => { |
| assert_true( |
| "setAppBadge" in navigator, |
| "navigator.setAppBadge should be available" |
| ); |
| }, "Test that navigator.setAppBadge is available"); |
| |
| promise_test(async () => { |
| const iframe = await loadIframe( |
| `https://{{hosts[][]}}:{{ports[https][1]}}/badging/resources/setAppBadge_iframe.html` |
| ); |
| const event = await sendMessage(iframe, { message: "callSetAppBadge" }); |
| const { exceptionType, status } = event.data; |
| assert_equals( |
| status, |
| "error", |
| "setAppBadge should have rejected with an error" |
| ); |
| assert_equals( |
| exceptionType, |
| "SecurityError", |
| "setAppBadge should throw a SecurityError when called in a cross-origin iframe" |
| ); |
| iframe.remove(); |
| }, "Test that calling setAppBadge in a cross-origin iframe throws a SecurityError"); |
| |
| promise_test(async () => { |
| const iframe = await loadIframe("./resources/setAppBadge_iframe.html"); |
| const event = await sendMessage(iframe, { message: "callSetAppBadge" }); |
| const { status } = event.data; |
| assert_equals( |
| status, |
| "success", |
| "setAppBadge should succeed when called in a same-origin iframe" |
| ); |
| iframe.remove(); |
| }, "Test that calling setAppBadge in a same-origin iframe succeeds"); |
| |
| promise_test(async () => { |
| const origin = `https://${window.location.hostname}:{{ports[https][1]}}`; |
| const sameOriginDomainURL = new URL( |
| "/badging/resources/setAppBadge_iframe.html", |
| origin |
| ); |
| const iframe = await loadIframe(sameOriginDomainURL); |
| const { origin: domain } = window.location; |
| const data = { message: "callSetAppBadge", domain }; |
| const event = await sendMessage(iframe, data); |
| const { status } = event.data; |
| assert_equals( |
| status, |
| "success", |
| "setAppBadge should succeed when called in a same-origin iframe" |
| ); |
| iframe.remove(); |
| }, "Test that calling setAppBadge in a same origin-domain iframe succeeds"); |
| </script> |