diff -r 000000000000 -r 6474c204b198 dom/tests/browser/browser_webapps_perms_reinstall.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/tests/browser/browser_webapps_perms_reinstall.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,178 @@ +/* vim:set ts=2 sw=2 sts=2 et: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +let scope = {}; +Cu.import("resource://gre/modules/PermissionSettings.jsm", scope); + +const TEST_URL = + "http://mochi.test:8888/browser/dom/tests/browser/test-webapps-permissions.html"; +const TEST_MANIFEST_URL = + "http://mochi.test:8888/browser/dom/tests/browser/test-webapp.webapp"; +const TEST_ORIGIN_URL = "http://mochi.test:8888"; + +const installedPermsToTest = { + "geolocation": "prompt", + "alarms": "allow", + "contacts": "deny", + "device-storage:apps": "deny", +}; + +const reinstalledPermsToTest = { + "geolocation": "prompt", + "alarms": "unknown", + "contacts": "deny", + "device-storage:apps": "deny", +}; + +var gWindow, gNavigator; + +function test() { + waitForExplicitFinish(); + + var tab = gBrowser.addTab(TEST_URL); + gBrowser.selectedTab = tab; + var browser = gBrowser.selectedBrowser; + PopupNotifications.panel.addEventListener("popupshown", handlePopup, false); + + registerCleanupFunction(function () { + gWindow = null; + gBrowser.removeTab(tab); + }); + + browser.addEventListener("DOMContentLoaded", function onLoad(event) { + browser.removeEventListener("DOMContentLoaded", onLoad, false); + gWindow = browser.contentWindow; + SpecialPowers.setBoolPref("dom.mozPermissionSettings.enabled", true); + SpecialPowers.addPermission("permissions", true, browser.contentWindow.document); + SpecialPowers.addPermission("permissions", true, browser.contentDocument); + + let pendingInstall; + + function testInstall() { + var nav = XPCNativeWrapper.unwrap(browser.contentWindow.navigator); + ok(nav.mozApps, "we have a mozApps property"); + var navMozPerms = nav.mozPermissionSettings; + ok(navMozPerms, "mozPermissions is available"); + + // INSTALL app + pendingInstall = nav.mozApps.install(TEST_MANIFEST_URL, null); + pendingInstall.onsuccess = function onsuccess() + { + ok(this.result, "we have a result: " + this.result); + function testPerm(aPerm, aAccess) + { + var res = + navMozPerms.get(aPerm, TEST_MANIFEST_URL, TEST_ORIGIN_URL, false); + is(res, aAccess, "install: " + aPerm + " is " + res); + } + + for (let permName in installedPermsToTest) { + testPerm(permName, installedPermsToTest[permName]); + } + + writeUpdatesToWebappManifest(); + }; + + pendingInstall.onerror = function onerror(e) + { + ok(false, "install()'s onerror was called: " + e); + ok(false, "All permission checks failed, reinstall tests were not run"); + }; + } + testInstall(); + }, false); +} + +function reinstallApp() +{ + var browser = gBrowser.selectedBrowser; + var nav = XPCNativeWrapper.unwrap(browser.contentWindow.navigator); + var navMozPerms = nav.mozPermissionSettings; + + var pendingReinstall = nav.mozApps.install(TEST_MANIFEST_URL); + pendingReinstall.onsuccess = function onsuccess() + { + ok(this.result, "we have a result: " + this.result); + + function testPerm(aPerm, aAccess) + { + var res = + navMozPerms.get(aPerm, TEST_MANIFEST_URL, TEST_ORIGIN_URL, false); + is(res, aAccess, "reinstall: " + aPerm + " is " + res); + } + + for (let permName in reinstalledPermsToTest) { + testPerm(permName, reinstalledPermsToTest[permName]); + } + writeUpdatesToWebappManifest(); + finish(); + }; +}; + +var qtyPopups = 0; + +function handlePopup(aEvent) +{ + qtyPopups++; + if (qtyPopups == 2) { + aEvent.target.removeEventListener("popupshown", handlePopup, false); + } + SpecialPowers.wrap(this).childNodes[0].button.doCommand(); +} + +function writeUpdatesToWebappManifest(aRestore) +{ + let newfile = Cc["@mozilla.org/file/directory_service;1"]. + getService(Ci.nsIProperties). + get("XCurProcD", Ci.nsIFile); + + let devPath = ["_tests", "testing", "mochitest", + "browser", "dom" , "tests", "browser"]; + // make package-tests moves tests to: + // dist/test-package-stage/mochitest/browser/dom/tests/browser + let slavePath = ["dist", "test-package-stage", "mochitest", + "browser", "dom", "tests", "browser"]; + + newfile = newfile.parent; // up to dist/ + newfile = newfile.parent;// up to obj-dir/ + + info(newfile.path); + try { + for (let idx in devPath) { + newfile.append(devPath[idx]); + if (!newfile.isDirectory()) { + info("*** NOT RUNNING ON DEV MACHINE\n\n"); + throw new Error("Test is not running on dev machine, try dev path"); + } + } + } + catch (ex) { + info(ex + "\n\n"); + for (let idx in slavePath) { + newfile.append(slavePath[idx]); + if (!newfile.isDirectory()) { + info("*** NOT RUNNING ON BUILD SLAVE\n\n"); + throw new Error("Test is not running on slave machine, abort test"); + } + } + } + + info("Final path: " + newfile.path); + + if (aRestore) { + newfile.append("test-webapp-original.webapp"); + } else { + newfile.append("test-webapp-reinstall.webapp"); + } + + let oldfile = newfile.parent; + oldfile.append("test-webapp.webapp"); + + newfile.copyTo(null, "test-webapp.webapp"); + + if (!aRestore) { + executeSoon(function (){ reinstallApp(); }); + } +}