1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
|
<!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 callMethodThroughIframe(iframe, data) {
return new Promise((resolve) => {
window.addEventListener("message", function listener(event) {
if (event.data.method !== data.method) return;
window.removeEventListener("message", listener);
resolve(event);
});
iframe.postMessage(data, "*");
});
}
function loadIframe(src) {
const iframe = document.createElement("iframe");
return new Promise((resolve) => {
window.addEventListener("message", function readyListener(ev) {
if (ev.data === "ready") {
window.removeEventListener("message", readyListener);
resolve(iframe);
}
});
iframe.src = src;
document.body.appendChild(iframe);
});
}
promise_test(async () => {
const iframe = await loadIframe(
`https://{{hosts[][]}}:{{ports[https][1]}}/badging/resources/badge_iframe.html`
);
const event = await callMethodThroughIframe(iframe, {
method: "setAppBadge",
value: 1,
});
const { exceptionType } = event.data;
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(
`https://{{hosts[][]}}:{{ports[https][1]}}/badging/resources/badge_iframe.html`
);
const event = await callMethodThroughIframe(iframe, {
method: "clearAppBadge",
});
assert_equals(
event.data.exceptionType,
"SecurityError",
"clearAppBadge should throw a SecurityError when called in a cross-origin iframe"
);
iframe.remove();
}, "Test that calling clearAppBadge in a cross-origin iframe throws a SecurityError");
promise_test(async () => {
const iframe = await loadIframe("./resources/badge_iframe.html");
const event = await callMethodThroughIframe(iframe, {
method: "setAppBadge",
value: 1,
});
assert_equals(
event.data.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 iframe = await loadIframe("./resources/badge_iframe.html");
const event = await callMethodThroughIframe(iframe, {
method: "clearAppBadge",
});
assert_equals(
event.data.status,
"success",
"clearAppBadge should succeed when called in a same-origin iframe"
);
iframe.remove();
}, "Test that calling clearAppBadge in a same-origin iframe succeeds");
promise_test(async () => {
// Set badge on top level frame
await navigator.setAppBadge(1);
// Load same-origin iframe
const iframe = await loadIframe("./resources/badge_iframe.html");
// Set badge in iframe
let event = await callMethodThroughIframe(iframe, {
method: "setAppBadge",
value: 1,
});
assert_equals(
event.data.status,
"success",
"setAppBadge should succeed when called in a same-origin iframe"
);
// Clear badge in iframe
event = await callMethodThroughIframe(iframe, {
method: "clearAppBadge",
});
assert_equals(
event.data.status,
"success",
"clearAppBadge should succeed when called in a same-origin iframe"
);
iframe.remove();
}, "Test calling setAppBadge and clearAppBadge in a same-origin iframe after setting badge on the top level frame");
promise_test(async () => {
// Load two same-origin iframes
const iframe1 = await loadIframe("./resources/badge_iframe.html");
const iframe2 = await loadIframe("./resources/badge_iframe.html");
// Set badge in the first iframe
let event1 = await callMethodThroughIframe(iframe1, {
method: "setAppBadge",
value: 1,
});
assert_equals(
event1.data.status,
"success",
"setAppBadge should succeed when called in the first same-origin iframe"
);
// Set badge in the second iframe
let event2 = await callMethodThroughIframe(iframe2, {
method: "setAppBadge",
value: 2,
});
assert_equals(
event2.data.status,
"success",
"setAppBadge should succeed when called in the second same-origin iframe"
);
// Clear badge in the first iframe
event1 = await callMethodThroughIframe(iframe1, {
method: "clearAppBadge",
});
assert_equals(
event1.data.status,
"success",
"clearAppBadge should succeed when called in the first same-origin iframe"
);
iframe1.remove();
iframe2.remove();
}, "Test badge behavior in multiple same-origin iframes");
</script>
|