220 lines
7.1 KiB
JavaScript
220 lines
7.1 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
const TEST_URI = Services.io.newURI("http://example.com");
|
|
const TEST_PERMISSION = "test/oastrip";
|
|
const TEST_PERMISSION2 = "test/oastrip2";
|
|
const TEST_PERMISSION3 = "test/oastrip3";
|
|
|
|
// List of permissions which are not isolated by private browsing or user context
|
|
// as per array kStripOAPermissions in PermissionManager.cpp
|
|
const STRIPPED_PERMS = ["cookie", "https-only-load-insecure"];
|
|
|
|
let principal = Services.scriptSecurityManager.createContentPrincipal(
|
|
TEST_URI,
|
|
{}
|
|
);
|
|
let principalPrivateBrowsing =
|
|
Services.scriptSecurityManager.createContentPrincipal(TEST_URI, {
|
|
privateBrowsingId: 1,
|
|
});
|
|
let principalUserContext1 =
|
|
Services.scriptSecurityManager.createContentPrincipal(TEST_URI, {
|
|
userContextId: 1,
|
|
});
|
|
let principalUserContext2 =
|
|
Services.scriptSecurityManager.createContentPrincipal(TEST_URI, {
|
|
userContextId: 2,
|
|
});
|
|
|
|
function testOAIsolation(permIsolateUserContext, permIsolatePrivateBrowsing) {
|
|
info(
|
|
`testOAIsolation: permIsolateUserContext: ${permIsolateUserContext}; permIsolatePrivateBrowsing: ${permIsolatePrivateBrowsing}`
|
|
);
|
|
|
|
let pm = Services.perms;
|
|
|
|
Services.prefs.setBoolPref(
|
|
"permissions.isolateBy.userContext",
|
|
permIsolateUserContext
|
|
);
|
|
Services.prefs.setBoolPref(
|
|
"permissions.isolateBy.privateBrowsing",
|
|
permIsolatePrivateBrowsing
|
|
);
|
|
|
|
// Set test permission for normal browsing
|
|
pm.addFromPrincipal(principal, TEST_PERMISSION, pm.ALLOW_ACTION);
|
|
|
|
// Check normal browsing permission
|
|
Assert.equal(
|
|
Ci.nsIPermissionManager.ALLOW_ACTION,
|
|
pm.testPermissionFromPrincipal(principal, TEST_PERMISSION)
|
|
);
|
|
// normal browsing => user context 1
|
|
Assert.equal(
|
|
permIsolateUserContext
|
|
? Ci.nsIPermissionManager.UNKNOWN_ACTION
|
|
: Ci.nsIPermissionManager.ALLOW_ACTION,
|
|
pm.testPermissionFromPrincipal(principalUserContext1, TEST_PERMISSION)
|
|
);
|
|
// normal browsing => user context 2
|
|
Assert.equal(
|
|
permIsolateUserContext
|
|
? Ci.nsIPermissionManager.UNKNOWN_ACTION
|
|
: Ci.nsIPermissionManager.ALLOW_ACTION,
|
|
pm.testPermissionFromPrincipal(principalUserContext2, TEST_PERMISSION)
|
|
);
|
|
// normal browsing => private browsing
|
|
Assert.equal(
|
|
permIsolatePrivateBrowsing
|
|
? Ci.nsIPermissionManager.UNKNOWN_ACTION
|
|
: Ci.nsIPermissionManager.ALLOW_ACTION,
|
|
pm.testPermissionFromPrincipal(principalPrivateBrowsing, TEST_PERMISSION)
|
|
);
|
|
|
|
// Set permission for private browsing
|
|
pm.addFromPrincipal(
|
|
principalPrivateBrowsing,
|
|
TEST_PERMISSION2,
|
|
pm.DENY_ACTION
|
|
);
|
|
|
|
// Check private browsing permission
|
|
Assert.equal(
|
|
Ci.nsIPermissionManager.DENY_ACTION,
|
|
pm.testPermissionFromPrincipal(principalPrivateBrowsing, TEST_PERMISSION2)
|
|
);
|
|
// private browsing => normal browsing
|
|
Assert.equal(
|
|
permIsolatePrivateBrowsing
|
|
? Ci.nsIPermissionManager.UNKNOWN_ACTION
|
|
: Ci.nsIPermissionManager.DENY_ACTION,
|
|
pm.testPermissionFromPrincipal(principal, TEST_PERMISSION2)
|
|
);
|
|
// private browsing => user context 1
|
|
Assert.equal(
|
|
permIsolatePrivateBrowsing || permIsolateUserContext
|
|
? Ci.nsIPermissionManager.UNKNOWN_ACTION
|
|
: Ci.nsIPermissionManager.DENY_ACTION,
|
|
pm.testPermissionFromPrincipal(principalUserContext1, TEST_PERMISSION2)
|
|
);
|
|
// private browsing => user context 2
|
|
Assert.equal(
|
|
permIsolatePrivateBrowsing || permIsolateUserContext
|
|
? Ci.nsIPermissionManager.UNKNOWN_ACTION
|
|
: Ci.nsIPermissionManager.DENY_ACTION,
|
|
pm.testPermissionFromPrincipal(principalUserContext2, TEST_PERMISSION2)
|
|
);
|
|
|
|
// Set permission for user context 1
|
|
pm.addFromPrincipal(
|
|
principalUserContext1,
|
|
TEST_PERMISSION3,
|
|
pm.PROMPT_ACTION
|
|
);
|
|
|
|
// Check user context 1 permission
|
|
Assert.equal(
|
|
Ci.nsIPermissionManager.PROMPT_ACTION,
|
|
pm.testPermissionFromPrincipal(principalUserContext1, TEST_PERMISSION3)
|
|
);
|
|
|
|
// user context 1 => normal browsing
|
|
Assert.equal(
|
|
permIsolateUserContext
|
|
? Ci.nsIPermissionManager.UNKNOWN_ACTION
|
|
: Ci.nsIPermissionManager.PROMPT_ACTION,
|
|
pm.testPermissionFromPrincipal(principal, TEST_PERMISSION3)
|
|
);
|
|
// user context 1 => user context 2
|
|
Assert.equal(
|
|
permIsolateUserContext
|
|
? Ci.nsIPermissionManager.UNKNOWN_ACTION
|
|
: Ci.nsIPermissionManager.PROMPT_ACTION,
|
|
pm.testPermissionFromPrincipal(principalUserContext2, TEST_PERMISSION3)
|
|
);
|
|
// user context 1 => private browsing
|
|
Assert.equal(
|
|
permIsolatePrivateBrowsing || permIsolateUserContext
|
|
? Ci.nsIPermissionManager.UNKNOWN_ACTION
|
|
: Ci.nsIPermissionManager.PROMPT_ACTION,
|
|
pm.testPermissionFromPrincipal(principalPrivateBrowsing, TEST_PERMISSION3)
|
|
);
|
|
|
|
pm.removeAll();
|
|
|
|
// Modifying an non-isolated/stripped permission should affect all browsing contexts,
|
|
// independently of permission isolation pref state
|
|
STRIPPED_PERMS.forEach(perm => {
|
|
info("Testing stripped permission " + perm);
|
|
|
|
// Add a permission for the normal window
|
|
pm.addFromPrincipal(principal, perm, pm.ALLOW_ACTION);
|
|
Assert.equal(
|
|
pm.testPermissionFromPrincipal(principalPrivateBrowsing, perm),
|
|
Ci.nsIPermissionManager.ALLOW_ACTION
|
|
);
|
|
Assert.equal(
|
|
pm.testPermissionFromPrincipal(principalUserContext1, perm),
|
|
Ci.nsIPermissionManager.ALLOW_ACTION
|
|
);
|
|
Assert.equal(
|
|
pm.testPermissionFromPrincipal(principalUserContext2, perm),
|
|
Ci.nsIPermissionManager.ALLOW_ACTION
|
|
);
|
|
|
|
// Remove the permission from private window
|
|
pm.removeFromPrincipal(principalPrivateBrowsing, perm);
|
|
Assert.equal(
|
|
pm.testPermissionFromPrincipal(principal, perm),
|
|
Ci.nsIPermissionManager.UNKNOWN_ACTION
|
|
);
|
|
Assert.equal(
|
|
pm.testPermissionFromPrincipal(principalUserContext1, perm),
|
|
Ci.nsIPermissionManager.UNKNOWN_ACTION
|
|
);
|
|
Assert.equal(
|
|
pm.testPermissionFromPrincipal(principalUserContext2, perm),
|
|
Ci.nsIPermissionManager.UNKNOWN_ACTION
|
|
);
|
|
|
|
// Set a permission for a normal window and then override it by adding it to container 2 again
|
|
pm.addFromPrincipal(principal, perm, pm.PROMPT_ACTION);
|
|
pm.addFromPrincipal(principal, TEST_PERMISSION, pm.ALLOW_ACTION);
|
|
pm.addFromPrincipal(principalUserContext2, perm, pm.DENY_ACTION);
|
|
|
|
let principalPerms = pm.getAllForPrincipal(principalPrivateBrowsing, perm);
|
|
|
|
Assert.ok(
|
|
principalPerms.some(p => p.type == perm && p.capability == pm.DENY_ACTION)
|
|
);
|
|
if (permIsolatePrivateBrowsing) {
|
|
Assert.equal(principalPerms.length, 1);
|
|
Assert.ok(
|
|
principalPerms.some(
|
|
p => p.type == perm && p.capability == pm.DENY_ACTION
|
|
)
|
|
);
|
|
} else {
|
|
Assert.equal(principalPerms.length, 2);
|
|
Assert.ok(
|
|
principalPerms.some(
|
|
p => p.type == TEST_PERMISSION && p.capability == pm.ALLOW_ACTION
|
|
)
|
|
);
|
|
}
|
|
|
|
// Cleanup
|
|
pm.removeAll();
|
|
});
|
|
}
|
|
|
|
add_task(async function do_test() {
|
|
// Test all pref combinations and check if principals with different origin attributes
|
|
// are isolated.
|
|
testOAIsolation(true, true);
|
|
testOAIsolation(true, false);
|
|
testOAIsolation(false, true);
|
|
testOAIsolation(false, false);
|
|
});
|