blob: f5ba067c82eff1ef3e3d369926bfde2bb5d4d0c8 [file]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
var assertEq = chrome.test.assertEq;
var assertFalse = chrome.test.assertFalse;
var assertTrue = chrome.test.assertTrue;
var assertThrows = chrome.test.assertThrows;
var fail = chrome.test.callbackFail;
var pass = chrome.test.callbackPass;
var listenOnce = chrome.test.listenOnce;
var NOT_OPTIONAL_ERROR =
"Only permissions specified in the manifest may be requested.";
var REQUIRED_ERROR =
"You cannot remove required permissions.";
var NOT_ALLOWLISTED_ERROR =
"The optional permissions API does not support '*'.";
var UNKNOWN_PERMISSIONS_ERROR =
"'*' is not a recognized permission.";
var emptyPermissions = {permissions: [], origins: []};
var initialPermissions = {
permissions: ['management'],
origins: ['http://a.com/*', "http://contentscript.com/*"]
};
var permissionsWithBookmarks = {
permissions: ['management', 'bookmarks'],
origins: ['http://a.com/*', "http://contentscript.com/*"]
}
var permissionsWithOrigin = {
permissions: ['management'],
origins: ['http://a.com/*', 'http://*.c.com/*', "http://contentscript.com/*"]
}
function checkEqualSets(set1, set2) {
if (set1.length != set2.length)
return false;
for (var x = 0; x < set1.length; x++) {
if (!set2.some(function(v) { return v == set1[x]; }))
return false;
}
return true;
}
function checkPermSetsEq(set1, set2) {
return checkEqualSets(set1.permissions, set2.permissions) &&
checkEqualSets(set1.origins, set2.origins);
}
chrome.test.getConfig(function(config) {
function doReq(domain, callback) {
var req = new XMLHttpRequest();
var url = domain + ":PORT/extensions/test_file.txt";
url = url.replace(/PORT/, config.testServer.port);
chrome.test.log("Requesting url: " + url);
req.open("GET", url, true);
req.onload = function() {
assertEq(200, req.status);
assertEq("Hello!", req.responseText);
callback(true);
};
req.onerror = function() {
chrome.test.log("status: " + req.status);
chrome.test.log("text: " + req.responseText);
callback(false);
};
req.send(null);
}
chrome.test.runTests([
function contains() {
chrome.permissions.contains(
{permissions: ['management'], origins: ['http://a.com/*']},
pass(function(result) { assertTrue(result); }));
chrome.permissions.contains(
{permissions: ['devtools'], origins: ['http://a.com/*']},
pass(function(result) { assertFalse(result); }));
chrome.permissions.contains(
{permissions: ['management']},
pass(function(result) { assertTrue(result); }));
chrome.permissions.contains(
{permissions: ['management']},
pass(function(result) { assertTrue(result); }));
},
function getAll() {
chrome.permissions.getAll(pass(function(permissions) {
assertTrue(checkPermSetsEq(initialPermissions, permissions));
}));
},
// We should get an error when requesting permissions that haven't been
// defined in "optional_permissions".
function requestNonOptional() {
chrome.permissions.request(
{permissions: ['history']}, fail(NOT_OPTIONAL_ERROR));
chrome.permissions.request(
{origins: ['http://*.b.com/*']}, fail(NOT_OPTIONAL_ERROR));
chrome.permissions.request(
{permissions: ['history'], origins: ['http://*.b.com/*']},
fail(NOT_OPTIONAL_ERROR));
},
// We should be able to request the bookmarks API since it's in the granted
// permissions list (see permissions_apitest.cc).
function requestBookmarks() {
assertEq(undefined, chrome.bookmarks);
listenOnce(chrome.permissions.onAdded,
function(permissions) {
assertTrue(permissions.permissions.length == 1);
assertTrue(permissions.permissions[0] == 'bookmarks');
});
chrome.permissions.request(
{permissions:['bookmarks']},
pass(function(granted) {
assertTrue(granted);
chrome.bookmarks.getTree(pass(function(result) {
assertTrue(true);
}));
chrome.permissions.getAll(pass(function(permissions) {
assertTrue(checkPermSetsEq(permissionsWithBookmarks,
permissions));
}));
}));
},
// You can't remove required permissions.
function removeRequired() {
chrome.permissions.remove(
{permissions: ['management']}, fail(REQUIRED_ERROR));
chrome.permissions.remove(
{origins: ['http://a.com/*']}, fail(REQUIRED_ERROR));
chrome.permissions.remove(
{permissions: ['bookmarks'], origins: ['http://a.com/*']},
fail(REQUIRED_ERROR));
},
// You can remove permissions you don't have (nothing happens).
function removeNoOp() {
chrome.permissions.remove(
{permissions:['background']},
pass(function(removed) { assertTrue(removed); }));
chrome.permissions.remove(
{origins:['http://*.c.com/*']},
pass(function(removed) { assertTrue(removed); }));
chrome.permissions.remove(
{permissions:['background'], origins:['http://*.c.com/*']},
pass(function(removed) { assertTrue(removed); }));
},
function removeBookmarks() {
chrome.bookmarks.getTree(pass(function(result) {
assertTrue(true);
}));
listenOnce(chrome.permissions.onRemoved,
function(permissions) {
assertTrue(permissions.permissions.length == 1);
assertTrue(permissions.permissions[0] == 'bookmarks');
});
chrome.permissions.remove(
{permissions:['bookmarks']},
pass(function() {
chrome.permissions.getAll(pass(function(permissions) {
assertTrue(checkPermSetsEq(initialPermissions, permissions));
}));
assertTrue(typeof chrome.bookmarks == 'object' &&
chrome.bookmarks != null);
var nativeBindingsError =
"'bookmarks.getTree' is not available in this context.";
var jsBindingsError =
"'bookmarks' requires a different Feature that is not present.";
var regexp =
new RegExp(nativeBindingsError + '|' + jsBindingsError);
assertThrows(chrome.bookmarks.getTree, [function(){}], regexp);
}
));
},
// The user shouldn't have to approve permissions that have no warnings.
function noPromptForNoWarnings() {
chrome.permissions.request(
{permissions: ['cookies']},
pass(function(granted) {
assertTrue(granted);
// Remove the cookies permission to return to normal.
chrome.permissions.remove(
{permissions: ['cookies']},
pass(function(removed) { assertTrue(removed); }));
}));
},
// Make sure you can only access the allowlisted permissions.
function allowlist() {
const kPermission = 'fontSettings';
var error_msg = NOT_ALLOWLISTED_ERROR.replace('*', kPermission);
chrome.permissions.request(
{permissions: [kPermission]}, fail(error_msg));
chrome.permissions.remove(
{permissions: [kPermission]}, fail(error_msg));
},
function unknownPermission() {
var error_msg = UNKNOWN_PERMISSIONS_ERROR.replace('*', 'asdf');
chrome.permissions.request(
{permissions: ['asdf']}, fail(error_msg));
},
function requestOrigin() {
doReq('http://c.com', pass(function(success) { assertFalse(success); }));
chrome.permissions.getAll(pass(function(permissions) {
assertTrue(checkPermSetsEq(initialPermissions, permissions));
}));
listenOnce(chrome.permissions.onAdded,
function(permissions) {
assertTrue(permissions.permissions.length == 0);
assertTrue(permissions.origins.length == 1);
assertTrue(permissions.origins[0] == 'http://*.c.com/*');
});
chrome.permissions.request(
{origins: ['http://*.c.com/*']},
pass(function(granted) {
assertTrue(granted);
chrome.permissions.getAll(pass(function(permissions) {
assertTrue(checkPermSetsEq(permissionsWithOrigin, permissions));
}));
chrome.permissions.contains(
{origins:['http://*.c.com/*']},
pass(function(result) { assertTrue(result); }));
doReq('http://c.com', pass(function(result) { assertTrue(result); }));
}));
},
function removeOrigin() {
doReq('http://c.com', pass(function(result) { assertTrue(result); }));
listenOnce(chrome.permissions.onRemoved,
function(permissions) {
assertTrue(permissions.permissions.length == 0);
assertTrue(permissions.origins.length == 1);
assertTrue(permissions.origins[0] == 'http://*.c.com/*');
});
chrome.permissions.remove(
{origins: ['http://*.c.com/*']},
pass(function(removed) {
assertTrue(removed);
chrome.permissions.getAll(pass(function(permissions) {
assertTrue(checkPermSetsEq(initialPermissions, permissions));
}));
chrome.permissions.contains(
{origins:['http://*.c.com/*']},
pass(function(result) { assertFalse(result); }));
doReq('http://c.com', pass(function(result) { assertFalse(result); }));
}));
},
// Tests that the changed permissions have taken effect from inside the
// onAdded and onRemoved event listeners.
function eventListenerPermissions() {
listenOnce(chrome.permissions.onAdded,
function(permissions) {
chrome.bookmarks.getTree(pass(function() {
assertTrue(true);
}));
});
listenOnce(chrome.permissions.onRemoved,
function(permissions) {
assertTrue(typeof chrome.bookmarks == 'object' &&
chrome.bookmarks != null);
var nativeBindingsError =
"'bookmarks.getTree' is not available in this context.";
var jsBindingsError =
"'bookmarks' requires a different Feature that is not present.";
var regexp = new RegExp(nativeBindingsError + '|' + jsBindingsError);
assertThrows(chrome.bookmarks.getTree, [function(){}], regexp);
});
chrome.permissions.request(
{permissions: ['bookmarks']}, pass(function(granted) {
assertTrue(granted);
chrome.permissions.remove(
{permissions: ['bookmarks']}, pass(function() {
assertTrue(true);
}));
}));
}
]);
});