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