зеркало из https://github.com/mozilla/gecko-dev.git
168 строки
5.1 KiB
JavaScript
168 строки
5.1 KiB
JavaScript
/* 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/. */
|
|
|
|
const DEBUG = 0;
|
|
function log()
|
|
{
|
|
if (DEBUG) {
|
|
let output = [];
|
|
for (let prop in arguments) {
|
|
output.push(arguments[prop]);
|
|
}
|
|
dump("-*- browser_webapps_permissions test: " + output.join(" ") + "\n");
|
|
}
|
|
}
|
|
|
|
var scope = {};
|
|
Cu.import("resource://gre/modules/PermissionSettings.jsm", scope);
|
|
|
|
var windowMediator = Cc["@mozilla.org/appshell/window-mediator;1"]
|
|
.getService(Ci.nsIWindowMediator);
|
|
|
|
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 = {
|
|
"storage": "unknown",
|
|
"geolocation": "prompt",
|
|
"alarms": "allow",
|
|
"desktop-notification": "allow",
|
|
"audio-channel-normal": "allow"
|
|
};
|
|
|
|
const uninstalledPermsToTest = {
|
|
"geolocation": "unknown",
|
|
"alarms": "unknown",
|
|
"desktop-notification": "unknown",
|
|
"audio-channel-normal": "unknown"
|
|
};
|
|
|
|
var permManager = Cc["@mozilla.org/permissionmanager;1"]
|
|
.getService(Ci.nsIPermissionManager);
|
|
permManager.addFromPrincipal(window.document.nodePrincipal,
|
|
"webapps-manage",
|
|
Ci.nsIPermissionManager.ALLOW_ACTION);
|
|
|
|
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);
|
|
|
|
// The installation may have created a XUL alert window
|
|
// (see notifyInstallSuccess in WebappManager.jsm).
|
|
// It need to be closed before the test finishes.
|
|
var browsers = windowMediator.getEnumerator('alert:alert');
|
|
while (browsers.hasMoreElements()) {
|
|
browsers.getNext().close();
|
|
}
|
|
});
|
|
|
|
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);
|
|
SpecialPowers.addPermission("webapps-manage", true, browser.contentWindow.document);
|
|
|
|
executeSoon(function (){
|
|
gWindow.focus();
|
|
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
|
|
var 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]);
|
|
}
|
|
|
|
// uninstall checks
|
|
uninstallApp();
|
|
};
|
|
|
|
pendingInstall.onerror = function onerror(e)
|
|
{
|
|
ok(false, "install()'s onerror was called: " + e);
|
|
ok(false, "All permission checks failed, uninstal tests were not run");
|
|
};
|
|
});
|
|
}, false);
|
|
}
|
|
|
|
function uninstallApp()
|
|
{
|
|
var browser = gBrowser.selectedBrowser;
|
|
var nav = XPCNativeWrapper.unwrap(browser.contentWindow.navigator);
|
|
var navMozPerms = nav.mozPermissionSettings;
|
|
|
|
var pending = nav.mozApps.getInstalled();
|
|
pending.onsuccess = function onsuccess() {
|
|
var m = this.result;
|
|
for (var i = 0; i < m.length; i++) {
|
|
var app = m[i];
|
|
|
|
function uninstall() {
|
|
var pendingUninstall = nav.mozApps.mgmt.uninstall(app);
|
|
|
|
pendingUninstall.onsuccess = function(r) {
|
|
// test to make sure all permissions have been removed
|
|
function testPerm(aPerm, aAccess)
|
|
{
|
|
var res =
|
|
navMozPerms.get(aPerm, TEST_MANIFEST_URL, TEST_ORIGIN_URL, false);
|
|
is(res, aAccess, "uninstall: " + aPerm + " is " + res);
|
|
}
|
|
|
|
for (let permName in uninstalledPermsToTest) {
|
|
testPerm(permName, uninstalledPermsToTest[permName]);
|
|
}
|
|
|
|
finish();
|
|
};
|
|
|
|
pending.onerror = function _onerror(e) {
|
|
ok(false, e);
|
|
ok(false, "All uninstall() permission checks failed!");
|
|
|
|
finish();
|
|
};
|
|
};
|
|
uninstall();
|
|
}
|
|
};
|
|
}
|
|
|
|
function handlePopup(aEvent)
|
|
{
|
|
aEvent.target.removeEventListener("popupshown", handlePopup, false);
|
|
SpecialPowers.wrap(this).childNodes[0].button.doCommand();
|
|
}
|