1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/tests/browser/browser_webapps_permissions.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,167 @@ 1.4 +/* vim:set ts=2 sw=2 sts=2 et: */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +const DEBUG = 0; 1.10 +function log() 1.11 +{ 1.12 + if (DEBUG) { 1.13 + let output = []; 1.14 + for (let prop in arguments) { 1.15 + output.push(arguments[prop]); 1.16 + } 1.17 + dump("-*- browser_webapps_permissions test: " + output.join(" ") + "\n"); 1.18 + } 1.19 +} 1.20 + 1.21 +let scope = {}; 1.22 +Cu.import("resource://gre/modules/PermissionSettings.jsm", scope); 1.23 + 1.24 +var windowMediator = Cc["@mozilla.org/appshell/window-mediator;1"] 1.25 + .getService(Ci.nsIWindowMediator); 1.26 + 1.27 +const TEST_URL = 1.28 + "http://mochi.test:8888/browser/dom/tests/browser/test-webapps-permissions.html"; 1.29 +const TEST_MANIFEST_URL = 1.30 + "http://mochi.test:8888/browser/dom/tests/browser/test-webapp.webapp"; 1.31 +const TEST_ORIGIN_URL = "http://mochi.test:8888"; 1.32 + 1.33 +const installedPermsToTest = { 1.34 + "storage": "unknown", 1.35 + "geolocation": "prompt", 1.36 + "alarms": "allow", 1.37 + "desktop-notification": "allow", 1.38 + "audio-channel-normal": "allow" 1.39 +}; 1.40 + 1.41 +const uninstalledPermsToTest = { 1.42 + "geolocation": "unknown", 1.43 + "alarms": "unknown", 1.44 + "desktop-notification": "unknown", 1.45 + "audio-channel-normal": "unknown" 1.46 +}; 1.47 + 1.48 +var permManager = Cc["@mozilla.org/permissionmanager;1"] 1.49 + .getService(Ci.nsIPermissionManager); 1.50 +permManager.addFromPrincipal(window.document.nodePrincipal, 1.51 + "webapps-manage", 1.52 + Ci.nsIPermissionManager.ALLOW_ACTION); 1.53 + 1.54 +var gWindow, gNavigator; 1.55 + 1.56 +function test() { 1.57 + waitForExplicitFinish(); 1.58 + 1.59 + var tab = gBrowser.addTab(TEST_URL); 1.60 + gBrowser.selectedTab = tab; 1.61 + var browser = gBrowser.selectedBrowser; 1.62 + PopupNotifications.panel.addEventListener("popupshown", handlePopup, false); 1.63 + 1.64 + registerCleanupFunction(function () { 1.65 + gWindow = null; 1.66 + gBrowser.removeTab(tab); 1.67 + 1.68 + // The installation may have created a XUL alert window 1.69 + // (see notifyInstallSuccess in WebappManager.jsm). 1.70 + // It need to be closed before the test finishes. 1.71 + var browsers = windowMediator.getEnumerator('alert:alert'); 1.72 + while (browsers.hasMoreElements()) { 1.73 + browsers.getNext().close(); 1.74 + } 1.75 + }); 1.76 + 1.77 + browser.addEventListener("DOMContentLoaded", function onLoad(event) { 1.78 + browser.removeEventListener("DOMContentLoaded", onLoad, false); 1.79 + gWindow = browser.contentWindow; 1.80 + 1.81 + SpecialPowers.setBoolPref("dom.mozPermissionSettings.enabled", true); 1.82 + SpecialPowers.addPermission("permissions", true, browser.contentWindow.document); 1.83 + SpecialPowers.addPermission("permissions", true, browser.contentDocument); 1.84 + SpecialPowers.addPermission("webapps-manage", true, browser.contentWindow.document); 1.85 + 1.86 + executeSoon(function (){ 1.87 + gWindow.focus(); 1.88 + var nav = XPCNativeWrapper.unwrap(browser.contentWindow.navigator); 1.89 + ok(nav.mozApps, "we have a mozApps property"); 1.90 + var navMozPerms = nav.mozPermissionSettings; 1.91 + ok(navMozPerms, "mozPermissions is available"); 1.92 + 1.93 + // INSTALL app 1.94 + var pendingInstall = nav.mozApps.install(TEST_MANIFEST_URL, null); 1.95 + pendingInstall.onsuccess = function onsuccess() 1.96 + { 1.97 + ok(this.result, "we have a result: " + this.result); 1.98 + 1.99 + function testPerm(aPerm, aAccess) 1.100 + { 1.101 + var res = 1.102 + navMozPerms.get(aPerm, TEST_MANIFEST_URL, TEST_ORIGIN_URL, false); 1.103 + is(res, aAccess, "install: " + aPerm + " is " + res); 1.104 + } 1.105 + 1.106 + for (let permName in installedPermsToTest) { 1.107 + testPerm(permName, installedPermsToTest[permName]); 1.108 + } 1.109 + 1.110 + // uninstall checks 1.111 + uninstallApp(); 1.112 + }; 1.113 + 1.114 + pendingInstall.onerror = function onerror(e) 1.115 + { 1.116 + ok(false, "install()'s onerror was called: " + e); 1.117 + ok(false, "All permission checks failed, uninstal tests were not run"); 1.118 + }; 1.119 + }); 1.120 + }, false); 1.121 +} 1.122 + 1.123 +function uninstallApp() 1.124 +{ 1.125 + var browser = gBrowser.selectedBrowser; 1.126 + var nav = XPCNativeWrapper.unwrap(browser.contentWindow.navigator); 1.127 + var navMozPerms = nav.mozPermissionSettings; 1.128 + 1.129 + var pending = nav.mozApps.getInstalled(); 1.130 + pending.onsuccess = function onsuccess() { 1.131 + var m = this.result; 1.132 + for (var i = 0; i < m.length; i++) { 1.133 + var app = m[i]; 1.134 + 1.135 + function uninstall() { 1.136 + var pendingUninstall = nav.mozApps.mgmt.uninstall(app); 1.137 + 1.138 + pendingUninstall.onsuccess = function(r) { 1.139 + // test to make sure all permissions have been removed 1.140 + function testPerm(aPerm, aAccess) 1.141 + { 1.142 + var res = 1.143 + navMozPerms.get(aPerm, TEST_MANIFEST_URL, TEST_ORIGIN_URL, false); 1.144 + is(res, aAccess, "uninstall: " + aPerm + " is " + res); 1.145 + } 1.146 + 1.147 + for (let permName in uninstalledPermsToTest) { 1.148 + testPerm(permName, uninstalledPermsToTest[permName]); 1.149 + } 1.150 + 1.151 + finish(); 1.152 + }; 1.153 + 1.154 + pending.onerror = function _onerror(e) { 1.155 + ok(false, e); 1.156 + ok(false, "All uninstall() permission checks failed!"); 1.157 + 1.158 + finish(); 1.159 + }; 1.160 + }; 1.161 + uninstall(); 1.162 + } 1.163 + }; 1.164 +} 1.165 + 1.166 +function handlePopup(aEvent) 1.167 +{ 1.168 + aEvent.target.removeEventListener("popupshown", handlePopup, false); 1.169 + SpecialPowers.wrap(this).childNodes[0].button.doCommand(); 1.170 +}