tor-browser

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

test_permissions_api.html (5240B)


      1 <!--
      2  Any copyright is dedicated to the Public Domain.
      3  http://creativecommons.org/publicdomain/zero/1.0/
      4 -->
      5 <!DOCTYPE HTML>
      6 <html>
      7 
      8 <head>
      9  <meta charset="utf-8">
     10  <title>Test for Permissions API</title>
     11  <script src="/tests/SimpleTest/SimpleTest.js"></script>
     12  <link rel="stylesheet" href="/tests/SimpleTest/test.css">
     13 </head>
     14 
     15 <body>
     16  <pre id="test"></pre>
     17  <script type="application/javascript">
     18  "use strict";
     19 
     20  const {
     21    UNKNOWN_ACTION,
     22    PROMPT_ACTION,
     23    ALLOW_ACTION,
     24    DENY_ACTION,
     25  } = SpecialPowers.Ci.nsIPermissionManager;
     26 
     27  SimpleTest.waitForExplicitFinish();
     28 
     29  const PERMISSIONS = [{
     30    name: "geolocation",
     31    type: "geo",
     32  }, {
     33    name: "notifications",
     34    type: "desktop-notification",
     35  }, {
     36    name: "push",
     37    type: "desktop-notification",
     38  }, {
     39    name: "persistent-storage",
     40    type: "persistent-storage",
     41  }, {
     42    name: "midi",
     43    type: "midi",
     44  } ];
     45 
     46  const UNSUPPORTED_PERMISSIONS = [
     47    "foobarbaz", // Not in spec, for testing only.
     48  ];
     49 
     50  // Create a closure, so that tests are run on the correct window object.
     51  function createPermissionTester(aWindow) {
     52    return {
     53      setPermissions(allow) {
     54        const permissions = PERMISSIONS.map(({ type }) => {
     55          return {
     56            type,
     57            allow,
     58            "context": aWindow.document,
     59          };
     60        });
     61        return new Promise((resolve) => {
     62          SpecialPowers.popPermissions(() => {
     63            SpecialPowers.pushPermissions(permissions, resolve);
     64          });
     65        });
     66      },
     67      checkPermissions(state) {
     68        const promisesToQuery = PERMISSIONS.map(({ name }) => {
     69          return aWindow.navigator.permissions
     70            .query({ name })
     71            .then(
     72              () => is(state, state, `correct state for '${name}'`),
     73              () => ok(false, `query should not have rejected for '${name}'`)
     74            );
     75          });
     76        return Promise.all(promisesToQuery);
     77      },
     78      checkUnsupportedPermissions() {
     79        const promisesToQuery = UNSUPPORTED_PERMISSIONS.map(({ name }) => {
     80          return aWindow.navigator.permissions
     81            .query({ name })
     82            .then(
     83              () => ok(false, `query should not have resolved for '${name}'`),
     84              error => {
     85                is(error.name, "TypeError",
     86                  `query should have thrown TypeError for '${name}'`);
     87              }
     88            );
     89          });
     90        return Promise.all(promisesToQuery);
     91      },
     92      promiseStateChanged(name, state) {
     93        return aWindow.navigator.permissions
     94          .query({ name })
     95          .then(status => {
     96            return new Promise( resolve => {
     97              status.onchange = () => {
     98                status.onchange = null;
     99                is(status.state, state, `state changed for '${name}'`);
    100                resolve();
    101              };
    102            });
    103          },
    104          () => ok(false, `query should not have rejected for '${name}'`));
    105      },
    106      testStatusOnChange() {
    107        return new Promise((resolve) => {
    108          SpecialPowers.popPermissions(() => {
    109            const permission = "geolocation";
    110            const promiseGranted = this.promiseStateChanged(permission, "granted");
    111            this.setPermissions(ALLOW_ACTION);
    112            promiseGranted.then(async () => {
    113              const promisePrompt = this.promiseStateChanged(permission, "prompt");
    114              await SpecialPowers.popPermissions();
    115              return promisePrompt;
    116            }).then(resolve);
    117          });
    118        });
    119      },
    120      testInvalidQuery() {
    121        return aWindow.navigator.permissions
    122          .query({ name: "invalid" })
    123          .then(
    124            () => ok(false, "invalid query should not have resolved"),
    125            () => ok(true, "invalid query should have rejected")
    126          );
    127      },
    128    };
    129  }
    130 
    131  function enablePrefs() {
    132    const ops = {
    133      "set": [
    134        ["privacy.firstparty.isolate", true],
    135      ],
    136    };
    137    return SpecialPowers.pushPrefEnv(ops);
    138  }
    139 
    140  function createIframe() {
    141    return new Promise((resolve) => {
    142      const iframe = document.createElement("iframe");
    143      iframe.src = "file_empty.html";
    144      iframe.onload = () => resolve(iframe.contentWindow);
    145      document.body.appendChild(iframe);
    146    });
    147  }
    148 
    149  window.onload = () => {
    150    enablePrefs()
    151      .then(createIframe)
    152      .then(createPermissionTester)
    153      .then((tester) => {
    154        return tester
    155          .checkUnsupportedPermissions()
    156          .then(() => tester.setPermissions(UNKNOWN_ACTION))
    157          .then(() => tester.checkPermissions("prompt"))
    158          .then(() => tester.setPermissions(PROMPT_ACTION))
    159          .then(() => tester.checkPermissions("prompt"))
    160          .then(() => tester.setPermissions(ALLOW_ACTION))
    161          .then(() => tester.checkPermissions("granted"))
    162          .then(() => tester.setPermissions(DENY_ACTION))
    163          .then(() => tester.checkPermissions("denied"))
    164          .then(() => tester.testStatusOnChange())
    165          .then(() => tester.testInvalidQuery())
    166      })
    167      .then(SimpleTest.finish)
    168      .catch((e) => {
    169        ok(false, `Unexpected error ${e}`);
    170        SimpleTest.finish();
    171      });
    172  };
    173  </script>
    174 </body>
    175 
    176 </html>