tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>