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); }