blob: dd7dad3ad8611b71638ea4f834fb2e6d873c49b1 [file] [log] [blame] [edit]
<!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>