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>