summaryrefslogtreecommitdiffstats
path: root/application/palemoon/components/preferences/permissions.js
diff options
context:
space:
mode:
authorjanekptacijarabaci <janekptacijarabaci@seznam.cz>2018-04-26 07:06:14 +0200
committerjanekptacijarabaci <janekptacijarabaci@seznam.cz>2018-04-26 07:06:14 +0200
commit0bea8f9effeed045e645bf951995e6ed480bdf0f (patch)
treedf14de1518c14c2b7d62c3cf2d1bf1b587dc949e /application/palemoon/components/preferences/permissions.js
parentb688bdfa9aae1806f151b76abca7ea65228ec816 (diff)
downloadUXP-0bea8f9effeed045e645bf951995e6ed480bdf0f.tar
UXP-0bea8f9effeed045e645bf951995e6ed480bdf0f.tar.gz
UXP-0bea8f9effeed045e645bf951995e6ed480bdf0f.tar.lz
UXP-0bea8f9effeed045e645bf951995e6ed480bdf0f.tar.xz
UXP-0bea8f9effeed045e645bf951995e6ed480bdf0f.zip
Bug 340432 - Add the ability to cancel site permission changes
Diffstat (limited to 'application/palemoon/components/preferences/permissions.js')
-rw-r--r--application/palemoon/components/preferences/permissions.js233
1 files changed, 146 insertions, 87 deletions
diff --git a/application/palemoon/components/preferences/permissions.js b/application/palemoon/components/preferences/permissions.js
index 015f96a32..8f0387b7d 100644
--- a/application/palemoon/components/preferences/permissions.js
+++ b/application/palemoon/components/preferences/permissions.js
@@ -3,12 +3,14 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+Components.utils.import("resource://gre/modules/Services.jsm");
+
const nsIPermissionManager = Components.interfaces.nsIPermissionManager;
const nsICookiePermission = Components.interfaces.nsICookiePermission;
const NOTIFICATION_FLUSH_PERMISSIONS = "flush-pending-permissions";
-function Permission(host, rawHost, type, capability)
+function Permission(host, rawHost, type, capability)
{
this.host = host;
this.rawHost = rawHost;
@@ -17,18 +19,19 @@ function Permission(host, rawHost, type, capability)
}
var gPermissionManager = {
- _type : "",
- _permissions : [],
- _pm : Components.classes["@mozilla.org/permissionmanager;1"]
- .getService(Components.interfaces.nsIPermissionManager),
- _bundle : null,
- _tree : null,
-
+ _type : "",
+ _permissions : [],
+ _permissionsToAdd : new Map(),
+ _permissionsToDelete : new Map(),
+ _bundle : null,
+ _tree : null,
+ _observerRemoved : false,
+
_view: {
_rowCount: 0,
- get rowCount()
- {
- return this._rowCount;
+ get rowCount()
+ {
+ return this._rowCount;
},
getCellText: function (aRow, aColumn)
{
@@ -56,7 +59,7 @@ var gPermissionManager = {
return "";
}
},
-
+
_getCapabilityString: function (aCapability)
{
var stringKey = null;
@@ -76,44 +79,48 @@ var gPermissionManager = {
}
return this._bundle.getString(stringKey);
},
-
+
addPermission: function (aCapability)
{
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);
+ var uri = Services.io.newURI("http://" + host, null, null);
host = uri.host;
} 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);
+ Services.prompt.alert(window, title, message);
return;
}
var capabilityString = this._getCapabilityString(aCapability);
// check whether the permission already exists, if not, add it
- var exists = false;
+ let hostExists = false;
+ let capabilityExists = false;
for (var i = 0; i < this._permissions.length; ++i) {
if (this._permissions[i].rawHost == host) {
- // Avoid calling the permission manager if the capability settings are
- // the same. Otherwise allow the call to the permissions manager to
- // update the listbox for us.
- exists = this._permissions[i].capability == capabilityString;
+ hostExists = true;
+ capabilityExists = this._permissions[i].capability == capabilityString;
+ if (!capabilityExists) {
+ this._permissions[i].capability = capabilityString;
+ }
break;
}
}
- if (!exists) {
- host = (host.charAt(0) == ".") ? host.substring(1,host.length) : host;
- var uri = ioService.newURI("http://" + host, null, null);
- this._pm.add(uri, this._type, aCapability);
+
+ let permissionParams = {host: host, type: this._type, capability: aCapability};
+ if (!hostExists) {
+ this._permissionsToAdd.set(host, permissionParams);
+ this._addPermission(permissionParams);
+ }
+ else if (!capabilityExists) {
+ this._permissionsToAdd.set(host, permissionParams);
+ this._handleCapabilityChange();
}
+
textbox.value = "";
textbox.focus();
@@ -123,14 +130,58 @@ var gPermissionManager = {
// enable "remove all" button as needed
document.getElementById("removeAllPermissions").disabled = this._permissions.length == 0;
},
-
+
+ _removePermission: function(aPermission)
+ {
+ this._removePermissionFromList(aPermission.host);
+
+ // If this permission was added during this session, let's remove
+ // it from the pending adds list to prevent calls to the
+ // permission manager.
+ let isNewPermission = this._permissionsToAdd.delete(aPermission.host);
+
+ if (!isNewPermission) {
+ this._permissionsToDelete.set(aPermission.host, aPermission);
+ }
+
+ },
+
+ _handleCapabilityChange: function ()
+ {
+ // Re-do the sort, if the status changed from Block to Allow
+ // or vice versa, since if we're sorted on status, we may no
+ // longer be in order.
+ if (this._lastPermissionSortColumn.id == "statusCol") {
+ this._resortPermissions();
+ }
+ this._tree.treeBoxObject.invalidate();
+ },
+
+ _addPermission: function(aPermission)
+ {
+ this._addPermissionToList(aPermission);
+ ++this._view._rowCount;
+ this._tree.treeBoxObject.rowCountChanged(this._view.rowCount - 1, 1);
+ // Re-do the sort, since we inserted this new item at the end.
+ this._resortPermissions();
+ },
+
+ _resortPermissions: function()
+ {
+ gTreeUtils.sort(this._tree, this._view, this._permissions,
+ this._lastPermissionSortColumn,
+ this._permissionsComparator,
+ this._lastPermissionSortColumn,
+ !this._lastPermissionSortAscending); // keep sort direction
+ },
+
onHostInput: function (aSiteField)
{
document.getElementById("btnSession").disabled = !aSiteField.value;
document.getElementById("btnBlock").disabled = !aSiteField.value;
document.getElementById("btnAllow").disabled = !aSiteField.value;
},
-
+
onWindowKeyPress: function (aEvent)
{
if (aEvent.keyCode == KeyEvent.DOM_VK_ESCAPE)
@@ -142,14 +193,14 @@ var gPermissionManager = {
if (aEvent.keyCode == KeyEvent.DOM_VK_RETURN)
document.getElementById("btnAllow").click();
},
-
+
onLoad: function ()
{
this._bundle = document.getElementById("bundlePreferences");
var params = window.arguments[0];
this.init(params);
},
-
+
init: function (aParams)
{
if (this._type) {
@@ -159,14 +210,14 @@ var gPermissionManager = {
this._type = aParams.permissionType;
this._manageCapability = aParams.manageCapability;
-
+
var permissionsText = document.getElementById("permissionsText");
while (permissionsText.hasChildNodes())
permissionsText.removeChild(permissionsText.firstChild);
permissionsText.appendChild(document.createTextNode(aParams.introText));
document.title = aParams.windowTitle;
-
+
document.getElementById("btnBlock").hidden = !aParams.blockVisible;
document.getElementById("btnSession").hidden = !aParams.sessionVisible;
document.getElementById("btnAllow").hidden = !aParams.allowVisible;
@@ -184,21 +235,23 @@ var gPermissionManager = {
var os = Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService);
- os.notifyObservers(null, NOTIFICATION_FLUSH_PERMISSIONS, this._type);
- os.addObserver(this, "perm-changed", false);
+ Services.obs.notifyObservers(null, NOTIFICATION_FLUSH_PERMISSIONS, this._type);
+ Services.obs.addObserver(this, "perm-changed", false);
this._loadPermissions();
-
+
urlField.focus();
},
-
+
uninit: function ()
{
- var os = Components.classes["@mozilla.org/observer-service;1"]
- .getService(Components.interfaces.nsIObserverService);
- os.removeObserver(this, "perm-changed");
+ if (!this._observerRemoved) {
+ Services.obs.removeObserver(this, "perm-changed");
+
+ this._observerRemoved = true;
+ }
},
-
+
observe: function (aSubject, aTopic, aData)
{
if (aTopic == "perm-changed") {
@@ -209,15 +262,7 @@ var gPermissionManager = {
return;
if (aData == "added") {
- this._addPermissionToList(permission);
- ++this._view._rowCount;
- this._tree.treeBoxObject.rowCountChanged(this._view.rowCount - 1, 1);
- // Re-do the sort, since we inserted this new item at the end.
- gTreeUtils.sort(this._tree, this._view, this._permissions,
- this._lastPermissionSortColumn,
- this._permissionsComparator,
- this._lastPermissionSortColumn,
- !this._lastPermissionSortAscending); // keep sort direction
+ this._addPermission(permission);
}
else if (aData == "changed") {
for (var i = 0; i < this._permissions.length; ++i) {
@@ -226,32 +271,14 @@ var gPermissionManager = {
break;
}
}
- // Re-do the sort, if the status changed from Block to Allow
- // or vice versa, since if we're sorted on status, we may no
- // longer be in order.
- if (this._lastPermissionSortColumn == "statusCol") {
- gTreeUtils.sort(this._tree, this._view, this._permissions,
- this._lastPermissionSortColumn,
- this._permissionsComparator,
- this._lastPermissionSortColumn,
- !this._lastPermissionSortAscending); // keep sort direction
- }
- this._tree.treeBoxObject.invalidate();
+ this._handleCapabilityChange();
}
else if (aData == "deleted") {
- for (var i = 0; i < this._permissions.length; i++) {
- if (this._permissions[i].host == permission.host) {
- this._permissions.splice(i, 1);
- this._view._rowCount--;
- this._tree.treeBoxObject.rowCountChanged(this._view.rowCount - 1, -1);
- this._tree.treeBoxObject.invalidate();
- break;
- }
- }
+ this._removePermissionFromList(permission);
}
}
},
-
+
onPermissionSelected: function ()
{
var hasSelection = this._tree.view.selection.count > 0;
@@ -268,8 +295,8 @@ var gPermissionManager = {
gTreeUtils.deleteSelectedItems(this._tree, this._view, this._permissions, removedPermissions);
for (var i = 0; i < removedPermissions.length; ++i) {
var p = removedPermissions[i];
- this._pm.remove(p.host, p.type);
- }
+ this._removePermission(p);
+ }
document.getElementById("removePermission").disabled = !this._permissions.length;
document.getElementById("removeAllPermissions").disabled = !this._permissions.length;
},
@@ -282,12 +309,12 @@ var gPermissionManager = {
gTreeUtils.deleteAll(this._tree, this._view, this._permissions, removedPermissions);
for (var i = 0; i < removedPermissions.length; ++i) {
var p = removedPermissions[i];
- this._pm.remove(p.host, p.type);
- }
+ this._removePermission(p);
+ }
document.getElementById("removePermission").disabled = true;
document.getElementById("removeAllPermissions").disabled = true;
},
-
+
onPermissionKeyPress: function (aEvent)
{
if (aEvent.keyCode == KeyEvent.DOM_VK_DELETE
@@ -298,7 +325,7 @@ var gPermissionManager = {
this.onPermissionDeleted();
}
},
-
+
_lastPermissionSortColumn: "",
_lastPermissionSortAscending: false,
_permissionsComparator : function (a, b)
@@ -309,16 +336,35 @@ var gPermissionManager = {
onPermissionSort: function (aColumn)
{
- this._lastPermissionSortAscending = gTreeUtils.sort(this._tree,
- this._view,
+ this._lastPermissionSortAscending = gTreeUtils.sort(this._tree,
+ this._view,
this._permissions,
aColumn,
this._permissionsComparator,
- this._lastPermissionSortColumn,
+ this._lastPermissionSortColumn,
this._lastPermissionSortAscending);
this._lastPermissionSortColumn = aColumn;
},
-
+
+ onApplyChanges: function()
+ {
+ // Stop observing permission changes since we are about
+ // to write out the pending adds/deletes and don't need
+ // to update the UI
+ this.uninit();
+
+ for (let permissionParams of this._permissionsToAdd.values()) {
+ let uri = Services.io.newURI("http://" + permissionParams.host, null, null);
+ Services.perms.add(uri, permissionParams.type, permissionParams.capability);
+ }
+
+ for (let p of this._permissionsToDelete.values()) {
+ Services.perms.remove(p.host, p.type);
+ }
+
+ window.close();
+ },
+
_loadPermissions: function ()
{
this._tree = document.getElementById("permissionsTree");
@@ -326,12 +372,12 @@ var gPermissionManager = {
// load permissions into a table
var count = 0;
- var enumerator = this._pm.enumerator;
+ var enumerator = Services.perms.enumerator;
while (enumerator.hasMoreElements()) {
var nextPermission = enumerator.getNext().QueryInterface(Components.interfaces.nsIPermission);
this._addPermissionToList(nextPermission);
}
-
+
this._view._rowCount = this._permissions.length;
// sort and display the table
@@ -341,7 +387,7 @@ var gPermissionManager = {
// disable "remove all" button if there are none
document.getElementById("removeAllPermissions").disabled = this._permissions.length == 0;
},
-
+
_addPermissionToList: function (aPermission)
{
if (aPermission.type == this._type &&
@@ -355,15 +401,28 @@ var gPermissionManager = {
aPermission.type,
capabilityString);
this._permissions.push(p);
- }
+ }
},
-
+
setHost: function (aHost)
{
document.getElementById("url").value = aHost;
}
};
+ _removePermissionFromList: function (aHost)
+ {
+ for (let i = 0; i < this._permissions.length; ++i) {
+ if (this._permissions[i].host == aHost) {
+ this._permissions.splice(i, 1);
+ this._view._rowCount--;
+ this._tree.treeBoxObject.rowCountChanged(this._view.rowCount - 1, -1);
+ this._tree.treeBoxObject.invalidate();
+ break;
+ }
+ }
+ },
+
function setHost(aHost)
{
gPermissionManager.setHost(aHost);