Bug 1141415 - Add expire setting of permission to SpecialPowers. r=jmaher
--- a/testing/mochitest/tests/Harness_sanity/test_SpecialPowersPushPermissions.html
+++ b/testing/mochitest/tests/Harness_sanity/test_SpecialPowersPushPermissions.html
@@ -12,16 +12,21 @@
const ALLOW_ACTION = SpecialPowers.Ci.nsIPermissionManager.ALLOW_ACTION;
const DENY_ACTION = SpecialPowers.Ci.nsIPermissionManager.DENY_ACTION;
const UNKNOWN_ACTION = SpecialPowers.Ci.nsIPermissionManager.UNKNOWN_ACTION;
const PROMPT_ACTION = SpecialPowers.Ci.nsIPermissionManager.PROMPT_ACTION;
const ACCESS_SESSION = SpecialPowers.Ci.nsICookiePermission.ACCESS_SESSION;
const ACCESS_ALLOW_FIRST_PARTY_ONLY = SpecialPowers.Ci.nsICookiePermission.ACCESS_ALLOW_FIRST_PARTY_ONLY;
const ACCESS_LIMIT_THIRD_PARTY = SpecialPowers.Ci.nsICookiePermission.ACCESS_LIMIT_THIRD_PARTY;
+const EXPIRE_TIME = SpecialPowers.Ci.nsIPermissionManager.EXPIRE_TIME;
+var start;
+const DELAY = 1000;
+SimpleTest.requestFlakyTimeout("untriaged");
+
function starttest(){
SpecialPowers.addPermission("pPROMPT", PROMPT_ACTION, document);
SpecialPowers.addPermission("pALLOW", ALLOW_ACTION, document);
SpecialPowers.addPermission("pDENY", DENY_ACTION, document);
SpecialPowers.addPermission("pREMOVE", ALLOW_ACTION, document);
SpecialPowers.addPermission("pSESSION", ACCESS_SESSION, document);
SpecialPowers.addPermission("pFIRSTPARTY", ACCESS_ALLOW_FIRST_PARTY_ONLY, document);
SpecialPowers.addPermission("pTHIRDPARTY", ACCESS_LIMIT_THIRD_PARTY, document);
@@ -131,16 +136,49 @@ function test6() {
setTimeout(test6, 0);
} else if (!SpecialPowers.testPermission('pFIRSTPARTY', UNKNOWN_ACTION, document)) {
dump('/**** pFIRSTPARTY still set ****/\n');
setTimeout(test6, 0);
} else if (!SpecialPowers.testPermission('pTHIRDPARTY', UNKNOWN_ACTION, document)) {
dump('/**** pTHIRDPARTY still set ****/\n');
setTimeout(test6, 0);
} else {
- SimpleTest.finish();
+ test7();
}
}
+
+function test7() {
+ start = Number(Date.now());
+ SpecialPowers.addPermission('pEXPIRE', true, document, EXPIRE_TIME, start + DELAY);
+ testExpiredPermission(test8);
+}
+
+function test8() {
+ start = Number(Date.now());
+ SpecialPowers.pushPermissions([
+ { 'type': 'pEXPIRE',
+ 'allow': true,
+ 'expireType': EXPIRE_TIME,
+ 'expireTime': start + DELAY,
+ 'context': document
+ }], function() {
+ testExpiredPermission(SimpleTest.finish);
+ }
+ );
+}
+
+function testExpiredPermission(callback) {
+ var now = Number(Date.now());
+ if (now < start + DELAY) {
+ ok(SpecialPowers.testPermission('pEXPIRE', ALLOW_ACTION, document), 'unexpired permission is still there');
+ setTimeout(function() {testExpiredPermission(callback)}, DELAY);
+ return;
+ }
+
+ ok(!SpecialPowers.testPermission('pEXPIRE', ALLOW_ACTION, document), 'expired permission is cleared');
+
+ callback();
+}
</script>
</pre>
</body>
</html>
--- a/testing/specialpowers/content/SpecialPowersObserverAPI.js
+++ b/testing/specialpowers/content/SpecialPowersObserverAPI.js
@@ -313,17 +313,17 @@ SpecialPowersObserverAPI.prototype = {
case "SPPermissionManager": {
let msg = aMessage.json;
let secMan = Services.scriptSecurityManager;
let principal = secMan.getAppCodebasePrincipal(this._getURI(msg.url), msg.appId, msg.isInBrowserElement);
switch (msg.op) {
case "add":
- Services.perms.addFromPrincipal(principal, msg.type, msg.permission);
+ Services.perms.addFromPrincipal(principal, msg.type, msg.permission, msg.expireType, msg.expireTime);
break;
case "remove":
Services.perms.removeFromPrincipal(principal, msg.type);
break;
case "has":
let hasPerm = Services.perms.testPermissionFromPrincipal(principal, msg.type);
if (hasPerm == Ci.nsIPermissionManager.ALLOW_ACTION)
return true;
--- a/testing/specialpowers/content/specialpowersAPI.js
+++ b/testing/specialpowers/content/specialpowersAPI.js
@@ -801,24 +801,36 @@ SpecialPowersAPI.prototype = {
if (permission.remove == true)
perm = Ci.nsIPermissionManager.UNKNOWN_ACTION;
if (originalValue == perm) {
continue;
}
- var todo = {'op': 'add', 'type': permission.type, 'permission': perm, 'value': perm, 'url': url, 'appId': appId, 'isInBrowserElement': isInBrowserElement};
+ var todo = {'op': 'add',
+ 'type': permission.type,
+ 'permission': perm,
+ 'value': perm,
+ 'url': url,
+ 'appId': appId,
+ 'isInBrowserElement': isInBrowserElement,
+ 'expireType': (typeof permission.expireType === "number") ?
+ permission.expireType : 0, // default: EXPIRE_NEVER
+ 'expireTime': (typeof permission.expireTime === "number") ?
+ permission.expireTime : 0};
+
+ var cleanupTodo = Object.assign({}, todo);
+
if (permission.remove == true)
todo.op = 'remove';
pendingPermissions.push(todo);
/* Push original permissions value or clear into cleanup array */
- var cleanupTodo = {'op': 'add', 'type': permission.type, 'permission': perm, 'value': perm, 'url': url, 'appId': appId, 'isInBrowserElement': isInBrowserElement};
if (originalValue == Ci.nsIPermissionManager.UNKNOWN_ACTION) {
cleanupTodo.op = 'remove';
} else {
cleanupTodo.value = originalValue;
cleanupTodo.permission = originalValue;
}
cleanupPermissions.push(cleanupTodo);
}
@@ -1861,17 +1873,17 @@ SpecialPowersAPI.prototype = {
url = arg.url;
appId = arg.appId;
isInBrowserElement = arg.isInBrowserElement;
}
return [ url, appId, isInBrowserElement, isSystem ];
},
- addPermission: function(type, allow, arg) {
+ addPermission: function(type, allow, arg, expireType, expireTime) {
let [url, appId, isInBrowserElement, isSystem] = this._getInfoFromPermissionArg(arg);
if (isSystem) {
return; // nothing to do
}
let permission;
if (typeof allow !== 'boolean') {
permission = allow;
@@ -1881,17 +1893,19 @@ SpecialPowersAPI.prototype = {
}
var msg = {
'op': 'add',
'type': type,
'permission': permission,
'url': url,
'appId': appId,
- 'isInBrowserElement': isInBrowserElement
+ 'isInBrowserElement': isInBrowserElement,
+ 'expireType': (typeof expireType === "number") ? expireType : 0,
+ 'expireTime': (typeof expireTime === "number") ? expireTime : 0
};
this._sendSyncMessage('SPPermissionManager', msg);
},
removePermission: function(type, arg) {
let [url, appId, isInBrowserElement, isSystem] = this._getInfoFromPermissionArg(arg);
if (isSystem) {