mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-09 12:51:09 +02:00
276 lines
9.6 KiB
JavaScript
276 lines
9.6 KiB
JavaScript
const nsIPermissionManager = Components.interfaces.nsIPermissionManager;
|
|
const nsICookiePermission = Components.interfaces.nsICookiePermission;
|
|
|
|
function Permission(id, host, rawHost, type, capability, perm)
|
|
{
|
|
this.id = id;
|
|
this.host = host;
|
|
this.rawHost = rawHost;
|
|
this.type = type;
|
|
this.capability = capability;
|
|
this.perm = perm;
|
|
}
|
|
|
|
var gPermissionManager = {
|
|
_type : "",
|
|
_addedPermissions : [],
|
|
_removedPermissions : [],
|
|
_pm : Components.classes["@mozilla.org/permissionmanager;1"]
|
|
.getService(Components.interfaces.nsIPermissionManager),
|
|
_bundle : null,
|
|
_tree : null,
|
|
|
|
_view: {
|
|
_rowCount: 0,
|
|
get rowCount()
|
|
{
|
|
return this._rowCount;
|
|
},
|
|
getCellText: function (aRow, aColumn)
|
|
{
|
|
if (aColumn.id == "siteCol")
|
|
return gPermissionManager._addedPermissions[aRow].rawHost;
|
|
else if (aColumn.id == "statusCol")
|
|
return gPermissionManager._addedPermissions[aRow].capability;
|
|
return "";
|
|
},
|
|
|
|
isSeparator: function(aIndex) { return false; },
|
|
isSorted: function() { return false; },
|
|
isContainer: function(aIndex) { return false; },
|
|
setTree: function(aTree){},
|
|
getImageSrc: function(aRow, aColumn) {},
|
|
getProgressMode: function(aRow, aColumn) {},
|
|
getCellValue: function(aRow, aColumn) {},
|
|
cycleHeader: function(column) {},
|
|
getRowProperties: function(row,prop){},
|
|
getColumnProperties: function(column,prop){},
|
|
getCellProperties: function(row,column,prop){}
|
|
},
|
|
|
|
onOK: function ()
|
|
{
|
|
var pm = Components.classes["@mozilla.org/permissionmanager;1"]
|
|
.getService(Components.interfaces.nsIPermissionManager);
|
|
for (var i = 0; i < this._removedPermissions.length; ++i) {
|
|
var p = this._removedPermissions[i];
|
|
pm.remove(p.host, p.type);
|
|
}
|
|
|
|
var uri = Components.classes["@mozilla.org/network/standard-url;1"]
|
|
.createInstance(Components.interfaces.nsIURI);
|
|
for (var i = 0; i < this._addedPermissions.length; ++i) {
|
|
var p = this._addedPermissions[i];
|
|
uri.spec = p.host;
|
|
pm.add(uri, p.type, p.perm);
|
|
}
|
|
},
|
|
|
|
addPermission: function (aPermission)
|
|
{
|
|
var textbox = document.getElementById("url");
|
|
var host = textbox.value.replace(/^\s*([-\w]*:\/+)?/, ""); // trim any leading space and scheme
|
|
try {
|
|
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
|
|
.getService(Components.interfaces.nsIIOService);
|
|
var uri = ioService.newURI("http://"+host, null, null);
|
|
host = uri.host;
|
|
|
|
// check for garbage
|
|
if (host == "" || host.replace(/\W/, "") == "")
|
|
throw("Error: Invalid hostname entered.");
|
|
} catch(ex) {
|
|
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
|
|
.getService(Components.interfaces.nsIPromptService);
|
|
var message = this._bundle.getString("invalidURI");
|
|
var title = this._bundle.getString("invalidURITitle");
|
|
promptService.alert(window, title, message);
|
|
|
|
// clear out the textbox and disable the buttons
|
|
textbox.value = "";
|
|
textbox.focus();
|
|
this.onHostInput(textbox);
|
|
return;
|
|
}
|
|
|
|
// we need this whether the perm exists or not
|
|
var stringKey = null;
|
|
switch (aPermission) {
|
|
case nsIPermissionManager.ALLOW_ACTION:
|
|
stringKey = "can";
|
|
break;
|
|
case nsIPermissionManager.DENY_ACTION:
|
|
stringKey = "cannot";
|
|
break;
|
|
case nsICookiePermission.ACCESS_SESSION:
|
|
stringKey = "canSession";
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
// check whether the permission already exists, if not, add it
|
|
var exists = false;
|
|
for (var i = 0; i < this._addedPermissions.length; ++i) {
|
|
if (this._addedPermissions[i].rawHost == host) {
|
|
exists = true;
|
|
this._addedPermissions[i].capability = this._bundle.getString(stringKey);
|
|
this._addedPermissions[i].perm = aPermission;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!exists) {
|
|
var p = new Permission(this._addedPermissions.length,
|
|
host,
|
|
(host.charAt(0) == ".") ? host.substring(1,host.length) : host,
|
|
this._type,
|
|
this._bundle.getString(stringKey),
|
|
aPermission);
|
|
this._addedPermissions.push(p);
|
|
|
|
this._view._rowCount = this._addedPermissions.length;
|
|
this._tree.treeBoxObject.rowCountChanged(this._addedPermissions.length-1, 1);
|
|
this._tree.treeBoxObject.ensureRowIsVisible(this._addedPermissions.length-1);
|
|
}
|
|
textbox.value = "";
|
|
textbox.focus();
|
|
|
|
// covers a case where the site exists already, so the buttons don't disable
|
|
this.onHostInput(textbox);
|
|
|
|
// enable "remove all" button as needed
|
|
document.getElementById("removeAllPermissions").disabled = this._addedPermissions.length == 0;
|
|
},
|
|
|
|
onHostInput: function (aSiteField)
|
|
{
|
|
// trim any leading space
|
|
var site = aSiteField.value.replace(/^\s*([-\w]*:\/+)?/, "");
|
|
|
|
document.getElementById("btnSession").disabled = !site;
|
|
document.getElementById("btnBlock").disabled = !site;
|
|
document.getElementById("btnAllow").disabled = !site;
|
|
},
|
|
|
|
onLoad: function ()
|
|
{
|
|
this._type = window.arguments[0].permissionType;
|
|
this._bundle = document.getElementById("permBundle");
|
|
|
|
var permissionsText = document.getElementById("permissionsText");
|
|
while (permissionsText.hasChildNodes())
|
|
permissionsText.removeChild(permissionsText.firstChild);
|
|
|
|
var introString = this._bundle.getString(this._type + "permissionstext");
|
|
permissionsText.appendChild(document.createTextNode(introString));
|
|
|
|
var titleString = this._bundle.getString(this._type + "permissionstitle");
|
|
document.documentElement.setAttribute("title", titleString);
|
|
|
|
document.getElementById("btnBlock").hidden = !window.arguments[0].blockVisible;
|
|
document.getElementById("btnSession").hidden = !window.arguments[0].sessionVisible;
|
|
document.getElementById("btnAllow").hidden = !window.arguments[0].allowVisible;
|
|
document.getElementById("url").value = window.arguments[0].prefilledHost;
|
|
this.onHostInput(document.getElementById("url"));
|
|
|
|
this._loadPermissions();
|
|
},
|
|
|
|
onPermissionSelected: function ()
|
|
{
|
|
var selections = GetTreeSelections(this._tree);
|
|
document.getElementById("removePermission").disabled = (selections.length < 1);
|
|
},
|
|
|
|
onPermissionDeleted: function ()
|
|
{
|
|
DeleteSelectedItemFromTree(this._tree, this._view,
|
|
this._addedPermissions, this._removedPermissions,
|
|
"removePermission", "removeAllPermissions");
|
|
},
|
|
|
|
onAllPermissionsDeleted: function ()
|
|
{
|
|
DeleteAllFromTree(this._tree, this._view,
|
|
this._addedPermissions, this._removedPermissions,
|
|
"removePermission", "removeAllPermissions");
|
|
},
|
|
|
|
onPermissionKeyPress: function (aEvent)
|
|
{
|
|
if (aEvent.keyCode == 46)
|
|
this.onPermissionDeleted();
|
|
},
|
|
|
|
_lastPermissionSortColumn: "",
|
|
_lastPermissionSortAscending: false,
|
|
|
|
onPermissionSort: function (aColumn, aUpdateSelection)
|
|
{
|
|
this._lastPermissionSortAscending = SortTree(this._tree,
|
|
this._view,
|
|
this._addedPermissions,
|
|
aColumn,
|
|
this._lastPermissionSortColumn,
|
|
this._lastPermissionSortAscending,
|
|
aUpdateSelection);
|
|
this._lastPermissionSortColumn = aColumn;
|
|
},
|
|
|
|
_loadPermissions: function ()
|
|
{
|
|
this._tree = document.getElementById("permissionsTree");
|
|
|
|
// load permissions into a table
|
|
var count = 0;
|
|
var enumerator = this._pm.enumerator;
|
|
while (enumerator.hasMoreElements()) {
|
|
var nextPermission = enumerator.getNext().QueryInterface(Components.interfaces.nsIPermission);
|
|
if (nextPermission.type == this._type) {
|
|
var host = nextPermission.host;
|
|
var capability = null;
|
|
switch (nextPermission.capability) {
|
|
case nsIPermissionManager.ALLOW_ACTION:
|
|
capability = "can";
|
|
break;
|
|
case nsIPermissionManager.DENY_ACTION:
|
|
capability = "cannot";
|
|
break;
|
|
// we should only ever hit this for cookies
|
|
case nsICookiePermission.ACCESS_SESSION:
|
|
capability = "canSession";
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
var capabilityString = this._bundle.getString(capability);
|
|
var p = new Permission(count++, host,
|
|
(host.charAt(0) == ".") ? host.substring(1,host.length) : host,
|
|
nextPermission.type,
|
|
capabilityString,
|
|
nextPermission.capability);
|
|
this._addedPermissions.push(p);
|
|
}
|
|
}
|
|
|
|
this._view._rowCount = this._addedPermissions.length;
|
|
|
|
// sort and display the table
|
|
this._tree.treeBoxObject.view = this._view;
|
|
this.onPermissionSort("rawHost", false);
|
|
|
|
// disable "remove all" button if there are none
|
|
document.getElementById("removeAllPermissions").disabled = this._addedPermissions.length == 0;
|
|
},
|
|
|
|
setHost: function (aHost)
|
|
{
|
|
document.getElementById("url").value = aHost;
|
|
}
|
|
};
|
|
|
|
function setHost(aHost)
|
|
{
|
|
gPermissionManager.setHost(aHost);
|
|
}
|
|
|