dom/tests/browser/browser_webapps_permissions.js

changeset 0
6474c204b198
     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 +}

mercurial