dom/tests/browser/browser_webapps_permissions.js

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /* vim:set ts=2 sw=2 sts=2 et: */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 const DEBUG = 0;
     7 function log()
     8 {
     9   if (DEBUG) {
    10     let output = [];
    11     for (let prop in arguments) {
    12       output.push(arguments[prop]);
    13     }
    14     dump("-*- browser_webapps_permissions test: " + output.join(" ") + "\n");
    15   }
    16 }
    18 let scope = {};
    19 Cu.import("resource://gre/modules/PermissionSettings.jsm", scope);
    21 var windowMediator = Cc["@mozilla.org/appshell/window-mediator;1"]
    22                      .getService(Ci.nsIWindowMediator);
    24 const TEST_URL =
    25   "http://mochi.test:8888/browser/dom/tests/browser/test-webapps-permissions.html";
    26 const TEST_MANIFEST_URL =
    27   "http://mochi.test:8888/browser/dom/tests/browser/test-webapp.webapp";
    28 const TEST_ORIGIN_URL = "http://mochi.test:8888";
    30 const installedPermsToTest = {
    31   "storage": "unknown",
    32   "geolocation": "prompt",
    33   "alarms": "allow",
    34   "desktop-notification": "allow",
    35   "audio-channel-normal": "allow"
    36 };
    38 const uninstalledPermsToTest = {
    39   "geolocation": "unknown",
    40   "alarms": "unknown",
    41   "desktop-notification": "unknown",
    42   "audio-channel-normal": "unknown"
    43 };
    45 var permManager = Cc["@mozilla.org/permissionmanager;1"]
    46                     .getService(Ci.nsIPermissionManager);
    47 permManager.addFromPrincipal(window.document.nodePrincipal,
    48                              "webapps-manage",
    49                              Ci.nsIPermissionManager.ALLOW_ACTION);
    51 var gWindow, gNavigator;
    53 function test() {
    54   waitForExplicitFinish();
    56   var tab = gBrowser.addTab(TEST_URL);
    57   gBrowser.selectedTab = tab;
    58   var browser = gBrowser.selectedBrowser;
    59   PopupNotifications.panel.addEventListener("popupshown", handlePopup, false);
    61   registerCleanupFunction(function () {
    62     gWindow = null;
    63     gBrowser.removeTab(tab);
    65     // The installation may have created a XUL alert window
    66     // (see notifyInstallSuccess in WebappManager.jsm).
    67     // It need to be closed before the test finishes.
    68     var browsers = windowMediator.getEnumerator('alert:alert');
    69       while (browsers.hasMoreElements()) {
    70       browsers.getNext().close();
    71     }
    72   });
    74   browser.addEventListener("DOMContentLoaded", function onLoad(event) {
    75     browser.removeEventListener("DOMContentLoaded", onLoad, false);
    76     gWindow = browser.contentWindow;
    78     SpecialPowers.setBoolPref("dom.mozPermissionSettings.enabled", true);
    79     SpecialPowers.addPermission("permissions", true, browser.contentWindow.document);
    80     SpecialPowers.addPermission("permissions", true, browser.contentDocument);
    81     SpecialPowers.addPermission("webapps-manage", true, browser.contentWindow.document);
    83     executeSoon(function (){
    84       gWindow.focus();
    85       var nav = XPCNativeWrapper.unwrap(browser.contentWindow.navigator);
    86       ok(nav.mozApps, "we have a mozApps property");
    87       var navMozPerms = nav.mozPermissionSettings;
    88       ok(navMozPerms, "mozPermissions is available");
    90       // INSTALL app
    91       var pendingInstall = nav.mozApps.install(TEST_MANIFEST_URL, null);
    92       pendingInstall.onsuccess = function onsuccess()
    93       {
    94         ok(this.result, "we have a result: " + this.result);
    96         function testPerm(aPerm, aAccess)
    97         {
    98           var res =
    99             navMozPerms.get(aPerm, TEST_MANIFEST_URL, TEST_ORIGIN_URL, false);
   100           is(res, aAccess, "install: " + aPerm + " is " + res);
   101         }
   103         for (let permName in installedPermsToTest) {
   104           testPerm(permName, installedPermsToTest[permName]);
   105         }
   107         // uninstall checks
   108         uninstallApp();
   109       };
   111       pendingInstall.onerror = function onerror(e)
   112       {
   113         ok(false, "install()'s onerror was called: " + e);
   114         ok(false, "All permission checks failed, uninstal tests were not run");
   115       };
   116     });
   117   }, false);
   118 }
   120 function uninstallApp()
   121 {
   122   var browser = gBrowser.selectedBrowser;
   123   var nav = XPCNativeWrapper.unwrap(browser.contentWindow.navigator);
   124   var navMozPerms = nav.mozPermissionSettings;
   126   var pending = nav.mozApps.getInstalled();
   127   pending.onsuccess = function onsuccess() {
   128     var m = this.result;
   129     for (var i = 0; i < m.length; i++) {
   130       var app = m[i];
   132       function uninstall() {
   133         var pendingUninstall = nav.mozApps.mgmt.uninstall(app);
   135         pendingUninstall.onsuccess = function(r) {
   136           // test to make sure all permissions have been removed
   137           function testPerm(aPerm, aAccess)
   138           {
   139             var res =
   140               navMozPerms.get(aPerm, TEST_MANIFEST_URL, TEST_ORIGIN_URL, false);
   141             is(res, aAccess, "uninstall: " + aPerm + " is " + res);
   142           }
   144           for (let permName in uninstalledPermsToTest) {
   145             testPerm(permName, uninstalledPermsToTest[permName]);
   146           }
   148           finish();
   149         };
   151         pending.onerror = function _onerror(e) {
   152           ok(false, e);
   153           ok(false, "All uninstall() permission checks failed!");
   155           finish();
   156         };
   157       };
   158       uninstall();
   159     }
   160   };
   161 }
   163 function handlePopup(aEvent)
   164 {
   165   aEvent.target.removeEventListener("popupshown", handlePopup, false);
   166   SpecialPowers.wrap(this).childNodes[0].button.doCommand();
   167 }

mercurial