bug 98575 speed up cookie manager, r=sgehani, sr=hewitt
git-svn-id: svn://10.0.0.236/trunk@108764 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
parent
fb92157584
commit
61558cddcc
@ -1,8 +1,6 @@
|
||||
<!ENTITY tab.cookiesonsystem.label "Stored Cookies">
|
||||
<!ENTITY tab.bannedservers.label "Cookie Sites">
|
||||
<!ENTITY div.bannedservers.label "Sites that can and cannot store cookies on your computer.">
|
||||
<!ENTITY tab.bannedimages.label "Image Sites">
|
||||
<!ENTITY div.bannedimages.label "Sites from which images are or are not loaded.">
|
||||
<!ENTITY div.cookiesonsystem.label "View and Remove Cookies that are stored on your computer.">
|
||||
<!ENTITY treehead.cookiename.label "Cookie Name">
|
||||
<!ENTITY treehead.cookiedomain.label "Site">
|
||||
|
||||
@ -22,574 +22,332 @@
|
||||
* Ben Goodger
|
||||
*/
|
||||
|
||||
// global variables
|
||||
var cookiemanager = null; // cookiemanager interface
|
||||
// interface variables
|
||||
var cookiemanager = null; // cookiemanager interfa
|
||||
var permissionmanager = null; // permissionmanager interface
|
||||
var cookies = []; // array of cookies
|
||||
var cpermissions = []; // array of cookie permissions
|
||||
var ipermissions = []; // array of image permissions
|
||||
var images = []; // array of images (NEW OBJECT)
|
||||
var deleted_cookies = [];
|
||||
var deleted_permissions = [];
|
||||
var deleted_images = [];
|
||||
var deleted_cookies_count = 0;
|
||||
var deleted_cookie_permissions_count = 0;
|
||||
var deleted_image_permissions_count = 0;
|
||||
var cookie_permissions_count = 0;
|
||||
var image_permissions_count = 0;
|
||||
var cookieType = 0;
|
||||
var imageType = 1;
|
||||
var gDateService = null;
|
||||
|
||||
// for dealing with the interface:
|
||||
var gone_c = "";
|
||||
var gone_p = "";
|
||||
var gone_i = "";
|
||||
// string bundle
|
||||
var bundle = null;
|
||||
// CHANGE THIS WHEN MOVING FILES - strings localization file!
|
||||
var JS_STRINGS_FILE = "chrome://communicator/locale/wallet/CookieViewer.properties";
|
||||
const nsScriptableDateFormat_CONTRACTID = "@mozilla.org/intl/scriptabledateformat;1";
|
||||
const nsIScriptableDateFormat = Components.interfaces.nsIScriptableDateFormat;
|
||||
|
||||
// function : <CookieViewer.js>::Startup();
|
||||
// purpose : initialises the cookie viewer dialog
|
||||
function Startup()
|
||||
{
|
||||
// xpconnect to cookiemanager interface
|
||||
// cookies and permissions list
|
||||
var cookies = [];
|
||||
var permissions = [];
|
||||
var deletedCookies = [];
|
||||
var deletedPermissions = [];
|
||||
|
||||
// differentiate between cookies and images
|
||||
var isImages = (window.arguments[0] != 0);
|
||||
const cookieType = 0;
|
||||
const imageType = 1;
|
||||
|
||||
var cookieBundle;
|
||||
|
||||
function Startup() {
|
||||
// xpconnect to cookiemanager/permissionmanager interfaces
|
||||
cookiemanager = Components.classes["@mozilla.org/cookiemanager;1"].getService();
|
||||
cookiemanager = cookiemanager.QueryInterface(Components.interfaces.nsICookieManager);
|
||||
// xpconnect to permissionmanager interface
|
||||
permissionmanager = Components.classes["@mozilla.org/permissionmanager;1"].getService();
|
||||
permissionmanager = permissionmanager.QueryInterface(Components.interfaces.nsIPermissionManager);
|
||||
// intialise string bundle
|
||||
|
||||
// intialize gDateService
|
||||
if (!gDateService) {
|
||||
const nsScriptableDateFormat_CONTRACTID = "@mozilla.org/intl/scriptabledateformat;1";
|
||||
const nsIScriptableDateFormat = Components.interfaces.nsIScriptableDateFormat;
|
||||
gDateService = Components.classes[nsScriptableDateFormat_CONTRACTID]
|
||||
.getService(nsIScriptableDateFormat);
|
||||
}
|
||||
bundle = srGetStrBundle(JS_STRINGS_FILE);
|
||||
|
||||
// install imageblocker tab if instructed to do so by the "imageblocker.enabled" pref
|
||||
// intialize string bundle
|
||||
cookieBundle = document.getElementById("cookieBundle");
|
||||
|
||||
// determine if labelling is for cookies or images
|
||||
try {
|
||||
var pref = Components.classes["@mozilla.org/preferences-service;1"]
|
||||
.getService(Components.interfaces.nsIPrefBranch);
|
||||
try {
|
||||
if (pref.getBoolPref("imageblocker.enabled")) {
|
||||
var element;
|
||||
element = document.getElementById("imagesTab");
|
||||
element.setAttribute("hidden","false" );
|
||||
element = document.getElementById("images");
|
||||
element.setAttribute("hidden","false" );
|
||||
}
|
||||
} catch(e) {
|
||||
var tabBox = document.getElementById("tabbox");
|
||||
var element;
|
||||
if (!isImages) {
|
||||
element = document.getElementById("cookiesTab");
|
||||
tabBox.selectedTab = element;
|
||||
} else {
|
||||
element = document.getElementById("cookieviewer");
|
||||
element.setAttribute("title", cookieBundle.getString("imageTitle"));
|
||||
element = document.getElementById("permissionsTab");
|
||||
element.label = cookieBundle.getString("tabBannedImages");
|
||||
tabBox.selectedTab = element;
|
||||
element = document.getElementById("permissionsText");
|
||||
element.value = cookieBundle.getString("textBannedImages");
|
||||
element = document.getElementById("cookiesTab");
|
||||
element.hidden = "true";
|
||||
}
|
||||
try {
|
||||
var tab = window.arguments[0];
|
||||
var element2 = document.getElementById("tabbox");
|
||||
if (tab == "0") {
|
||||
element = document.getElementById("cookiesTab");
|
||||
element2.selectedTab = element;
|
||||
element = document.getElementById("imagesTab");
|
||||
element.setAttribute("hidden","true" );
|
||||
} else {
|
||||
element = document.getElementById("cookieviewer");
|
||||
element.setAttribute("title", bundle.GetStringFromName("imageTitle"));
|
||||
element = document.getElementById("imagesTab");
|
||||
element2.selectedTab = element;
|
||||
element = document.getElementById("serversTab");
|
||||
element.setAttribute("hidden","true" );
|
||||
element = document.getElementById("cookiesTab");
|
||||
element.setAttribute("hidden","true" );
|
||||
}
|
||||
} catch(e) {
|
||||
}
|
||||
} catch (ex) {
|
||||
dump("failed to get prefs service!\n");
|
||||
pref = null;
|
||||
} catch(e) {
|
||||
}
|
||||
|
||||
|
||||
// load in the cookies and permissions
|
||||
cookiesOutliner = document.getElementById("cookiesOutliner");
|
||||
permissionsOutliner = document.getElementById("permissionsOutliner");
|
||||
loadCookies();
|
||||
loadPermissions();
|
||||
|
||||
window.sizeToContent();
|
||||
}
|
||||
|
||||
/*** =================== COOKIES CODE =================== ***/
|
||||
|
||||
// function : <CookieViewer.js>::AddCookieToList();
|
||||
// purpose : creates an array of cookie objects
|
||||
function AddCookieToList(count, name, value, isDomain, host, path, isSecure, expires) {
|
||||
cookies[count] = new Cookie();
|
||||
cookies[count].number = count;
|
||||
cookies[count].name = name;
|
||||
cookies[count].value = value;
|
||||
cookies[count].isDomain = isDomain;
|
||||
cookies[count].host = host;
|
||||
cookies[count].path = path;
|
||||
cookies[count].isSecure = isSecure;
|
||||
cookies[count].expires = expires;
|
||||
var cookiesOutlinerView = {
|
||||
rowCount : 0,
|
||||
setOutliner : function(outliner){},
|
||||
getCellText : function(row,column){
|
||||
var rv;
|
||||
if (column=="domainCol") {
|
||||
rv = cookies[row].rawHost;
|
||||
} else { // must be "nameCol"
|
||||
rv = cookies[row].name;
|
||||
}
|
||||
return rv;
|
||||
},
|
||||
isSeparator : function(index) {return false;},
|
||||
isContainer : function(index) {return false;},
|
||||
cycleHeader : function(aColId, aElt) {},
|
||||
getRowProperties : function(row,column,prop){},
|
||||
getColumnProperties : function(column,columnElement,prop){},
|
||||
getCellProperties : function(row,prop){},
|
||||
};
|
||||
var cookiesOutliner;
|
||||
|
||||
function Cookie(number,name,value,isDomain,host,rawHost,path,isSecure,expires) {
|
||||
this.number = number;
|
||||
this.name = name;
|
||||
this.value = value;
|
||||
this.isDomain = isDomain;
|
||||
this.host = host;
|
||||
this.rawHost = rawHost;
|
||||
this.path = path;
|
||||
this.isSecure = isSecure;
|
||||
this.expires = expires;
|
||||
}
|
||||
|
||||
// function : <CookieViewer.js>::Cookie();
|
||||
// purpose : an home-brewed object that represents a individual cookie in the stream
|
||||
function Cookie(number,name,value,isDomain,host,path,isSecure,expires)
|
||||
{
|
||||
this.number = ( number ) ? number : null;
|
||||
this.name = ( name ) ? name : null;
|
||||
this.value = ( value ) ? value : null;
|
||||
this.isDomain = ( isDomain ) ? isDomain : null;
|
||||
this.host = ( host ) ? host : null;
|
||||
this.path = ( path ) ? path : null;
|
||||
this.isSecure = ( isSecure ) ? isSecure : null;
|
||||
this.expires = ( expires ) ? expires : null;
|
||||
}
|
||||
|
||||
|
||||
// function : <CookieViewer.js>::loadCookies();
|
||||
// purpose : loads the list of cookies into the cookie list treeview
|
||||
function loadCookies()
|
||||
{
|
||||
var cookieString;
|
||||
var cookieArray = [];
|
||||
|
||||
function loadCookies() {
|
||||
// load cookies into a table
|
||||
var enumerator = cookiemanager.enumerator;
|
||||
var count = 0;
|
||||
while (enumerator.hasMoreElements()) {
|
||||
var nextCookie = enumerator.getNext();
|
||||
nextCookie = nextCookie.QueryInterface(Components.interfaces.nsICookie);
|
||||
|
||||
var name = nextCookie.name;
|
||||
var value = nextCookie.value;
|
||||
var isDomain = nextCookie.isDomain;
|
||||
var host = nextCookie.host;
|
||||
var path = nextCookie.path;
|
||||
var isSecure = nextCookie.isSecure;
|
||||
var expires = nextCookie.expires;
|
||||
|
||||
AddCookieToList
|
||||
(count, name, value, isDomain, host, path, isSecure, expires);
|
||||
if(host.charAt(0) == ".") { // get rid of the ugly dot on the start of some domains
|
||||
host = host.substring(1,host.length);
|
||||
}
|
||||
AddItem("cookieList", [host, name], "cookietree_", count++);
|
||||
cookies[count] =
|
||||
new Cookie(count++, nextCookie.name, nextCookie.value, nextCookie.isDomain, host,
|
||||
(host.charAt(0)==".") ? host.substring(1,host.length) : host,
|
||||
nextCookie.path, nextCookie.isSecure, nextCookie.expires);
|
||||
}
|
||||
Wallet_ColumnSort('0', 'cookieList');
|
||||
if (count == 0) {
|
||||
cookiesOutlinerView.rowCount = cookies.length;
|
||||
|
||||
// sort and display the table
|
||||
cookiesOutliner.outlinerBoxObject.view = cookiesOutlinerView;
|
||||
CookieColumnSort('rawHost');
|
||||
|
||||
// disable "remove all cookies" button if there are no cookies
|
||||
if (cookies.length == 0) {
|
||||
document.getElementById("removeAllCookies").setAttribute("disabled","true");
|
||||
}
|
||||
}
|
||||
|
||||
function CookieColumnSort(column) {
|
||||
var number, cookie, id;
|
||||
var cookietree = document.getElementById("cookietree");
|
||||
var selected = cookietree.selectedIndex;
|
||||
var cookielist = document.getElementById('cookieList');
|
||||
var childnodes = cookielist.childNodes;
|
||||
|
||||
if (selected >= 0) {
|
||||
cookie = childnodes[selected];
|
||||
id = cookie.getAttribute("id");
|
||||
number = parseInt(id.substring("cookietree_".length,id.length));
|
||||
function GetExpiresString(expires) {
|
||||
if (expires) {
|
||||
var date = new Date(1000*expires);
|
||||
return gDateService.FormatDateTime("", gDateService.dateFormatLong,
|
||||
gDateService.timeFormatSeconds, date.getFullYear(),
|
||||
date.getMonth()+1, date.getDate(), date.getHours(),
|
||||
date.getMinutes(), date.getSeconds());
|
||||
}
|
||||
|
||||
Wallet_ColumnSort(column, 'cookieList');
|
||||
|
||||
var length = childnodes.length;
|
||||
if (selected >= 0) {
|
||||
for (i=0; i<length; i++){
|
||||
cookie = childnodes[i];
|
||||
id = cookie.getAttribute("id");
|
||||
var thisNumber = parseInt(id.substring("cookietree_".length,id.length));
|
||||
if (thisNumber == number) {
|
||||
cookietree.selectedIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return cookieBundle.getString("AtEndOfSession");
|
||||
}
|
||||
|
||||
// function : <CookieViewer.js>::ViewSelectedCookie();
|
||||
// purpose : displays information about the selected cookie in the info fieldset
|
||||
function ViewCookieSelected( e )
|
||||
{
|
||||
var cookie = null;
|
||||
var cookietree = document.getElementById("cookietree");
|
||||
var selItemsMax = false;
|
||||
if(cookietree.nodeName != "tree")
|
||||
return false;
|
||||
if(cookietree.selectedItems.length > 1)
|
||||
selItemsMax = true;
|
||||
if( cookietree.selectedItems.length )
|
||||
document.getElementById("removeCookies").removeAttribute("disabled","true");
|
||||
|
||||
if( ( e.type == "keypress" || e.type == "select" ) && e.target.selectedItems.length )
|
||||
cookie = cookietree.selectedItems[0];
|
||||
if( e.type == "click" )
|
||||
cookie = e.target.parentNode.parentNode;
|
||||
|
||||
if( !cookie || cookie.getAttribute("id").indexOf("cookietree_") == -1)
|
||||
return false;
|
||||
var idx = parseInt(cookie.getAttribute("id").substring("cookietree_".length,cookie.getAttribute("id").length));
|
||||
for (var x=0; x<cookies.length; x++) {
|
||||
if (cookies[x].number == idx) {
|
||||
idx = x;
|
||||
break;
|
||||
}
|
||||
function CookieSelected() {
|
||||
var selections = GetOutlinerSelections(cookiesOutliner);
|
||||
if (selections.length) {
|
||||
document.getElementById("removeCookie").removeAttribute("disabled");
|
||||
} else {
|
||||
ClearCookieProperties();
|
||||
return;
|
||||
}
|
||||
var props = [cookies[idx].number, cookies[idx].name, cookies[idx].value,
|
||||
cookies[idx].isDomain, cookies[idx].host, cookies[idx].path,
|
||||
cookies[idx].isSecure, cookies[idx].expires];
|
||||
|
||||
var idx = selections[0];
|
||||
var props = [
|
||||
{id: "ifl_name", value: cookies[idx].name},
|
||||
{id: "ifl_value", value: cookies[idx].value},
|
||||
{id: "ifl_isDomain",
|
||||
value: cookies[idx].isDomain ?
|
||||
cookieBundle.getString("domainColon") : cookieBundle.getString("hostColon")},
|
||||
{id: "ifl_host", value: cookies[idx].host},
|
||||
{id: "ifl_path", value: cookies[idx].path},
|
||||
{id: "ifl_isSecure",
|
||||
value: cookies[idx].isSecure ?
|
||||
cookieBundle.getString("yes") : cookieBundle.getString("no")},
|
||||
{id: "ifl_expires", value: GetExpiresString(cookies[idx].expires)}
|
||||
];
|
||||
|
||||
var rows =
|
||||
[null,"ifl_name","ifl_value","ifl_isDomain","ifl_host","ifl_path","ifl_isSecure","ifl_expires"];
|
||||
var value;
|
||||
var field;
|
||||
for(var i = 1; i < props.length; i++)
|
||||
for (var i = 0; i < props.length; i++)
|
||||
{
|
||||
if(rows[i] == "ifl_isDomain") {
|
||||
field = document.getElementById("ifl_isDomain");
|
||||
value = cookies[idx].isDomain ?
|
||||
bundle.GetStringFromName("domainColon") :
|
||||
bundle.GetStringFromName("hostColon");
|
||||
} else if (rows[i] == "ifl_isSecure") {
|
||||
field = document.getElementById("ifl_isSecure");
|
||||
value = cookies[idx].isSecure ?
|
||||
bundle.GetStringFromName("yes") : bundle.GetStringFromName("no");
|
||||
} else if (rows[i] == "ifl_expires") {
|
||||
field = document.getElementById("ifl_expires");
|
||||
var date = new Date(1000*cookies[idx].expires);
|
||||
var localetimestr = gDateService.FormatDateTime(
|
||||
"", gDateService.dateFormatLong,
|
||||
gDateService.timeFormatSeconds,
|
||||
date.getFullYear(), date.getMonth()+1,
|
||||
date.getDate(), date.getHours(),
|
||||
date.getMinutes(), date.getSeconds());
|
||||
value = cookies[idx].expires
|
||||
? localetimestr
|
||||
//? date.toLocaleString()
|
||||
: bundle.GetStringFromName("AtEndOfSession");
|
||||
} else {
|
||||
field = document.getElementById(rows[i]);
|
||||
value = props[i];
|
||||
}
|
||||
if (selItemsMax && rows[i] != "ifl_isDomain") {
|
||||
field = document.getElementById(props[i].id);
|
||||
if ((selections.length > 1) && (props[i].id != "ifl_isDomain")) {
|
||||
value = ""; // clear field if multiple selections
|
||||
} else {
|
||||
value = props[i].value;
|
||||
}
|
||||
field.setAttribute("value", value);
|
||||
if(rows[i] == "ifl_expires") break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// function : <CookieViewer.js>::DeleteCookieSelected();
|
||||
// purpose : deletes all the cookies that are selected
|
||||
function DeleteCookieSelected() {
|
||||
// delete selected item
|
||||
var cookietree = document.getElementById("cookietree");
|
||||
deleted_cookies_count += cookietree.selectedItems.length;
|
||||
var newIndex = cookietree.selectedIndex;
|
||||
gone_c += DeleteItemSelected("cookietree", "cookietree_", "cookieList");
|
||||
// set fields
|
||||
var rows = ["ifl_name","ifl_value","ifl_host","ifl_path","ifl_isSecure","ifl_expires"];
|
||||
for(var k = 0; k < rows.length; k++)
|
||||
{
|
||||
var row = document.getElementById(rows[k]);
|
||||
row.setAttribute("value","");
|
||||
}
|
||||
var netCookieCount = cookies.length - deleted_cookies_count;
|
||||
if (netCookieCount) {
|
||||
cookietree.selectedIndex =
|
||||
(newIndex < netCookieCount) ? newIndex : netCookieCount-1;
|
||||
}
|
||||
if( !cookietree.selectedItems.length ) {
|
||||
if( !document.getElementById("removeCookies").disabled ) {
|
||||
document.getElementById("removeCookies").setAttribute("disabled", "true")
|
||||
}
|
||||
}
|
||||
if (netCookieCount <= 0) {
|
||||
document.getElementById("removeAllCookies").setAttribute("disabled","true");
|
||||
function ClearCookieProperties() {
|
||||
var properties =
|
||||
["ifl_name","ifl_value","ifl_host","ifl_path","ifl_isSecure","ifl_expires"];
|
||||
for (var prop=0; prop<properties.length; prop++) {
|
||||
document.getElementById(properties[prop]).setAttribute("value","");
|
||||
}
|
||||
}
|
||||
|
||||
function DeleteCookie() {
|
||||
DeleteSelectedItemFromOutliner(cookiesOutliner, cookiesOutlinerView,
|
||||
cookies, deletedCookies,
|
||||
"removeCookie", "removeAllCookies");
|
||||
if (!cookies.length) {
|
||||
ClearCookieProperties();
|
||||
}
|
||||
}
|
||||
|
||||
// function : <CookieViewer.js>::DeleteAllCookies();
|
||||
// purpose : deletes all the cookies
|
||||
function DeleteAllCookies() {
|
||||
// delete selected item
|
||||
gone_c += DeleteAllItems(cookies.length, "cookietree_", "cookieList");
|
||||
// set fields
|
||||
var rows = ["ifl_name","ifl_value","ifl_host","ifl_path","ifl_isSecure","ifl_expires"];
|
||||
for(var k = 0; k < rows.length; k++)
|
||||
{
|
||||
var row = document.getElementById(rows[k]);
|
||||
row.setAttribute("value","");
|
||||
}
|
||||
if( !document.getElementById("removeCookies").disabled ) {
|
||||
document.getElementById("removeCookies").setAttribute("disabled", "true")
|
||||
}
|
||||
document.getElementById("removeAllCookies").setAttribute("disabled","true");
|
||||
ClearCookieProperties();
|
||||
DeleteAllFromOutliner(cookiesOutliner, cookiesOutlinerView,
|
||||
cookies, deletedCookies,
|
||||
"removeCookie", "removeAllCookies");
|
||||
}
|
||||
|
||||
// keypress pass-thru
|
||||
function HandleKeyPress( e )
|
||||
{
|
||||
switch ( e.keyCode )
|
||||
{
|
||||
case 13: // enter
|
||||
case 32: // spacebar
|
||||
ViewCookieSelected( e );
|
||||
break;
|
||||
case 46: // delete
|
||||
DeleteCookieSelected();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
function HandleCookieKeyPress(e) {
|
||||
if (e.keyCode == 46) {
|
||||
DeleteCookie();
|
||||
}
|
||||
}
|
||||
|
||||
// will restore deleted cookies when I get around to filling it in.
|
||||
function RestoreCookies()
|
||||
{
|
||||
// todo
|
||||
var lastCookieSortColumn = "";
|
||||
var lastCookieSortAscending = false;
|
||||
|
||||
function CookieColumnSort(column) {
|
||||
lastCookieSortAscending =
|
||||
SortOutliner(cookiesOutliner, cookiesOutlinerView, cookies,
|
||||
column, lastCookieSortColumn, lastCookieSortAscending);
|
||||
lastCookieSortColumn = column;
|
||||
}
|
||||
|
||||
/*** =================== PERMISSIONS CODE =================== ***/
|
||||
|
||||
// function : <CookieViewer.js>::AddPermissionToList();
|
||||
// purpose : creates an array of permission objects
|
||||
function AddPermissionToList(count, host, type, capability) {
|
||||
if (type == cookieType) {
|
||||
cpermissions[count] = new Permission();
|
||||
cpermissions[count].number = count;
|
||||
cpermissions[count].host = host;
|
||||
cpermissions[count].type = type;
|
||||
cpermissions[count].capability = capability;
|
||||
} else if (type == imageType) {
|
||||
ipermissions[count] = new Permission();
|
||||
ipermissions[count].number = count;
|
||||
ipermissions[count].host = host;
|
||||
ipermissions[count].type = type;
|
||||
ipermissions[count].capability = capability;
|
||||
}
|
||||
var permissionsOutlinerView = {
|
||||
rowCount : 0,
|
||||
setOutliner : function(outliner){},
|
||||
getCellText : function(row,column){
|
||||
var rv;
|
||||
if (column=="siteCol") {
|
||||
rv = permissions[row].rawHost;
|
||||
} else { // must be "statusCol"
|
||||
rv = permissions[row].capability;
|
||||
}
|
||||
return rv;
|
||||
},
|
||||
isSeparator : function(index) {return false;},
|
||||
isContainer : function(index) {return false;},
|
||||
cycleHeader : function(aColId, aElt) {},
|
||||
getRowProperties : function(row,column,prop){},
|
||||
getColumnProperties : function(column,columnElement,prop){},
|
||||
getCellProperties : function(row,prop){},
|
||||
};
|
||||
var permissionsOutliner;
|
||||
|
||||
function Permission(number, host, rawHost, type, capability) {
|
||||
this.number = number;
|
||||
this.host = host;
|
||||
this.rawHost = rawHost;
|
||||
this.type = type;
|
||||
this.capability = capability;
|
||||
}
|
||||
|
||||
// function : <CookieViewer.js>::Permission();
|
||||
// purpose : an home-brewed object that represents a individual permission in the stream
|
||||
function Permission(number, host, type, capability)
|
||||
{
|
||||
this.number = (number) ? number : null;
|
||||
this.host = (host) ? host : null;
|
||||
this.type = (type) ? type : null;
|
||||
this.capability = (capability) ? capability : null;
|
||||
}
|
||||
|
||||
// function : <CookieViewer.js>::loadPermissions();
|
||||
// purpose : loads the list of permissions into the permission list treeview
|
||||
function loadPermissions()
|
||||
{
|
||||
var permissionString;
|
||||
var permissionArray = [];
|
||||
|
||||
function loadPermissions() {
|
||||
// load permissions into a table
|
||||
var enumerator = permissionmanager.enumerator;
|
||||
var count = 0;
|
||||
var contentStr;
|
||||
while (enumerator.hasMoreElements()) {
|
||||
var nextPermission = enumerator.getNext();
|
||||
nextPermission = nextPermission.QueryInterface(Components.interfaces.nsIPermission);
|
||||
|
||||
var host = nextPermission.host;
|
||||
var type = nextPermission.type;
|
||||
var capability = nextPermission.capability;
|
||||
if(host.charAt(0) == ".") { // get rid of the ugly dot on the start of some domains
|
||||
host = host.substring(1,host.length);
|
||||
}
|
||||
if (type == cookieType) {
|
||||
contentStr = bundle.GetStringFromName(capability ? "can" : "cannot");
|
||||
AddPermissionToList(cookie_permissions_count, host, type, capability);
|
||||
AddItem("cookiePermList", [host, contentStr], "cookiepermtree_", cookie_permissions_count++);
|
||||
} else if (type == imageType) {
|
||||
contentStr = bundle.GetStringFromName(capability ? "canImages" : "cannotImages");
|
||||
AddPermissionToList(image_permissions_count, host, type, capability);
|
||||
AddItem("imagePermList", [host, contentStr], "imagepermtree_", image_permissions_count++);
|
||||
if (nextPermission.type == (isImages ? imageType : cookieType)) {
|
||||
var host = nextPermission.host;
|
||||
permissions[count] =
|
||||
new Permission(count++, host,
|
||||
(host.charAt(0)==".") ? host.substring(1,host.length) : host,
|
||||
nextPermission.type,
|
||||
cookieBundle.getString(nextPermission.capability?"can":"cannot"));
|
||||
}
|
||||
}
|
||||
if (cookie_permissions_count == 0) {
|
||||
permissionsOutlinerView.rowCount = permissions.length;
|
||||
|
||||
// sort and display the table
|
||||
permissionsOutliner.outlinerBoxObject.view = permissionsOutlinerView;
|
||||
PermissionColumnSort('rawHost');
|
||||
|
||||
// disable "remove all" button if there are no cookies/images
|
||||
if (permissions.length == 0) {
|
||||
document.getElementById("removeAllPermissions").setAttribute("disabled","true");
|
||||
}
|
||||
if (image_permissions_count == 0) {
|
||||
document.getElementById("removeAllImages").setAttribute("disabled","true");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function ViewCookiePermissionSelected()
|
||||
{
|
||||
var cookiepermtree = document.getElementById("cookiepermissionstree");
|
||||
if( cookiepermtree.selectedItems.length )
|
||||
document.getElementById("removePermissions").removeAttribute("disabled","true");
|
||||
}
|
||||
|
||||
function DeleteCookiePermissionSelected()
|
||||
{
|
||||
var cookiepermissiontree = document.getElementById("cookiepermissionstree");
|
||||
deleted_cookie_permissions_count += cookiepermissiontree.selectedItems.length;
|
||||
var newIndex = cookiepermissiontree.selectedIndex;
|
||||
gone_p += DeleteItemSelected('cookiepermissionstree', 'cookiepermtree_', 'cookiePermList');
|
||||
var netCookiePermissionCount =
|
||||
cookie_permissions_count - deleted_cookie_permissions_count;
|
||||
if (netCookiePermissionCount) {
|
||||
cookiepermissiontree.selectedIndex =
|
||||
(newIndex < netCookiePermissionCount) ? newIndex : netCookiePermissionCount-1;
|
||||
}
|
||||
if( !cookiepermissiontree.selectedItems.length ) {
|
||||
if( !document.getElementById("removePermissions").disabled ) {
|
||||
document.getElementById("removePermissions").setAttribute("disabled", "true")
|
||||
}
|
||||
}
|
||||
if (netCookiePermissionCount <= 0) {
|
||||
document.getElementById("removeAllPermissions").setAttribute("disabled","true");
|
||||
function PermissionSelected() {
|
||||
var selections = GetOutlinerSelections(permissionsOutliner);
|
||||
if (selections.length) {
|
||||
document.getElementById("removePermission").removeAttribute("disabled");
|
||||
}
|
||||
}
|
||||
|
||||
function DeleteAllCookiePermissions() {
|
||||
// delete selected item
|
||||
gone_p += DeleteAllItems(cookie_permissions_count, "cookiepermtree_", "cookiePermList");
|
||||
if( !document.getElementById("removePermissions").disabled ) {
|
||||
document.getElementById("removePermissions").setAttribute("disabled", "true")
|
||||
}
|
||||
document.getElementById("removeAllPermissions").setAttribute("disabled","true");
|
||||
function DeletePermission() {
|
||||
DeleteSelectedItemFromOutliner(permissionsOutliner, permissionsOutlinerView,
|
||||
permissions, deletedPermissions,
|
||||
"removePermission", "removeAllPermissions");
|
||||
}
|
||||
|
||||
/*** =================== IMAGES CODE =================== ***/
|
||||
|
||||
function ViewImagePermissionSelected()
|
||||
{
|
||||
var imagepermtree = document.getElementById("imagepermissionstree");
|
||||
if( imagepermtree.selectedItems.length )
|
||||
document.getElementById("removeImages").removeAttribute("disabled","true");
|
||||
function DeleteAllPermissions() {
|
||||
DeleteAllFromOutliner(permissionsOutliner, permissionsOutlinerView,
|
||||
permissions, deletedPermissions,
|
||||
"removePermission", "removeAllPermissions");
|
||||
}
|
||||
|
||||
function DeleteImagePermissionSelected()
|
||||
{
|
||||
var imagepermissiontree = document.getElementById("imagepermissionstree");
|
||||
deleted_image_permissions_count += imagepermissiontree.selectedItems.length;
|
||||
var newIndex = imagepermissiontree.selectedIndex;
|
||||
gone_i += DeleteItemSelected('imagepermissionstree', 'imagepermtree_', 'imagePermList');
|
||||
var netImagePermissionCount =
|
||||
image_permissions_count - deleted_image_permissions_count;
|
||||
if (netImagePermissionCount) {
|
||||
imagepermissiontree.selectedIndex =
|
||||
(newIndex < netImagePermissionCount) ? newIndex : netImagePermissionCount-1;
|
||||
}
|
||||
if( !imagepermissiontree.selectedItems.length ) {
|
||||
if( !document.getElementById("removeImages").disabled ) {
|
||||
document.getElementById("removeImages").setAttribute("disabled", "true")
|
||||
}
|
||||
}
|
||||
if (netImagePermissionCount <= 0) {
|
||||
document.getElementById("removeAllImages").setAttribute("disabled","true");
|
||||
function HandlePermissionKeyPress(e) {
|
||||
if (e.keyCode == 46) {
|
||||
DeletePermission();
|
||||
}
|
||||
}
|
||||
|
||||
function DeleteAllImagePermissions() {
|
||||
// delete selected item
|
||||
gone_i += DeleteAllItems(image_permissions_count, "imagepermtree_", "imagePermList");
|
||||
if( !document.getElementById("removeImages").disabled ) {
|
||||
document.getElementById("removeImages").setAttribute("disabled", "true")
|
||||
}
|
||||
document.getElementById("removeAllImages").setAttribute("disabled","true");
|
||||
var lastPermissionSortColumn = "";
|
||||
var lastPermissionSortAscending = false;
|
||||
|
||||
function PermissionColumnSort(column) {
|
||||
lastPermissionSortAscending =
|
||||
SortOutliner(permissionsOutliner, permissionsOutlinerView, permissions,
|
||||
column, lastPermissionSortColumn, lastPermissionSortAscending);
|
||||
lastPermissionSortColumn = column;
|
||||
}
|
||||
|
||||
/*** =================== GENERAL CODE =================== ***/
|
||||
|
||||
// function : <CookieViewer.js>::onAccept();
|
||||
// purpose : saves the changed settings and closes the dialog.
|
||||
function onAccept(){
|
||||
function onAccept() {
|
||||
|
||||
var deletedCookies = [];
|
||||
deletedCookies = gone_c.split(",");
|
||||
var cookieCount;
|
||||
for (cookieCount=0; cookieCount<deletedCookies.length-1; cookieCount++) {
|
||||
var index = parseInt(deletedCookies[cookieCount]);
|
||||
cookiemanager.remove(cookies[index].host, cookies[index].name, cookies[index].path,
|
||||
for (var c=0; c<deletedCookies.length; c++) {
|
||||
cookiemanager.remove(deletedCookies[c].host,
|
||||
deletedCookies[c].name,
|
||||
deletedCookies[c].path,
|
||||
document.getElementById("checkbox").checked);
|
||||
}
|
||||
|
||||
var deletedCookiePermissions = [];
|
||||
deletedCookiePermissions = gone_p.split(",");
|
||||
var cperm_count;
|
||||
for (cperm_count=0;
|
||||
cperm_count<deletedCookiePermissions.length-1;
|
||||
cperm_count++) {
|
||||
permissionmanager.remove
|
||||
(cpermissions[parseInt(deletedCookiePermissions[cperm_count])].host, cookieType);
|
||||
for (var p=0; p<deletedPermissions.length; p++) {
|
||||
permissionmanager.remove(deletedPermissions[p].host, deletedPermissions[p].type);
|
||||
}
|
||||
|
||||
var deletedImagePermissions = [];
|
||||
deletedImagePermissions = gone_i.split(",");
|
||||
var iperm_count;
|
||||
for (iperm_count=0;
|
||||
iperm_count<deletedImagePermissions.length-1;
|
||||
iperm_count++) {
|
||||
permissionmanager.remove
|
||||
(ipermissions[parseInt(deletedImagePermissions[iperm_count])].host, imageType);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/*** =================== TREE MANAGEMENT CODE =================== ***/
|
||||
|
||||
// function : <CookieViewer.js>::AddItem();
|
||||
// purpose : utility function for adding items to a tree.
|
||||
function AddItem(children,cells,prefix,idfier)
|
||||
{
|
||||
var kids = document.getElementById(children);
|
||||
var item = document.createElement("treeitem");
|
||||
var row = document.createElement("treerow");
|
||||
for(var i = 0; i < cells.length; i++)
|
||||
{
|
||||
var cell = document.createElement("treecell");
|
||||
cell.setAttribute("class", "propertylist");
|
||||
cell.setAttribute("label", cells[i])
|
||||
row.appendChild(cell);
|
||||
}
|
||||
item.appendChild(row);
|
||||
item.setAttribute("id",prefix + idfier);
|
||||
kids.appendChild(item);
|
||||
}
|
||||
|
||||
// function : <CookieViewer.js>::DeleteItemSelected();
|
||||
// purpose : deletes all the signons that are selected
|
||||
function DeleteItemSelected(tree, prefix, kids) {
|
||||
var i;
|
||||
var delnarray = [];
|
||||
var rv = "";
|
||||
var cookietree = document.getElementById(tree);
|
||||
var selitems = cookietree.selectedItems;
|
||||
for(i = 0; i < selitems.length; i++)
|
||||
{
|
||||
delnarray[i] = document.getElementById(selitems[i].getAttribute("id"));
|
||||
var itemid = parseInt(selitems[i].getAttribute("id").substring(prefix.length,selitems[i].getAttribute("id").length));
|
||||
rv += (itemid + ",");
|
||||
}
|
||||
for(i = 0; i < delnarray.length; i++)
|
||||
{
|
||||
document.getElementById(kids).removeChild(delnarray[i]);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
// function : <CookieViewer.js>::DeleteAllItems();
|
||||
// purpose : deletes all the items
|
||||
function DeleteAllItems(length, prefix, kids) {
|
||||
var delnarray = [];
|
||||
var rv = "";
|
||||
for(var i = 0; i < length; i++)
|
||||
{
|
||||
if (document.getElementById(prefix+i) != null) {
|
||||
document.getElementById(kids).removeChild(document.getElementById(prefix+i));
|
||||
rv += (i + ",");
|
||||
}
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
@ -32,3 +32,5 @@ domainColon=Domain:
|
||||
yes=yes
|
||||
no=no
|
||||
AtEndOfSession = at end of session
|
||||
tabBannedImages=Image Sites
|
||||
textBannedImages=Sites from which images are or are not loaded.
|
||||
|
||||
@ -40,39 +40,27 @@
|
||||
<script src="chrome://communicator/content/wallet/nsWalletTreeUtils.js"/>
|
||||
|
||||
<keyset id="dialogKeys"/>
|
||||
<stringbundle id="cookieBundle"
|
||||
src="chrome://communicator/locale/wallet/CookieViewer.properties"/>
|
||||
|
||||
<tabbox id="tabbox" flex="1">
|
||||
<tabs>
|
||||
<tab id="cookiesTab" label="&tab.cookiesonsystem.label;"/>
|
||||
<tab id="serversTab" label="&tab.bannedservers.label;"/>
|
||||
<tab id="imagesTab" hidden="true" label="&tab.bannedimages.label;"/>
|
||||
<tab id="permissionsTab" label="&tab.bannedservers.label;"/>
|
||||
</tabs>
|
||||
<tabpanels id="panel" flex="1">
|
||||
<vbox class="tabpanel" id="system" flex="1">
|
||||
<label value="&div.cookiesonsystem.label;"/>
|
||||
<separator class="thin"/>
|
||||
<tree id="cookietree" style="height: 10em;"
|
||||
multiple="true" onselect="ViewCookieSelected(event);"
|
||||
onclick="ViewCookieSelected(event)" flex="1"
|
||||
onkeypress="HandleKeyPress(event)">
|
||||
<treecolgroup>
|
||||
<treecol flex="3" width="0"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol flex="7" width="0"/>
|
||||
</treecolgroup>
|
||||
<treehead>
|
||||
<treerow>
|
||||
<treecell class="treecell-header sortDirectionIndicator"
|
||||
label="&treehead.cookiedomain.label;"
|
||||
onclick="return CookieColumnSort('0', 'cookieList');"/>
|
||||
<treecell class="treecell-header
|
||||
sortDirectionIndicator"
|
||||
label="&treehead.cookiename.label;"
|
||||
onclick="return CookieColumnSort('1', 'cookieList');"/>
|
||||
</treerow>
|
||||
</treehead>
|
||||
<treechildren id="cookieList" flex="1"/>
|
||||
</tree>
|
||||
<outliner id="cookiesOutliner" flex="1" style="height: 10em;" multiple="true"
|
||||
onkeypress="HandleCookieKeyPress(event)">
|
||||
<outlinercol id="domainCol" label="&treehead.cookiedomain.label;" flex="3"
|
||||
onclick="CookieColumnSort('rawHost');"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<outlinercol id="nameCol" label="&treehead.cookiename.label;" flex="7"
|
||||
onclick="CookieColumnSort('name');"/>
|
||||
<outlinerbody flex="1" onselect="CookieSelected();"/>
|
||||
</outliner>
|
||||
<groupbox>
|
||||
<caption label="&treehead.infoselected.label;"/>
|
||||
<!-- labels -->
|
||||
@ -110,9 +98,9 @@
|
||||
</grid>
|
||||
</groupbox>
|
||||
<hbox>
|
||||
<button id="removeCookies" disabled="true"
|
||||
<button id="removeCookie" disabled="true"
|
||||
label="&button.removecookie.label;"
|
||||
oncommand="DeleteCookieSelected();"/>
|
||||
oncommand="DeleteCookie();"/>
|
||||
<button id="removeAllCookies"
|
||||
label="&button.removeallcookies.label;"
|
||||
oncommand="DeleteAllCookies();"/>
|
||||
@ -125,68 +113,24 @@
|
||||
</vbox>
|
||||
|
||||
<vbox id="servers" flex="1">
|
||||
<label value="&div.bannedservers.label;"/>
|
||||
<description id="permissionsText" value="&div.bannedservers.label;"/>
|
||||
<separator class="thin"/>
|
||||
<tree id="cookiepermissionstree" flex="1"
|
||||
onkeypress="if(event.which == 46) gone_p += DeleteItemSelected('cookiepermissionstree', 'permtree_', 'cookiePermList');"
|
||||
multiple="true" onclick="ViewCookiePermissionSelected();">
|
||||
<treecolgroup>
|
||||
<treecol flex="5" width="0"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol flex="5" width="0"/>
|
||||
</treecolgroup>
|
||||
<treehead>
|
||||
<treerow>
|
||||
<treecell class="treecell-header sortDirectionIndicator"
|
||||
label="&treehead.sitename.label;"
|
||||
onclick="return Wallet_ColumnSort('0', 'cookiePermList');"/>
|
||||
<treecell class="treecell-header sortDirectionIndicator"
|
||||
label="&treehead.status.label;"
|
||||
onclick="return Wallet_ColumnSort('1', 'cookiePermList');"/>
|
||||
</treerow>
|
||||
</treehead>
|
||||
<treechildren flex="1" id="cookiePermList"/>
|
||||
</tree>
|
||||
<outliner id="permissionsOutliner" flex="1" style="height: 10em;" multiple="true"
|
||||
onkeypress="HandlePermissionKeyPress(event)">
|
||||
<outlinercol id="siteCol" label="&treehead.sitename.label;" flex="5"
|
||||
onclick="PermissionColumnSort('rawHost');"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<outlinercol id="statusCol" label="&treehead.status.label;" flex="5"
|
||||
onclick="PermissionColumnSort('capability');"/>
|
||||
<outlinerbody flex="1" onselect="PermissionCookieSelected();"/>
|
||||
</outliner>
|
||||
<hbox>
|
||||
<button id="removePermissions" disabled="true"
|
||||
<button id="removePermission" disabled="true"
|
||||
label="&removepermission.label;"
|
||||
oncommand="DeleteCookiePermissionSelected();"/>
|
||||
oncommand="DeletePermission();"/>
|
||||
<button id="removeAllPermissions"
|
||||
label="&removeallpermissions.label;"
|
||||
oncommand="DeleteAllCookiePermissions();"/>
|
||||
</hbox>
|
||||
</vbox>
|
||||
|
||||
<vbox id="images" hidden="true" flex="1">
|
||||
<label value="&div.bannedimages.label;"/>
|
||||
<separator class="thin"/>
|
||||
<tree id="imagepermissionstree" flex="1" style="height: 0px;"
|
||||
onkeypress="if(event.which == 46) gone_i += DeleteItemSelected('imagepermisionstree', 'imgtree_', 'imagePermList');"
|
||||
multiple="true" onclick="ViewImagePermissionSelected();">
|
||||
<treecolgroup>
|
||||
<treecol flex="5" width="0"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol flex="5" width="0"/>
|
||||
</treecolgroup>
|
||||
<treehead>
|
||||
<treerow>
|
||||
<treecell class="treecell-header sortDirectionIndicator"
|
||||
label="&treehead.sitename.label;"
|
||||
onclick="return Wallet_ColumnSort('0', 'imagePermList');"/>
|
||||
<treecell class="treecell-header sortDirectionIndicator"
|
||||
label="&treehead.status.label;"
|
||||
onclick="return Wallet_ColumnSort('1', 'imagePermList');"/>
|
||||
</treerow>
|
||||
</treehead>
|
||||
<treechildren flex="1" id="imagePermList"/>
|
||||
</tree>
|
||||
<hbox>
|
||||
<button id="removeImages" disabled="true"
|
||||
label="&removeimage.label;"
|
||||
oncommand="DeleteImagePermissionSelected();"/>
|
||||
<button id="removeAllImages"
|
||||
label="&removeallimages.label;"
|
||||
oncommand="DeleteAllImagePermissions();"/>
|
||||
oncommand="DeleteAllPermissions();"/>
|
||||
</hbox>
|
||||
</vbox>
|
||||
|
||||
|
||||
@ -20,87 +20,149 @@
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
var setID=0, setValue=0, getID=0, getValue=0;
|
||||
function Wallet_ColumnSort(columnPosition, childrenName)
|
||||
{
|
||||
//var startTime = new Date();
|
||||
function DeleteAllFromOutliner
|
||||
(outliner, view, table, deletedTable, removeButton, removeAllButton) {
|
||||
|
||||
// determine if sort is to be ascending or descending
|
||||
// it is ascending if it is the first sort for this tree
|
||||
// it is ascending if last sort was on a different column
|
||||
// else it is the opposite of whatever the last sort for this column was
|
||||
var children = document.getElementById(childrenName);
|
||||
var lastColumnPosition = children.getAttribute('lastColumnPosition');
|
||||
var ascending = true;
|
||||
if (columnPosition == lastColumnPosition) {
|
||||
ascending = (children.getAttribute('lastAscending') != 'true');
|
||||
} else {
|
||||
children.setAttribute('lastColumnPosition', columnPosition);
|
||||
// remove all items from table and place in deleted table
|
||||
for (var i=0; i<table.length; i++) {
|
||||
deletedTable[deletedTable.length] = table[i];
|
||||
}
|
||||
children.setAttribute('lastAscending', ascending);
|
||||
bubbleSort(columnPosition, ascending, children);
|
||||
//dump("bubble sort time="+((new Date())-startTime)+"\n");
|
||||
return true;
|
||||
table.length = 0;
|
||||
|
||||
// clear out selections
|
||||
outliner.outlinerBoxObject.view.selection.select(-1);
|
||||
|
||||
// redisplay
|
||||
view.rowCount = 0;
|
||||
outliner.outlinerBoxObject.invalidate();
|
||||
|
||||
|
||||
// disable buttons
|
||||
document.getElementById(removeButton).setAttribute("disabled", "true")
|
||||
document.getElementById(removeAllButton).setAttribute("disabled","true");
|
||||
}
|
||||
|
||||
// XXX we would like to use Array.prototype.sort, but the DOM doesn't let it
|
||||
// XXX swap elements using property sets
|
||||
function bubbleSort(columnPosition, ascending, children)
|
||||
{
|
||||
var a = children.childNodes;
|
||||
var n = a.length, m = n - 1;
|
||||
function DeleteSelectedItemFromOutliner
|
||||
(outliner, view, table, deletedTable, removeButton, removeAllButton) {
|
||||
|
||||
// for efficiencey, read all the value attributes only once and store in an array
|
||||
var keys = [];
|
||||
for (var x=0; x<n; x++){
|
||||
var keyCell = a[x].firstChild.childNodes[columnPosition];
|
||||
keys[x] = keyCell.getAttribute('label');
|
||||
// remove selected items from list (by setting them to null) and place in deleted list
|
||||
var selections = GetOutlinerSelections(outliner);
|
||||
for (var s=selections.length-1; s>= 0; s--) {
|
||||
var i = selections[s];
|
||||
deletedTable[deletedTable.length] = table[i];
|
||||
table[i] = null;
|
||||
}
|
||||
|
||||
for (var i = 0; i < m; i++) {
|
||||
var key = keys[i];
|
||||
// collapse list by removing all the null entries
|
||||
for (var j=0; j<table.length; j++) {
|
||||
if (table[j] == null) {
|
||||
var k = j;
|
||||
while ((k < table.length) && (table[k] == null)) {
|
||||
k++;
|
||||
}
|
||||
table.splice(j, k-j);
|
||||
}
|
||||
}
|
||||
|
||||
// redisplay
|
||||
var box = outliner.outlinerBoxObject;
|
||||
var firstRow = box.getFirstVisibleRow();
|
||||
view.rowCount = table.length;
|
||||
box.rowCountChanged(0, table.length);
|
||||
box.scrollToRow(firstRow)
|
||||
|
||||
// update selection and/or buttons
|
||||
if (table.length) {
|
||||
|
||||
// update selection
|
||||
// note: we need to deselect before reselecting in order to trigger ...Selected method
|
||||
var nextSelection = (selections[0] < table.length) ? selections[0] : table.length-1;
|
||||
outliner.outlinerBoxObject.view.selection.select(-1);
|
||||
outliner.outlinerBoxObject.view.selection.select(nextSelection);
|
||||
|
||||
} else {
|
||||
|
||||
// disable buttons
|
||||
document.getElementById(removeButton).setAttribute("disabled", "true")
|
||||
document.getElementById(removeAllButton).setAttribute("disabled","true");
|
||||
|
||||
// clear out selections
|
||||
outliner.outlinerBoxObject.view.selection.select(-1);
|
||||
}
|
||||
}
|
||||
|
||||
function GetOutlinerSelections(outliner) {
|
||||
var selections = [];
|
||||
var select = outliner.outlinerBoxObject.selection;
|
||||
if (select) {
|
||||
var count = select.getRangeCount();
|
||||
var min = new Object();
|
||||
var max = new Object();
|
||||
for (var i=0; i<count; i++) {
|
||||
select.getRangeAt(i, min, max);
|
||||
for (var k=min.value; k<=max.value; k++) {
|
||||
if (k != -1) {
|
||||
selections[selections.length] = k;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return selections;
|
||||
}
|
||||
|
||||
function SortOutliner(outliner, view, table, column, lastSortColumn, lastSortAscending) {
|
||||
|
||||
// remember which item was selected so we can restore it after the sort
|
||||
var selections = GetOutlinerSelections(outliner);
|
||||
var selectedNumber = selections.length ? table[selections[0]].number : -1;
|
||||
|
||||
// determine if sort is to be ascending or descending
|
||||
var ascending = (column == lastSortColumn) ? !lastSortAscending : true;
|
||||
|
||||
// do the sort
|
||||
BubbleSort(column, ascending, table);
|
||||
|
||||
// restore the selection
|
||||
var selectedRow = -1;
|
||||
if (selectedNumber>=0) {
|
||||
for (var s=0; s<table.length; s++) {
|
||||
if (table[s].number == selectedNumber) {
|
||||
// update selection
|
||||
// note: we need to deselect before reselecting in order to trigger ...Selected()
|
||||
outliner.outlinerBoxObject.view.selection.select(-1);
|
||||
outliner.outlinerBoxObject.view.selection.select(s);
|
||||
selectedRow = s;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// display the results
|
||||
outliner.outlinerBoxObject.invalidate();
|
||||
if (selectedRow>0) {
|
||||
outliner.outlinerBoxObject.ensureRowIsVisible(selectedRow)
|
||||
}
|
||||
|
||||
return ascending;
|
||||
}
|
||||
|
||||
function BubbleSort(columnName, ascending, table) {
|
||||
var len = table.length, len_1 = len - 1;
|
||||
|
||||
for (var i = 0; i < len_1; i++) {
|
||||
var key = table[i][columnName];
|
||||
var winner = -1;
|
||||
for (var j = i + 1; j < n; j++) {
|
||||
var nextKey = keys[j];
|
||||
for (var j = i + 1; j < len; j++) {
|
||||
var nextKey = table[j][columnName];
|
||||
if (ascending ? key > nextKey : key < nextKey) {
|
||||
key = nextKey;
|
||||
winner = j;
|
||||
}
|
||||
}
|
||||
if (winner != -1){
|
||||
|
||||
// get the corresponding menuitems
|
||||
var item = a[i];
|
||||
var row = item.firstChild;
|
||||
var nextItem = a[winner];
|
||||
var nextRow = nextItem.firstChild;
|
||||
|
||||
// swap the row values and the id's of the corresponding menuitems
|
||||
var temp = item.getAttribute('id');
|
||||
item.setAttribute('id', nextItem.getAttribute('id'));
|
||||
nextItem.setAttribute('id', temp);
|
||||
|
||||
var cell = row.firstChild;
|
||||
var nextCell = nextRow.firstChild;
|
||||
var position = 0;
|
||||
while (cell) {
|
||||
var value_i;
|
||||
var value_winner;
|
||||
if (position == columnPosition) {
|
||||
value_i = keys[i];
|
||||
value_winner = keys[winner];
|
||||
keys[i] = value_winner;
|
||||
keys[winner] = value_i;
|
||||
} else {
|
||||
value_i = cell.getAttribute('label');
|
||||
value_winner = nextCell.getAttribute('label');
|
||||
}
|
||||
cell.setAttribute('label', value_winner);
|
||||
nextCell.setAttribute('label', value_i);
|
||||
cell = cell.nextSibling;
|
||||
nextCell = nextCell.nextSibling;
|
||||
position++;
|
||||
}
|
||||
var temp = table[i];
|
||||
table[i] = table[winner];
|
||||
table[winner] = temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -20,87 +20,149 @@
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
var setID=0, setValue=0, getID=0, getValue=0;
|
||||
function Wallet_ColumnSort(columnPosition, childrenName)
|
||||
{
|
||||
//var startTime = new Date();
|
||||
function DeleteAllFromOutliner
|
||||
(outliner, view, table, deletedTable, removeButton, removeAllButton) {
|
||||
|
||||
// determine if sort is to be ascending or descending
|
||||
// it is ascending if it is the first sort for this tree
|
||||
// it is ascending if last sort was on a different column
|
||||
// else it is the opposite of whatever the last sort for this column was
|
||||
var children = document.getElementById(childrenName);
|
||||
var lastColumnPosition = children.getAttribute('lastColumnPosition');
|
||||
var ascending = true;
|
||||
if (columnPosition == lastColumnPosition) {
|
||||
ascending = (children.getAttribute('lastAscending') != 'true');
|
||||
} else {
|
||||
children.setAttribute('lastColumnPosition', columnPosition);
|
||||
// remove all items from table and place in deleted table
|
||||
for (var i=0; i<table.length; i++) {
|
||||
deletedTable[deletedTable.length] = table[i];
|
||||
}
|
||||
children.setAttribute('lastAscending', ascending);
|
||||
bubbleSort(columnPosition, ascending, children);
|
||||
//dump("bubble sort time="+((new Date())-startTime)+"\n");
|
||||
return true;
|
||||
table.length = 0;
|
||||
|
||||
// clear out selections
|
||||
outliner.outlinerBoxObject.view.selection.select(-1);
|
||||
|
||||
// redisplay
|
||||
view.rowCount = 0;
|
||||
outliner.outlinerBoxObject.invalidate();
|
||||
|
||||
|
||||
// disable buttons
|
||||
document.getElementById(removeButton).setAttribute("disabled", "true")
|
||||
document.getElementById(removeAllButton).setAttribute("disabled","true");
|
||||
}
|
||||
|
||||
// XXX we would like to use Array.prototype.sort, but the DOM doesn't let it
|
||||
// XXX swap elements using property sets
|
||||
function bubbleSort(columnPosition, ascending, children)
|
||||
{
|
||||
var a = children.childNodes;
|
||||
var n = a.length, m = n - 1;
|
||||
function DeleteSelectedItemFromOutliner
|
||||
(outliner, view, table, deletedTable, removeButton, removeAllButton) {
|
||||
|
||||
// for efficiencey, read all the value attributes only once and store in an array
|
||||
var keys = [];
|
||||
for (var x=0; x<n; x++){
|
||||
var keyCell = a[x].firstChild.childNodes[columnPosition];
|
||||
keys[x] = keyCell.getAttribute('label');
|
||||
// remove selected items from list (by setting them to null) and place in deleted list
|
||||
var selections = GetOutlinerSelections(outliner);
|
||||
for (var s=selections.length-1; s>= 0; s--) {
|
||||
var i = selections[s];
|
||||
deletedTable[deletedTable.length] = table[i];
|
||||
table[i] = null;
|
||||
}
|
||||
|
||||
for (var i = 0; i < m; i++) {
|
||||
var key = keys[i];
|
||||
// collapse list by removing all the null entries
|
||||
for (var j=0; j<table.length; j++) {
|
||||
if (table[j] == null) {
|
||||
var k = j;
|
||||
while ((k < table.length) && (table[k] == null)) {
|
||||
k++;
|
||||
}
|
||||
table.splice(j, k-j);
|
||||
}
|
||||
}
|
||||
|
||||
// redisplay
|
||||
var box = outliner.outlinerBoxObject;
|
||||
var firstRow = box.getFirstVisibleRow();
|
||||
view.rowCount = table.length;
|
||||
box.rowCountChanged(0, table.length);
|
||||
box.scrollToRow(firstRow)
|
||||
|
||||
// update selection and/or buttons
|
||||
if (table.length) {
|
||||
|
||||
// update selection
|
||||
// note: we need to deselect before reselecting in order to trigger ...Selected method
|
||||
var nextSelection = (selections[0] < table.length) ? selections[0] : table.length-1;
|
||||
outliner.outlinerBoxObject.view.selection.select(-1);
|
||||
outliner.outlinerBoxObject.view.selection.select(nextSelection);
|
||||
|
||||
} else {
|
||||
|
||||
// disable buttons
|
||||
document.getElementById(removeButton).setAttribute("disabled", "true")
|
||||
document.getElementById(removeAllButton).setAttribute("disabled","true");
|
||||
|
||||
// clear out selections
|
||||
outliner.outlinerBoxObject.view.selection.select(-1);
|
||||
}
|
||||
}
|
||||
|
||||
function GetOutlinerSelections(outliner) {
|
||||
var selections = [];
|
||||
var select = outliner.outlinerBoxObject.selection;
|
||||
if (select) {
|
||||
var count = select.getRangeCount();
|
||||
var min = new Object();
|
||||
var max = new Object();
|
||||
for (var i=0; i<count; i++) {
|
||||
select.getRangeAt(i, min, max);
|
||||
for (var k=min.value; k<=max.value; k++) {
|
||||
if (k != -1) {
|
||||
selections[selections.length] = k;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return selections;
|
||||
}
|
||||
|
||||
function SortOutliner(outliner, view, table, column, lastSortColumn, lastSortAscending) {
|
||||
|
||||
// remember which item was selected so we can restore it after the sort
|
||||
var selections = GetOutlinerSelections(outliner);
|
||||
var selectedNumber = selections.length ? table[selections[0]].number : -1;
|
||||
|
||||
// determine if sort is to be ascending or descending
|
||||
var ascending = (column == lastSortColumn) ? !lastSortAscending : true;
|
||||
|
||||
// do the sort
|
||||
BubbleSort(column, ascending, table);
|
||||
|
||||
// restore the selection
|
||||
var selectedRow = -1;
|
||||
if (selectedNumber>=0) {
|
||||
for (var s=0; s<table.length; s++) {
|
||||
if (table[s].number == selectedNumber) {
|
||||
// update selection
|
||||
// note: we need to deselect before reselecting in order to trigger ...Selected()
|
||||
outliner.outlinerBoxObject.view.selection.select(-1);
|
||||
outliner.outlinerBoxObject.view.selection.select(s);
|
||||
selectedRow = s;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// display the results
|
||||
outliner.outlinerBoxObject.invalidate();
|
||||
if (selectedRow>0) {
|
||||
outliner.outlinerBoxObject.ensureRowIsVisible(selectedRow)
|
||||
}
|
||||
|
||||
return ascending;
|
||||
}
|
||||
|
||||
function BubbleSort(columnName, ascending, table) {
|
||||
var len = table.length, len_1 = len - 1;
|
||||
|
||||
for (var i = 0; i < len_1; i++) {
|
||||
var key = table[i][columnName];
|
||||
var winner = -1;
|
||||
for (var j = i + 1; j < n; j++) {
|
||||
var nextKey = keys[j];
|
||||
for (var j = i + 1; j < len; j++) {
|
||||
var nextKey = table[j][columnName];
|
||||
if (ascending ? key > nextKey : key < nextKey) {
|
||||
key = nextKey;
|
||||
winner = j;
|
||||
}
|
||||
}
|
||||
if (winner != -1){
|
||||
|
||||
// get the corresponding menuitems
|
||||
var item = a[i];
|
||||
var row = item.firstChild;
|
||||
var nextItem = a[winner];
|
||||
var nextRow = nextItem.firstChild;
|
||||
|
||||
// swap the row values and the id's of the corresponding menuitems
|
||||
var temp = item.getAttribute('id');
|
||||
item.setAttribute('id', nextItem.getAttribute('id'));
|
||||
nextItem.setAttribute('id', temp);
|
||||
|
||||
var cell = row.firstChild;
|
||||
var nextCell = nextRow.firstChild;
|
||||
var position = 0;
|
||||
while (cell) {
|
||||
var value_i;
|
||||
var value_winner;
|
||||
if (position == columnPosition) {
|
||||
value_i = keys[i];
|
||||
value_winner = keys[winner];
|
||||
keys[i] = value_winner;
|
||||
keys[winner] = value_i;
|
||||
} else {
|
||||
value_i = cell.getAttribute('label');
|
||||
value_winner = nextCell.getAttribute('label');
|
||||
}
|
||||
cell.setAttribute('label', value_winner);
|
||||
nextCell.setAttribute('label', value_i);
|
||||
cell = cell.nextSibling;
|
||||
nextCell = nextCell.nextSibling;
|
||||
position++;
|
||||
}
|
||||
var temp = table[i];
|
||||
table[i] = table[winner];
|
||||
table[winner] = temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -24,52 +24,45 @@
|
||||
|
||||
/*** =================== INITIALISATION CODE =================== ***/
|
||||
|
||||
// globals
|
||||
// interface variables
|
||||
var signonviewer = null;
|
||||
var passwordmanager = null;
|
||||
|
||||
// password-manager lists
|
||||
var signons = [];
|
||||
var rejects = [];
|
||||
var nopreviewList = [];
|
||||
var nocaptureList = [];
|
||||
var goneSS = ""; // signon
|
||||
var goneIS = ""; // ignored site
|
||||
var deletedSignons = [];
|
||||
var deletedRejects = [];
|
||||
|
||||
// form-manager lists
|
||||
var nopreviews = [];
|
||||
var nocaptures = [];
|
||||
var deletedNopreviews = [];
|
||||
var deletedNocaptures = [];
|
||||
|
||||
// delete the following lines !!!!!
|
||||
var goneNP = ""; // nopreview
|
||||
var goneNC = ""; // nocapture
|
||||
var deleted_signons_count = 0;
|
||||
var deleted_rejects_count = 0;
|
||||
var deleted_nopreviews_count = 0;
|
||||
var deleted_nocaptures_count = 0;
|
||||
var nopreviews_count = 0;
|
||||
var nocaptures_count = 0;
|
||||
var pref;
|
||||
|
||||
// differentiate between password manager and form manager
|
||||
var isPasswordManager = (window.arguments[0] == "S");
|
||||
|
||||
// variables for encryption
|
||||
var encrypted = "";
|
||||
|
||||
// function : <SignonViewer.js>::Startup();
|
||||
// purpose : initialises interface, calls init functions for each page
|
||||
function Startup()
|
||||
{
|
||||
function Startup() {
|
||||
dump("entering startup\n");
|
||||
|
||||
// xpconnect to password manager interfaces
|
||||
signonviewer = Components.classes["@mozilla.org/signonviewer/signonviewer-world;1"].createInstance();
|
||||
signonviewer = signonviewer.QueryInterface(Components.interfaces.nsISignonViewer);
|
||||
|
||||
passwordmanager = Components.classes["@mozilla.org/passwordmanager;1"].getService();
|
||||
passwordmanager = passwordmanager.QueryInterface(Components.interfaces.nsIPasswordManager);
|
||||
|
||||
// remove wallet functions (unless overruled by the "wallet.enabled" pref)
|
||||
// determine if database is encrypted
|
||||
try {
|
||||
pref = Components.classes["@mozilla.org/preferences-service;1"]
|
||||
var pref = Components.classes["@mozilla.org/preferences-service;1"]
|
||||
.getService(Components.interfaces.nsIPrefBranch);
|
||||
try {
|
||||
if (!pref.getBoolPref("wallet.enabled")) {
|
||||
var element;
|
||||
element = document.getElementById("nopreview");
|
||||
element.setAttribute("hidden", "true");
|
||||
element = document.getElementById("nocapture");
|
||||
element.setAttribute("hidden", "true");
|
||||
}
|
||||
} catch(e) {
|
||||
dump("wallet.enabled pref is missing from all.js");
|
||||
}
|
||||
|
||||
try {
|
||||
encrypted = pref.getBoolPref("wallet.crypto");
|
||||
} catch(e) {
|
||||
@ -81,80 +74,107 @@ function Startup()
|
||||
pref = null;
|
||||
}
|
||||
|
||||
var tab = window.arguments[0];
|
||||
if (tab == "S") {
|
||||
element = document.getElementById("signonTabbox");
|
||||
element.selectedIndex = 0;
|
||||
// determine whether to run in password-manager mode or form-manager mode
|
||||
var tabBox = document.getElementById("tabbox");
|
||||
var element;
|
||||
if (isPasswordManager) {
|
||||
|
||||
// hide non-used tabs
|
||||
element = document.getElementById("nopreview");
|
||||
element.setAttribute("hidden", "true");
|
||||
element = document.getElementById("nocapture");
|
||||
element.setAttribute("hidden", "true");
|
||||
signonsOutliner = document.getElementById("signonsOutliner");
|
||||
rejectsOutliner = document.getElementById("rejectsOutliner");
|
||||
|
||||
// set initial password-manager tab
|
||||
element = document.getElementById("signonsTab");
|
||||
tabBox.selectedTab = element;
|
||||
|
||||
// hide form-manager tabs
|
||||
element = document.getElementById("nopreviewsTab");
|
||||
element.hidden = "true";
|
||||
element = document.getElementById("nocapturesTab");
|
||||
element.hidden = "true"
|
||||
|
||||
// load password manager items
|
||||
if (!LoadSignons()) {
|
||||
return; /* user failed to unlock the database */
|
||||
}
|
||||
LoadReject();
|
||||
} else if (tab == "W") {
|
||||
element = document.getElementById("signonviewer");
|
||||
element.setAttribute("title", element.getAttribute("alttitle"));
|
||||
|
||||
element = document.getElementById("signonTabbox");
|
||||
element.selectedIndex = 2;
|
||||
// hide non-used tabs
|
||||
element = document.getElementById("signonTab");
|
||||
element.setAttribute("hidden", "true");
|
||||
element = document.getElementById("signonSitesTab");
|
||||
element.setAttribute("hidden", "true");
|
||||
LoadRejects();
|
||||
|
||||
} else {
|
||||
|
||||
nopreviewsOutliner = document.getElementById("nopreviewsOutliner");
|
||||
nocapturesOutliner = document.getElementById("nocapturesOutliner");
|
||||
|
||||
// change title on window
|
||||
var wind = document.getElementById("signonviewer");
|
||||
wind.setAttribute("title", wind.getAttribute("alttitle"));
|
||||
|
||||
// set initial form-manager tab
|
||||
element = document.getElementById("nopreviewsTab");
|
||||
tabBox.selectedTab = element;
|
||||
|
||||
// hide password-manager tabs
|
||||
element = document.getElementById("signonsTab");
|
||||
element.hidden = "true";
|
||||
element = document.getElementById("signonsitesTab");
|
||||
element.hidden = "true";
|
||||
|
||||
// load form manager items
|
||||
LoadNopreview();
|
||||
LoadNocapture();
|
||||
} else {
|
||||
/* invalid value for argument */
|
||||
}
|
||||
}
|
||||
|
||||
/*** =================== SAVED SIGNONS CODE =================== ***/
|
||||
|
||||
// function : <SignonViewer.js>::AddSignonToList();
|
||||
// purpose : creates an array of signon objects
|
||||
function AddSignonToList(count, host, user, rawuser) {
|
||||
signons[count] = new Signon(count, host, user, rawuser);
|
||||
}
|
||||
var signonsOutlinerView = {
|
||||
rowCount : 0,
|
||||
setOutliner : function(outliner){},
|
||||
getCellText : function(row,column){
|
||||
var rv;
|
||||
if (column=="siteCol") {
|
||||
rv = signons[row].host;
|
||||
} else { // must be "userCol"
|
||||
rv = signons[row].user;
|
||||
}
|
||||
return rv;
|
||||
},
|
||||
isSeparator : function(index) {return false;},
|
||||
isContainer : function(index) {return false;},
|
||||
cycleHeader : function(aColId, aElt) {},
|
||||
getRowProperties : function(row,column,prop){},
|
||||
getColumnProperties : function(column,columnElement,prop){},
|
||||
getCellProperties : function(row,prop){},
|
||||
};
|
||||
var signonsOutliner;
|
||||
|
||||
// function : <SignonViewer.js>::Signon();
|
||||
// purpose : an home-brewed object that represents a individual signon
|
||||
function Signon(number, host, user, rawuser)
|
||||
{
|
||||
function Signon(number, host, user, rawuser) {
|
||||
this.number = number;
|
||||
this.host = host;
|
||||
this.user = user;
|
||||
this.rawuser = rawuser;
|
||||
}
|
||||
|
||||
// function : <SignonViewer.js>::LoadSignons();
|
||||
// purpose : reads signons from interface and loads into tree
|
||||
function LoadSignons()
|
||||
{
|
||||
function LoadSignons() {
|
||||
// loads signons into table
|
||||
var enumerator = passwordmanager.enumerator;
|
||||
var count = 0;
|
||||
var bundle = srGetStrBundle("chrome://communicator/locale/wallet/SignonViewer.properties");
|
||||
var signonBundle = document.getElementById("signonBundle");
|
||||
|
||||
while (enumerator.hasMoreElements()) {
|
||||
var nextPassword;
|
||||
try {
|
||||
var nextPassword = enumerator.getNext();
|
||||
nextPassword = enumerator.getNext();
|
||||
} catch(e) {
|
||||
/* user supplied invalid database key */
|
||||
window.close();
|
||||
return false;
|
||||
}
|
||||
nextPassword = nextPassword.QueryInterface(Components.interfaces.nsIPassword);
|
||||
|
||||
var host = nextPassword.host;
|
||||
var user = nextPassword.user;
|
||||
var rawuser = user;
|
||||
|
||||
// if no username supplied, try to parse it out of the url
|
||||
if (user == "") {
|
||||
/* no username passed in, parse it out of url */
|
||||
var unused = { };
|
||||
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
|
||||
.getService(Components.interfaces.nsIIOService);
|
||||
@ -172,391 +192,330 @@ function LoadSignons()
|
||||
}
|
||||
|
||||
if (encrypted) {
|
||||
user = bundle.formatStringFromName ("encrypted", [user], 1);
|
||||
user = signonBundle.getFormattedString("encrypted", [user], 1);
|
||||
}
|
||||
|
||||
AddSignonToList(count, host, user, rawuser);
|
||||
AddItem("savesignonlist", [host,user], "signon_", count++);
|
||||
signons[count] = new Signon(count++, host, user, rawuser);
|
||||
}
|
||||
if (count == 0) {
|
||||
signonsOutlinerView.rowCount = signons.length;
|
||||
|
||||
// sort and display the table
|
||||
signonsOutliner.outlinerBoxObject.view = signonsOutlinerView;
|
||||
SignonColumnSort('host');
|
||||
|
||||
// disable "remove all signons" button if there are no signons
|
||||
if (signons.length == 0) {
|
||||
document.getElementById("removeAllSignons").setAttribute("disabled","true");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// function : <SignonViewer.js>::DeleteSignon();
|
||||
// purpose : deletes a particular signon
|
||||
function DeleteSignon()
|
||||
{
|
||||
var signonstree = document.getElementById("signonstree");
|
||||
deleted_signons_count += signonstree.selectedItems.length;
|
||||
var newIndex = signonstree.selectedIndex;
|
||||
goneSS += DeleteItemSelected('signonstree','signon_','savesignonlist');
|
||||
var netSignonsCount = signons.length - deleted_signons_count;
|
||||
if (netSignonsCount) {
|
||||
signonstree.selectedIndex = (newIndex < netSignonsCount) ? newIndex : netSignonsCount-1;
|
||||
}
|
||||
DoButtonEnabling("signonstree");
|
||||
if (netSignonsCount <= 0) {
|
||||
document.getElementById("removeAllSignons").setAttribute("disabled","true");
|
||||
function SignonSelected() {
|
||||
var selections = GetOutlinerSelections(signonsOutliner);
|
||||
if (selections.length) {
|
||||
document.getElementById("removeSignon").removeAttribute("disabled");
|
||||
}
|
||||
}
|
||||
|
||||
// function : <SignonViewer.js>::DeleteAllSignons();
|
||||
// purpose : deletes all the signons
|
||||
function DeleteSignon() {
|
||||
DeleteSelectedItemFromOutliner(signonsOutliner, signonsOutlinerView,
|
||||
signons, deletedSignons,
|
||||
"removeSignon", "removeAllSignons");
|
||||
}
|
||||
|
||||
function DeleteAllSignons() {
|
||||
// delete selected item
|
||||
goneSS += DeleteAllItems(signons.length, "signon_", "savesignonlist");
|
||||
if( !document.getElementById("removeSignon").disabled ) {
|
||||
document.getElementById("removeSignon").setAttribute("disabled", "true")
|
||||
DeleteAllFromOutliner(signonsOutliner, signonsOutlinerView,
|
||||
signons, deletedSignons,
|
||||
"removeSignon", "removeAllSignons");
|
||||
}
|
||||
|
||||
function HandleSignonKeyPress(e) {
|
||||
if (e.keyCode == 46) {
|
||||
DeleteSignonSelected();
|
||||
}
|
||||
document.getElementById("removeAllSignons").setAttribute("disabled","true");
|
||||
}
|
||||
|
||||
/*** =================== IGNORED SIGNONS CODE =================== ***/
|
||||
var lastSignonSortColumn = "";
|
||||
var lastSignonSortAscending = false;
|
||||
|
||||
// function : <SignonViewer.js>::AddRejectToList();
|
||||
// purpose : creates an array of reject objects
|
||||
function AddRejectToList(count, host) {
|
||||
rejects[count] = new Reject(count, host);
|
||||
function SignonColumnSort(column) {
|
||||
lastSignonSortAscending =
|
||||
SortOutliner(signonsOutliner, signonsOutlinerView, signons,
|
||||
column, lastSignonSortColumn, lastSignonSortAscending);
|
||||
lastSignonSortColumn = column;
|
||||
}
|
||||
|
||||
// function : <SignonViewer.js>::Reject();
|
||||
// purpose : an home-brewed object that represents a individual reject
|
||||
function Reject(number, host)
|
||||
{
|
||||
/*** =================== REJECTED SIGNONS CODE =================== ***/
|
||||
|
||||
var rejectsOutlinerView = {
|
||||
rowCount : 0,
|
||||
setOutliner : function(outliner){},
|
||||
getCellText : function(row,column){
|
||||
return rejects[row].host;
|
||||
},
|
||||
isSeparator : function(index) {return false;},
|
||||
isContainer : function(index) {return false;},
|
||||
cycleHeader : function(aColId, aElt) {},
|
||||
getRowProperties : function(row,column,prop){},
|
||||
getColumnProperties : function(column,columnElement,prop){},
|
||||
getCellProperties : function(row,prop){},
|
||||
};
|
||||
var rejectsOutliner;
|
||||
|
||||
function Reject(number, host) {
|
||||
this.number = number;
|
||||
this.host = host;
|
||||
}
|
||||
|
||||
// function : <SignonViewer.js>::LoadReject();
|
||||
// purpose : reads rejected sites from interface and loads into tree
|
||||
function LoadReject()
|
||||
{
|
||||
function LoadRejects() {
|
||||
var enumerator = passwordmanager.rejectEnumerator;
|
||||
var count = 0;
|
||||
while (enumerator.hasMoreElements()) {
|
||||
var nextReject = enumerator.getNext();
|
||||
nextReject = nextReject.QueryInterface(Components.interfaces.nsIPassword);
|
||||
var host = nextReject.host;
|
||||
AddRejectToList(count, host);
|
||||
AddItem("ignoredlist", [host], "reject_", count++);
|
||||
rejects[count] = new Reject(count++, host);
|
||||
}
|
||||
if (count == 0) {
|
||||
document.getElementById("removeAllSites").setAttribute("disabled","true");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
rejectsOutlinerView.rowCount = rejects.length;
|
||||
|
||||
// function : <SignonViewer.js>::DeleteIgnoredSite();
|
||||
// purpose : deletes ignored site(s)
|
||||
function DeleteIgnoredSite()
|
||||
{
|
||||
var ignoretree = document.getElementById("ignoretree");
|
||||
deleted_rejects_count += ignoretree.selectedItems.length;
|
||||
var newIndex = ignoretree.selectedIndex;
|
||||
goneIS += DeleteItemSelected('ignoretree','reject_','ignoredlist');
|
||||
var netRejectsCount = rejects.length - deleted_rejects_count;
|
||||
if (netRejectsCount) {
|
||||
ignoretree.selectedIndex = (newIndex < netRejectsCount) ? newIndex : netRejectsCount-1;
|
||||
}
|
||||
DoButtonEnabling("ignoretree");
|
||||
if (netRejectsCount <= 0) {
|
||||
document.getElementById("removeAllSites").setAttribute("disabled","true");
|
||||
// sort and display the table
|
||||
rejectsOutliner.outlinerBoxObject.view = rejectsOutlinerView;
|
||||
RejectColumnSort('host');
|
||||
|
||||
if (rejects.length == 0) {
|
||||
document.getElementById("removeAllRejects").setAttribute("disabled","true");
|
||||
}
|
||||
}
|
||||
|
||||
// function : <SignonViewer.js>::DeleteAllSites();
|
||||
// purpose : deletes all the ignored sites
|
||||
function DeleteAllSites() {
|
||||
// delete selected item
|
||||
goneIS += DeleteAllItems(rejects.length, "reject_", "ignoredlist");
|
||||
if( !document.getElementById("removeIgnoredSite").disabled ) {
|
||||
document.getElementById("removeIgnoredSite").setAttribute("disabled", "true")
|
||||
function RejectSelected() {
|
||||
var selections = GetOutlinerSelections(rejectsOutliner);
|
||||
if (selections.length) {
|
||||
document.getElementById("removeReject").removeAttribute("disabled");
|
||||
}
|
||||
document.getElementById("removeAllSites").setAttribute("disabled","true");
|
||||
}
|
||||
|
||||
function DeleteReject() {
|
||||
DeleteSelectedItemFromOutliner(rejectsOutliner, rejectsOutlinerView,
|
||||
rejects, deletedRejects,
|
||||
"removeReject", "removeAllRejects");
|
||||
}
|
||||
|
||||
function DeleteAllRejects() {
|
||||
DeleteAllFromOutliner(rejectsOutliner, rejectsOutlinerView,
|
||||
rejects, deletedRejects,
|
||||
"removeReject", "removeAllRejects");
|
||||
}
|
||||
|
||||
function HandleRejectKeyPress(e) {
|
||||
if (e.keyCode == 46) {
|
||||
DeleteRejectSelected();
|
||||
}
|
||||
}
|
||||
|
||||
var lastRejectSortColumn = "";
|
||||
var lastRejectSortAscending = false;
|
||||
|
||||
function RejectColumnSort(column) {
|
||||
lastRejectSortAscending =
|
||||
SortOutliner(rejectsOutliner, rejectsOutlinerView, rejects,
|
||||
column, lastRejectSortColumn, lastRejectSortAscending);
|
||||
lastRejectSortColumn = column;
|
||||
}
|
||||
|
||||
/*** =================== NO PREVIEW FORMS CODE =================== ***/
|
||||
|
||||
// function : <SignonViewer.js>::LoadNopreview();
|
||||
// purpose : reads non-previewed forms from interface and loads into tree
|
||||
function LoadNopreview()
|
||||
{
|
||||
nopreviewList = signonviewer.getNopreviewValue();
|
||||
if (nopreviewList.length > 0) {
|
||||
var delim = nopreviewList[0];
|
||||
nopreviewList = nopreviewList.split(delim);
|
||||
var nopreviewsOutlinerView = {
|
||||
rowCount : 0,
|
||||
setOutliner : function(outliner){},
|
||||
getCellText : function(row,column){
|
||||
return nopreviews[row].host;
|
||||
},
|
||||
isSeparator : function(index) {return false;},
|
||||
isContainer : function(index) {return false;},
|
||||
cycleHeader : function(aColId, aElt) {},
|
||||
getRowProperties : function(row,column,prop){},
|
||||
getColumnProperties : function(column,columnElement,prop){},
|
||||
getCellProperties : function(row,prop){},
|
||||
};
|
||||
var nopreviewsOutliner;
|
||||
|
||||
function Nopreview(number, host) {
|
||||
this.number = number;
|
||||
this.host = host;
|
||||
}
|
||||
|
||||
function LoadNopreview() {
|
||||
var list = signonviewer.getNopreviewValue();
|
||||
var count = 0;
|
||||
if (list.length > 0) {
|
||||
var delim = list[0];
|
||||
list = list.split(delim);
|
||||
}
|
||||
for(var i = 1; i < nopreviewList.length; i++)
|
||||
{
|
||||
var currSignon = TrimString(nopreviewList[i]);
|
||||
// TEMP HACK until morse fixes signon viewer functions
|
||||
currSignon = RemoveHTMLFormatting(currSignon);
|
||||
AddItem("nopreviewlist",[currSignon],"nopreview_",i-1);
|
||||
for (var i = 1; i < list.length; i++) {
|
||||
var host = TrimString(list[i]);
|
||||
nopreviews[count] = new Nopreview(count++, host);
|
||||
}
|
||||
if (nopreviewList) {
|
||||
nopreviews_count = nopreviewList.length-1; // -1 because first item is always blank
|
||||
}
|
||||
if (nopreviews_count == 0) {
|
||||
nopreviewsOutlinerView.rowCount = nopreviews.length;
|
||||
|
||||
// sort and display the table
|
||||
nopreviewsOutliner.outlinerBoxObject.view = nopreviewsOutlinerView;
|
||||
NopreviewColumnSort('host');
|
||||
|
||||
if (nopreviews.length == 0) {
|
||||
document.getElementById("removeAllNopreviews").setAttribute("disabled","true");
|
||||
}
|
||||
}
|
||||
|
||||
// function : <SignonViewer>::DeleteNoPreviewForm()
|
||||
// purpose : deletes no-preview entry(s)
|
||||
function DeleteNoPreviewForm()
|
||||
{
|
||||
var nopreviewtree = document.getElementById("nopreviewtree");
|
||||
deleted_nopreviews_count += nopreviewtree.selectedItems.length;
|
||||
var newIndex = nopreviewtree.selectedIndex;
|
||||
goneNP += DeleteItemSelected('nopreviewtree','nopreview_','nopreviewlist');
|
||||
var netNopreviewsCount = nopreviews_count - deleted_nopreviews_count;
|
||||
if (netNopreviewsCount) {
|
||||
nopreviewtree.selectedIndex = (newIndex < netNopreviewsCount) ? newIndex : netNopreviewsCount-1;
|
||||
}
|
||||
DoButtonEnabling("nopreviewtree");
|
||||
if (netNopreviewsCount <= 0) {
|
||||
document.getElementById("removeAllNopreviews").setAttribute("disabled","true");
|
||||
function NopreviewSelected() {
|
||||
var selections = GetOutlinerSelections(nopreviewsOutliner);
|
||||
if (selections.length) {
|
||||
document.getElementById("removeNopreview").removeAttribute("disabled");
|
||||
}
|
||||
}
|
||||
|
||||
// function : <SignonViewer.js>::DeleteAllNopreviews();
|
||||
// purpose : deletes all the nopreview sites
|
||||
function DeleteNopreview() {
|
||||
DeleteSelectedItemFromOutliner(nopreviewsOutliner, nopreviewsOutlinerView,
|
||||
nopreviews, deletedNopreviews,
|
||||
"removeNopreview", "removeAllNopreviews");
|
||||
}
|
||||
|
||||
function DeleteAllNopreviews() {
|
||||
// delete selected item
|
||||
goneNP += DeleteAllItems(nopreviewList.length, "nopreview_", "nopreviewlist");
|
||||
if( !document.getElementById("removeNoPreview").disabled ) {
|
||||
document.getElementById("removeNoPreview").setAttribute("disabled", "true")
|
||||
DeleteAllFromOutliner(nopreviewsOutliner, nopreviewsOutlinerView,
|
||||
nopreviews, deletedNopreviews,
|
||||
"removeNopreview", "removeAllNopreviews");
|
||||
}
|
||||
|
||||
function HandleNopreviewKeyPress(e) {
|
||||
if (e.keyCode == 46) {
|
||||
DeleteNopreviewSelected();
|
||||
}
|
||||
document.getElementById("removeAllNopreviews").setAttribute("disabled","true");
|
||||
}
|
||||
|
||||
var lastNopreviewSortColumn = "";
|
||||
var lastNopreviewSortAscending = false;
|
||||
|
||||
function NopreviewColumnSort(column) {
|
||||
lastNopreviewSortAscending =
|
||||
SortOutliner(nopreviewsOutliner, nopreviewsOutlinerView, nopreviews,
|
||||
column, lastNopreviewSortColumn, lastNopreviewSortAscending);
|
||||
lastNopreviewSortColumn = column;
|
||||
}
|
||||
|
||||
/*** =================== NO CAPTURE FORMS CODE =================== ***/
|
||||
|
||||
// function : <SignonViewer.js>::LoadNocapture();
|
||||
// purpose : reads non-captured forms from interface and loads into tree
|
||||
function LoadNocapture()
|
||||
{
|
||||
nocaptureList = signonviewer.getNocaptureValue();
|
||||
if (nocaptureList.length > 0) {
|
||||
var delim = nocaptureList[0];
|
||||
nocaptureList = nocaptureList.split(delim);
|
||||
|
||||
var nocapturesOutlinerView = {
|
||||
rowCount : 0,
|
||||
setOutliner : function(outliner){},
|
||||
getCellText : function(row,column){
|
||||
return nocaptures[row].host;
|
||||
},
|
||||
isSeparator : function(index) {return false;},
|
||||
isContainer : function(index) {return false;},
|
||||
cycleHeader : function(aColId, aElt) {},
|
||||
getRowProperties : function(row,column,prop){},
|
||||
getColumnProperties : function(column,columnElement,prop){},
|
||||
getCellProperties : function(row,prop){},
|
||||
};
|
||||
var nocapturesOutliner;
|
||||
|
||||
function Nocapture(number, host) {
|
||||
this.number = number;
|
||||
this.host = host;
|
||||
}
|
||||
|
||||
function LoadNocapture() {
|
||||
var list = signonviewer.getNocaptureValue();
|
||||
var count = 0;
|
||||
if (list.length > 0) {
|
||||
var delim = list[0];
|
||||
list = list.split(delim);
|
||||
}
|
||||
for(var i = 1; i < nocaptureList.length; i++)
|
||||
{
|
||||
var currSignon = TrimString(nocaptureList[i]);
|
||||
// TEMP HACK until morse fixes signon viewer functions
|
||||
currSignon = RemoveHTMLFormatting(currSignon);
|
||||
AddItem("nocapturelist",[currSignon],"nocapture_",i-1);
|
||||
for (var i = 1; i < list.length; i++) {
|
||||
var host = TrimString(list[i]);
|
||||
nocaptures[count] = new Nocapture(count++, host);
|
||||
}
|
||||
if (nocaptureList) {
|
||||
nocaptures_count = nocaptureList.length-1; // -1 because first item is always blank
|
||||
}
|
||||
if (nocaptures_count == 0) {
|
||||
nocapturesOutlinerView.rowCount = nocaptures.length;
|
||||
|
||||
// sort and display the table
|
||||
nocapturesOutliner.outlinerBoxObject.view = nocapturesOutlinerView;
|
||||
NocaptureColumnSort('host');
|
||||
|
||||
if (nocaptures.length == 0) {
|
||||
document.getElementById("removeAllNocaptures").setAttribute("disabled","true");
|
||||
}
|
||||
}
|
||||
|
||||
// function : <SignonViewer>::DeleteNoCaptureForm()
|
||||
// purpose : deletes no-capture entry(s)
|
||||
function DeleteNoCaptureForm()
|
||||
{
|
||||
var nocapturetree = document.getElementById("nocapturetree");
|
||||
deleted_nocaptures_count += nocapturetree.selectedItems.length;
|
||||
var newIndex = nocapturetree.selectedIndex;
|
||||
goneNC += DeleteItemSelected('nocapturetree','nocapture_','nocapturelist');
|
||||
var netNocapturesCount = nocaptures_count - deleted_nocaptures_count;
|
||||
if (netNocapturesCount) {
|
||||
nocapturetree.selectedIndex = (newIndex < netNocapturesCount) ? newIndex : netNocapturesCount-1;
|
||||
}
|
||||
DoButtonEnabling("nocapturetree");
|
||||
if (netNocapturesCount <= 0) {
|
||||
document.getElementById("removeAllNocaptures").setAttribute("disabled","true");
|
||||
function NocaptureSelected() {
|
||||
var selections = GetOutlinerSelections(nocapturesOutliner);
|
||||
if (selections.length) {
|
||||
document.getElementById("removeNocapture").removeAttribute("disabled");
|
||||
}
|
||||
}
|
||||
|
||||
// function : <SignonViewer.js>::DeleteAllNocaptures();
|
||||
// purpose : deletes all the nocapture sites
|
||||
function DeleteNocapture() {
|
||||
DeleteSelectedItemFromOutliner(nocapturesOutliner, nocapturesOutlinerView,
|
||||
nocaptures, deletedNocaptures,
|
||||
"removeNocapture", "removeAllNocaptures");
|
||||
}
|
||||
|
||||
function DeleteAllNocaptures() {
|
||||
// delete selected item
|
||||
goneNC += DeleteAllItems(nocaptureList.length, "nocapture_", "nocapturelist");
|
||||
if( !document.getElementById("removeNoCapture").disabled ) {
|
||||
document.getElementById("removeNoCapture").setAttribute("disabled", "true")
|
||||
DeleteAllFromOutliner(nocapturesOutliner, nocapturesOutlinerView,
|
||||
nocaptures, deletedNocaptures,
|
||||
"removeNocapture", "removeAllNocaptures");
|
||||
}
|
||||
|
||||
function HandleNocaptureKeyPress(e) {
|
||||
if (e.keyCode == 46) {
|
||||
DeleteNocaptureSelected();
|
||||
}
|
||||
document.getElementById("removeAllNocaptures").setAttribute("disabled","true");
|
||||
}
|
||||
|
||||
var lastNocaptureSortColumn = "";
|
||||
var lastNocaptureSortAscending = false;
|
||||
|
||||
function NocaptureColumnSort(column) {
|
||||
lastNocaptureSortAscending =
|
||||
SortOutliner(nocapturesOutliner, nocapturesOutlinerView, nocaptures,
|
||||
column, lastNocaptureSortColumn, lastNocaptureSortAscending);
|
||||
lastNocaptureSortColumn = column;
|
||||
}
|
||||
|
||||
/*** =================== GENERAL CODE =================== ***/
|
||||
|
||||
// function : <SignonViewer>::onAccept()
|
||||
// purpose : dialog confirm & tidy up.
|
||||
function onAccept()
|
||||
{
|
||||
var deletedSignons = [];
|
||||
deletedSignons = goneSS.split(",");
|
||||
var signonCount;
|
||||
for (signonCount=0; signonCount<deletedSignons.length-1; signonCount++) {
|
||||
var index = parseInt(deletedSignons[signonCount]);
|
||||
passwordmanager.removeUser(signons[index].host, signons[index].rawuser);
|
||||
function onAccept() {
|
||||
|
||||
//
|
||||
for (var s=0; s<deletedSignons.length; s++) {
|
||||
passwordmanager.removeUser(deletedSignons[s].host, deletedSignons[s].rawuser);
|
||||
}
|
||||
|
||||
var deletedRejects = [];
|
||||
deletedRejects = goneIS.split(",");
|
||||
var rejectCount;
|
||||
for (rejectCount=0; rejectCount<deletedRejects.length-1; rejectCount++) {
|
||||
passwordmanager.removeReject(rejects[parseInt(deletedRejects[rejectCount])].host);
|
||||
for (var r=0; r<deletedRejects.length; r++) {
|
||||
passwordmanager.removeReject(deletedRejects[r].host);
|
||||
}
|
||||
|
||||
var result = "|goneC|"+goneNC+"|goneP|"+goneNP+"|";
|
||||
var i;
|
||||
var result = "|goneC|";
|
||||
for (i=0; i<deletedNocaptures.length; i++) {
|
||||
result += deletedNocaptures[i].number;
|
||||
result += ",";
|
||||
}
|
||||
result += "|goneP|";
|
||||
for (i=0; i<deletedNopreviews.length; i++) {
|
||||
result += deletedNopreviews[i].number;
|
||||
result += ",";
|
||||
}
|
||||
result += "|";
|
||||
signonviewer.setValue(result, window);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*** =================== UTILITY FUNCTIONS =================== ***/
|
||||
|
||||
// function : <SignonViewer.js>::RemoveHTMLFormatting();
|
||||
// purpose : removes HTML formatting from input stream
|
||||
function RemoveHTMLFormatting(which)
|
||||
{
|
||||
var ignoreon = false;
|
||||
var rv = "";
|
||||
for(var i = 0; i < which.length; i++)
|
||||
{
|
||||
if(which.charAt(i) == "<")
|
||||
ignoreon = true;
|
||||
if(which.charAt(i) == ">") {
|
||||
ignoreon = false;
|
||||
continue;
|
||||
}
|
||||
if(ignoreon)
|
||||
continue;
|
||||
rv += which.charAt(i);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*** =================== TREE MANAGEMENT CODE =================== ***/
|
||||
|
||||
// function : <SignonViewer.js>::AddItem();
|
||||
// purpose : utility function for adding items to a tree.
|
||||
function AddItem(children,cells,prefix,idfier)
|
||||
{
|
||||
var kids = document.getElementById(children);
|
||||
var item = document.createElement("treeitem");
|
||||
var row = document.createElement("treerow");
|
||||
for(var i = 0; i < cells.length; i++)
|
||||
{
|
||||
var cell = document.createElement("treecell");
|
||||
cell.setAttribute("class", "propertylist");
|
||||
cell.setAttribute("label", cells[i])
|
||||
row.appendChild(cell);
|
||||
}
|
||||
item.appendChild(row);
|
||||
item.setAttribute("id",prefix + idfier);
|
||||
kids.appendChild(item);
|
||||
}
|
||||
|
||||
// function : <SignonViewer.js>::DeleteItemSelected();
|
||||
// purpose : deletes all the signons that are selected
|
||||
function DeleteItemSelected(tree, prefix, kids) {
|
||||
var delnarray = [];
|
||||
var rv = "";
|
||||
var cookietree = document.getElementById(tree);
|
||||
var i;
|
||||
var selitems = cookietree.selectedItems;
|
||||
for(i = 0; i < selitems.length; i++)
|
||||
{
|
||||
delnarray[i] = document.getElementById(selitems[i].getAttribute("id"));
|
||||
var itemid = parseInt(selitems[i].getAttribute("id").substring(prefix.length,selitems[i].getAttribute("id").length));
|
||||
rv += (itemid + ",");
|
||||
}
|
||||
for(i = 0; i < delnarray.length; i++)
|
||||
{
|
||||
document.getElementById(kids).removeChild(delnarray[i]);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
// function : <SignonViewer.js>::DeleteAllItems();
|
||||
// purpose : deletes all the items
|
||||
function DeleteAllItems(length, prefix, kids) {
|
||||
var delnarray = [];
|
||||
var rv = "";
|
||||
for(var i = 0; i < length; i++)
|
||||
{
|
||||
if (document.getElementById(prefix+i) != null) {
|
||||
document.getElementById(kids).removeChild(document.getElementById(prefix+i));
|
||||
rv += (i + ",");
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
// function: <SignonViewer.js>::HandleKeyPress();
|
||||
// purpose : handles keypress events
|
||||
function HandleEvent( event, page )
|
||||
{
|
||||
// click event
|
||||
if( event.type == "click" ) {
|
||||
var node = event.target;
|
||||
while ( node.nodeName != "tree" )
|
||||
node = node.parentNode;
|
||||
var tree = node;
|
||||
DoButtonEnabling( node.id );
|
||||
}
|
||||
|
||||
// keypress event
|
||||
if( event.type == "keypress" && event.keyCode == 46 ) {
|
||||
switch( page ) {
|
||||
case 0:
|
||||
DeleteSignon();
|
||||
break;
|
||||
case 1:
|
||||
DeleteIgnoredSite();
|
||||
break;
|
||||
case 2:
|
||||
DeleteNoPreviewForm();
|
||||
break;
|
||||
case 2:
|
||||
DeleteNoCaptureForm();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function DoButtonEnabling( treeid )
|
||||
{
|
||||
var tree = document.getElementById( treeid );
|
||||
var button;
|
||||
switch( treeid ) {
|
||||
case "signonstree":
|
||||
button = document.getElementById("removeSignon");
|
||||
break;
|
||||
case "ignoretree":
|
||||
button = document.getElementById("removeIgnoredSite");
|
||||
break;
|
||||
case "nopreviewtree":
|
||||
button = document.getElementById("removeNoPreview");
|
||||
break;
|
||||
case "nocapturetree":
|
||||
button = document.getElementById("removeNoCapture");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if( button.getAttribute("disabled") && tree.selectedItems.length )
|
||||
button.removeAttribute("disabled", "true");
|
||||
else if( !button.getAttribute("disabled") && !tree.selectedItems.length )
|
||||
button.setAttribute("disabled","true");
|
||||
}
|
||||
|
||||
// Remove whitespace from both ends of a string
|
||||
function TrimString(string)
|
||||
{
|
||||
if (!string) return "";
|
||||
if (!string) {
|
||||
return "";
|
||||
}
|
||||
return string.replace(/(^\s+)|(\s+$)/g, '')
|
||||
}
|
||||
|
||||
|
||||
@ -40,39 +40,31 @@
|
||||
<script src="chrome://communicator/content/wallet/SignonViewer.js"/>
|
||||
<script src="chrome://global/content/strres.js"/>
|
||||
<script src="chrome://communicator/content/wallet/nsWalletTreeUtils.js"/>
|
||||
|
||||
<tabbox id="signonTabbox" flex="1">
|
||||
|
||||
<stringbundle id="signonBundle"
|
||||
src="chrome://communicator/locale/wallet/SignonViewer.properties"/>
|
||||
|
||||
<tabbox id="tabbox" flex="1">
|
||||
<tabs>
|
||||
<tab id="signonTab" label="&tab.signonsstored.label;"/>
|
||||
<tab id="signonSitesTab" label="&tab.signonsnotstored.label;"/>
|
||||
<tab id="nopreview" label="&tab.nopreview.label;"/>
|
||||
<tab id="nocapture" label="&tab.nocapture.label;"/>
|
||||
<tab id="signonsTab" label="&tab.signonsstored.label;"/>
|
||||
<tab id="signonsitesTab" label="&tab.signonsnotstored.label;"/>
|
||||
<tab id="nopreviewsTab" label="&tab.nopreview.label;"/>
|
||||
<tab id="nocapturesTab" label="&tab.nocapture.label;"/>
|
||||
</tabs>
|
||||
<tabpanels id="panel" flex="1">
|
||||
<!-- saved signons -->
|
||||
<vbox id="savedsignons" flex="1">
|
||||
<description>&spiel.signonsstored.label;</description>
|
||||
<separator class="thin"/>
|
||||
<tree id="signonstree" style="height: 20em;"
|
||||
onclick="HandleEvent(event);" flex="1"
|
||||
multiple="true" onkeypress="HandleEvent(event,0)">
|
||||
<treecolgroup>
|
||||
<treecol width="0" flex="45"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol width="0" flex="55"/>
|
||||
</treecolgroup>
|
||||
<treehead>
|
||||
<treerow>
|
||||
<treecell class="treecell-header sortDirectionIndicator"
|
||||
label="&treehead.site.label;"
|
||||
onclick="return Wallet_ColumnSort('0', 'savesignonlist');"/>
|
||||
<treecell class="treecell-header sortDirectionIndicator"
|
||||
label="&treehead.username.label;"
|
||||
onclick="return Wallet_ColumnSort('1', 'savesignonlist');"/>
|
||||
</treerow>
|
||||
</treehead>
|
||||
<treechildren id="savesignonlist" flex="1"/>
|
||||
</tree>
|
||||
<outliner id="signonsOutliner" flex="1" style="height: 10em;" multiple="true"
|
||||
onkeypress="HandleSignonKeyPress(event)">
|
||||
<outlinercol id="siteCol" label="&treehead.site.label;" flex="5"
|
||||
onclick="SignonColumnSort('host');"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<outlinercol id="userCol" label="&treehead.username.label;" flex="5"
|
||||
onclick="SignonColumnSort('user');"/>
|
||||
<outlinerbody flex="1" onselect="SignonSelected();"/>
|
||||
</outliner>
|
||||
<separator class="thin"/>
|
||||
<hbox>
|
||||
<button id="removeSignon" disabled="true"
|
||||
@ -82,58 +74,39 @@
|
||||
oncommand="DeleteAllSignons();"/>
|
||||
</hbox>
|
||||
</vbox>
|
||||
<!-- ignored signon sites -->
|
||||
<vbox id="ignoredsites" flex="1">
|
||||
<!-- rejected signon sites -->
|
||||
<vbox id="rejectedsites" flex="1">
|
||||
<description>&spiel.signonsnotstored.label;</description>
|
||||
<separator class="thin"/>
|
||||
<tree id="ignoretree" style="height: 20em;"
|
||||
onclick="HandleEvent(event);" flex="1"
|
||||
multiple="true" onkeypress="HandleEvent(event,1)">
|
||||
<treecolgroup>
|
||||
<treecol flex="1"/>
|
||||
</treecolgroup>
|
||||
<treehead>
|
||||
<treerow>
|
||||
<treecell class="treecell-header sortDirectionIndicator"
|
||||
label="&treehead.site.label;"
|
||||
onclick="return Wallet_ColumnSort('0', 'ignoredlist');"/>
|
||||
</treerow>
|
||||
</treehead>
|
||||
<treechildren flex="1" id="ignoredlist"/>
|
||||
</tree>
|
||||
<outliner id="rejectsOutliner" flex="1" style="height: 10em;" multiple="true"
|
||||
onkeypress="HandleRejectKeyPress(event)">
|
||||
<outlinercol id="rejectCol" label="&treehead.site.label;" flex="5"
|
||||
onclick="RejectColumnSort('host');"/>
|
||||
<outlinerbody flex="1" onselect="RejectSelected();"/>
|
||||
</outliner>
|
||||
<separator class="thin"/>
|
||||
<hbox>
|
||||
<button id="removeIgnoredSite" disabled="true"
|
||||
label="&remove.label;" oncommand="DeleteIgnoredSite();"/>
|
||||
<button id="removeReject" disabled="true"
|
||||
label="&remove.label;" oncommand="DeleteReject();"/>
|
||||
<button id="removeAllSites"
|
||||
label="&removeall.label;"
|
||||
oncommand="DeleteAllSites();"/>
|
||||
oncommand="DeleteAllRejects();"/>
|
||||
</hbox>
|
||||
</vbox>
|
||||
<!-- do not preview panel -->
|
||||
<vbox id="nopreviewforms" flex="1">
|
||||
<description>&spiel.nopreview.label;</description>
|
||||
<separator class="thin"/>
|
||||
<tree id="nopreviewtree" style="height: 20em;"
|
||||
onclick="HandleEvent(event);" flex="1"
|
||||
multiple="true" onkeypress="HandleEvent(event,2)">
|
||||
<treecolgroup>
|
||||
<treecol flex="1"/>
|
||||
</treecolgroup>
|
||||
|
||||
<treehead>
|
||||
<treerow>
|
||||
<treecell class="treecell-header sortDirectionIndicator"
|
||||
label="&treehead.site.label;"
|
||||
onclick="return Wallet_ColumnSort('0', 'nopreviewlist');"/>
|
||||
</treerow>
|
||||
</treehead>
|
||||
<treechildren flex="1" id="nopreviewlist"/>
|
||||
</tree>
|
||||
<outliner id="nopreviewsOutliner" flex="1" style="height: 10em;" multiple="true"
|
||||
onkeypress="HandleNopreviewKeyPress(event)">
|
||||
<outlinercol id="nopreviewCol" label="&treehead.site.label;" flex="5"
|
||||
onclick="NopreviewColumnSort('host');"/>
|
||||
<outlinerbody flex="1" onselect="NopreviewSelected();"/>
|
||||
</outliner>
|
||||
<separator class="thin"/>
|
||||
<hbox>
|
||||
<button id="removeNoPreview" disabled="true"
|
||||
label="&remove.label;" oncommand="DeleteNoPreviewForm();"/>
|
||||
<button id="removeNopreview" disabled="true"
|
||||
label="&remove.label;" oncommand="DeleteNopreview();"/>
|
||||
<button id="removeAllNopreviews"
|
||||
label="&removeall.label;"
|
||||
oncommand="DeleteAllNopreviews();"/>
|
||||
@ -143,25 +116,16 @@
|
||||
<vbox id="nocaptureforms" flex="1">
|
||||
<description>&spiel.nocapture.label;</description>
|
||||
<separator class="thin"/>
|
||||
<tree id="nocapturetree" style="height: 20em;"
|
||||
onclick="HandleEvent(event);" flex="1"
|
||||
multiple="true" onkeypress="HandleEvent(event,3)">
|
||||
<treecolgroup>
|
||||
<treecol flex="1"/>
|
||||
</treecolgroup>
|
||||
<treehead>
|
||||
<treerow>
|
||||
<treecell class="treecell-header sortDirectionIndicator"
|
||||
label="&treehead.site.label;"
|
||||
onclick="return Wallet_ColumnSort('0', 'nocapturelist');"/>
|
||||
</treerow>
|
||||
</treehead>
|
||||
<treechildren flex="1" id="nocapturelist"/>
|
||||
</tree>
|
||||
<outliner id="nocapturesOutliner" flex="1" style="height: 10em;" multiple="true"
|
||||
onkeypress="HandleNocaptureKeyPress(event)">
|
||||
<outlinercol id="nocaptureCol" label="&treehead.site.label;" flex="5"
|
||||
onclick="NocaptureColumnSort('host');"/>
|
||||
<outlinerbody flex="1" onselect="NocaptureSelected();"/>
|
||||
</outliner>
|
||||
<separator class="thin"/>
|
||||
<hbox>
|
||||
<button id="removeNoCapture" disabled="true"
|
||||
label="&remove.label;" oncommand="DeleteNoCaptureForm();"/>
|
||||
<button id="removeNocapture" disabled="true"
|
||||
label="&remove.label;" oncommand="DeleteNocapture();"/>
|
||||
<button id="removeAllNocaptures"
|
||||
label="&removeall.label;"
|
||||
oncommand="DeleteAllNocaptures();"/>
|
||||
|
||||
@ -2913,7 +2913,6 @@ WLLT_GetNopreviewListForViewer(nsString& aNopreviewList)
|
||||
{
|
||||
wallet_Initialize(PR_FALSE); /* to initialize helpMac */
|
||||
nsAutoString buffer;
|
||||
int nopreviewNum = 0;
|
||||
wallet_MapElement *url;
|
||||
|
||||
wallet_InitializeURLList();
|
||||
@ -2922,12 +2921,7 @@ WLLT_GetNopreviewListForViewer(nsString& aNopreviewList)
|
||||
url = NS_STATIC_CAST(wallet_MapElement*, wallet_URL_list->ElementAt(i));
|
||||
if (url->item2.CharAt(NO_PREVIEW) == 'y') {
|
||||
buffer.AppendWithConversion(BREAK);
|
||||
buffer.Append(NS_LITERAL_STRING("<OPTION value="));
|
||||
buffer.AppendInt(nopreviewNum, 10);
|
||||
buffer.Append(NS_LITERAL_STRING(">"));
|
||||
buffer += url->item1;
|
||||
buffer.Append(NS_LITERAL_STRING("</OPTION>\n"));
|
||||
nopreviewNum++;
|
||||
}
|
||||
}
|
||||
aNopreviewList = buffer;
|
||||
@ -2937,7 +2931,6 @@ PUBLIC void
|
||||
WLLT_GetNocaptureListForViewer(nsString& aNocaptureList)
|
||||
{
|
||||
nsAutoString buffer;
|
||||
int nocaptureNum = 0;
|
||||
wallet_MapElement *url;
|
||||
|
||||
wallet_InitializeURLList();
|
||||
@ -2946,12 +2939,7 @@ WLLT_GetNocaptureListForViewer(nsString& aNocaptureList)
|
||||
url = NS_STATIC_CAST(wallet_MapElement*, wallet_URL_list->ElementAt(i));
|
||||
if (url->item2.CharAt(NO_CAPTURE) == 'y') {
|
||||
buffer.AppendWithConversion(BREAK);
|
||||
buffer.Append(NS_LITERAL_STRING("<OPTION value="));
|
||||
buffer.AppendInt(nocaptureNum, 10);
|
||||
buffer.Append(NS_LITERAL_STRING(">"));
|
||||
buffer += url->item1;
|
||||
buffer.Append(NS_LITERAL_STRING("</OPTION>\n"));
|
||||
nocaptureNum++;
|
||||
}
|
||||
}
|
||||
aNocaptureList = buffer;
|
||||
|
||||
@ -20,87 +20,149 @@
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
var setID=0, setValue=0, getID=0, getValue=0;
|
||||
function Wallet_ColumnSort(columnPosition, childrenName)
|
||||
{
|
||||
//var startTime = new Date();
|
||||
function DeleteAllFromOutliner
|
||||
(outliner, view, table, deletedTable, removeButton, removeAllButton) {
|
||||
|
||||
// determine if sort is to be ascending or descending
|
||||
// it is ascending if it is the first sort for this tree
|
||||
// it is ascending if last sort was on a different column
|
||||
// else it is the opposite of whatever the last sort for this column was
|
||||
var children = document.getElementById(childrenName);
|
||||
var lastColumnPosition = children.getAttribute('lastColumnPosition');
|
||||
var ascending = true;
|
||||
if (columnPosition == lastColumnPosition) {
|
||||
ascending = (children.getAttribute('lastAscending') != 'true');
|
||||
} else {
|
||||
children.setAttribute('lastColumnPosition', columnPosition);
|
||||
// remove all items from table and place in deleted table
|
||||
for (var i=0; i<table.length; i++) {
|
||||
deletedTable[deletedTable.length] = table[i];
|
||||
}
|
||||
children.setAttribute('lastAscending', ascending);
|
||||
bubbleSort(columnPosition, ascending, children);
|
||||
//dump("bubble sort time="+((new Date())-startTime)+"\n");
|
||||
return true;
|
||||
table.length = 0;
|
||||
|
||||
// clear out selections
|
||||
outliner.outlinerBoxObject.view.selection.select(-1);
|
||||
|
||||
// redisplay
|
||||
view.rowCount = 0;
|
||||
outliner.outlinerBoxObject.invalidate();
|
||||
|
||||
|
||||
// disable buttons
|
||||
document.getElementById(removeButton).setAttribute("disabled", "true")
|
||||
document.getElementById(removeAllButton).setAttribute("disabled","true");
|
||||
}
|
||||
|
||||
// XXX we would like to use Array.prototype.sort, but the DOM doesn't let it
|
||||
// XXX swap elements using property sets
|
||||
function bubbleSort(columnPosition, ascending, children)
|
||||
{
|
||||
var a = children.childNodes;
|
||||
var n = a.length, m = n - 1;
|
||||
function DeleteSelectedItemFromOutliner
|
||||
(outliner, view, table, deletedTable, removeButton, removeAllButton) {
|
||||
|
||||
// for efficiencey, read all the value attributes only once and store in an array
|
||||
var keys = [];
|
||||
for (var x=0; x<n; x++){
|
||||
var keyCell = a[x].firstChild.childNodes[columnPosition];
|
||||
keys[x] = keyCell.getAttribute('label');
|
||||
// remove selected items from list (by setting them to null) and place in deleted list
|
||||
var selections = GetOutlinerSelections(outliner);
|
||||
for (var s=selections.length-1; s>= 0; s--) {
|
||||
var i = selections[s];
|
||||
deletedTable[deletedTable.length] = table[i];
|
||||
table[i] = null;
|
||||
}
|
||||
|
||||
for (var i = 0; i < m; i++) {
|
||||
var key = keys[i];
|
||||
// collapse list by removing all the null entries
|
||||
for (var j=0; j<table.length; j++) {
|
||||
if (table[j] == null) {
|
||||
var k = j;
|
||||
while ((k < table.length) && (table[k] == null)) {
|
||||
k++;
|
||||
}
|
||||
table.splice(j, k-j);
|
||||
}
|
||||
}
|
||||
|
||||
// redisplay
|
||||
var box = outliner.outlinerBoxObject;
|
||||
var firstRow = box.getFirstVisibleRow();
|
||||
view.rowCount = table.length;
|
||||
box.rowCountChanged(0, table.length);
|
||||
box.scrollToRow(firstRow)
|
||||
|
||||
// update selection and/or buttons
|
||||
if (table.length) {
|
||||
|
||||
// update selection
|
||||
// note: we need to deselect before reselecting in order to trigger ...Selected method
|
||||
var nextSelection = (selections[0] < table.length) ? selections[0] : table.length-1;
|
||||
outliner.outlinerBoxObject.view.selection.select(-1);
|
||||
outliner.outlinerBoxObject.view.selection.select(nextSelection);
|
||||
|
||||
} else {
|
||||
|
||||
// disable buttons
|
||||
document.getElementById(removeButton).setAttribute("disabled", "true")
|
||||
document.getElementById(removeAllButton).setAttribute("disabled","true");
|
||||
|
||||
// clear out selections
|
||||
outliner.outlinerBoxObject.view.selection.select(-1);
|
||||
}
|
||||
}
|
||||
|
||||
function GetOutlinerSelections(outliner) {
|
||||
var selections = [];
|
||||
var select = outliner.outlinerBoxObject.selection;
|
||||
if (select) {
|
||||
var count = select.getRangeCount();
|
||||
var min = new Object();
|
||||
var max = new Object();
|
||||
for (var i=0; i<count; i++) {
|
||||
select.getRangeAt(i, min, max);
|
||||
for (var k=min.value; k<=max.value; k++) {
|
||||
if (k != -1) {
|
||||
selections[selections.length] = k;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return selections;
|
||||
}
|
||||
|
||||
function SortOutliner(outliner, view, table, column, lastSortColumn, lastSortAscending) {
|
||||
|
||||
// remember which item was selected so we can restore it after the sort
|
||||
var selections = GetOutlinerSelections(outliner);
|
||||
var selectedNumber = selections.length ? table[selections[0]].number : -1;
|
||||
|
||||
// determine if sort is to be ascending or descending
|
||||
var ascending = (column == lastSortColumn) ? !lastSortAscending : true;
|
||||
|
||||
// do the sort
|
||||
BubbleSort(column, ascending, table);
|
||||
|
||||
// restore the selection
|
||||
var selectedRow = -1;
|
||||
if (selectedNumber>=0) {
|
||||
for (var s=0; s<table.length; s++) {
|
||||
if (table[s].number == selectedNumber) {
|
||||
// update selection
|
||||
// note: we need to deselect before reselecting in order to trigger ...Selected()
|
||||
outliner.outlinerBoxObject.view.selection.select(-1);
|
||||
outliner.outlinerBoxObject.view.selection.select(s);
|
||||
selectedRow = s;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// display the results
|
||||
outliner.outlinerBoxObject.invalidate();
|
||||
if (selectedRow>0) {
|
||||
outliner.outlinerBoxObject.ensureRowIsVisible(selectedRow)
|
||||
}
|
||||
|
||||
return ascending;
|
||||
}
|
||||
|
||||
function BubbleSort(columnName, ascending, table) {
|
||||
var len = table.length, len_1 = len - 1;
|
||||
|
||||
for (var i = 0; i < len_1; i++) {
|
||||
var key = table[i][columnName];
|
||||
var winner = -1;
|
||||
for (var j = i + 1; j < n; j++) {
|
||||
var nextKey = keys[j];
|
||||
for (var j = i + 1; j < len; j++) {
|
||||
var nextKey = table[j][columnName];
|
||||
if (ascending ? key > nextKey : key < nextKey) {
|
||||
key = nextKey;
|
||||
winner = j;
|
||||
}
|
||||
}
|
||||
if (winner != -1){
|
||||
|
||||
// get the corresponding menuitems
|
||||
var item = a[i];
|
||||
var row = item.firstChild;
|
||||
var nextItem = a[winner];
|
||||
var nextRow = nextItem.firstChild;
|
||||
|
||||
// swap the row values and the id's of the corresponding menuitems
|
||||
var temp = item.getAttribute('id');
|
||||
item.setAttribute('id', nextItem.getAttribute('id'));
|
||||
nextItem.setAttribute('id', temp);
|
||||
|
||||
var cell = row.firstChild;
|
||||
var nextCell = nextRow.firstChild;
|
||||
var position = 0;
|
||||
while (cell) {
|
||||
var value_i;
|
||||
var value_winner;
|
||||
if (position == columnPosition) {
|
||||
value_i = keys[i];
|
||||
value_winner = keys[winner];
|
||||
keys[i] = value_winner;
|
||||
keys[winner] = value_i;
|
||||
} else {
|
||||
value_i = cell.getAttribute('label');
|
||||
value_winner = nextCell.getAttribute('label');
|
||||
}
|
||||
cell.setAttribute('label', value_winner);
|
||||
nextCell.setAttribute('label', value_i);
|
||||
cell = cell.nextSibling;
|
||||
nextCell = nextCell.nextSibling;
|
||||
position++;
|
||||
}
|
||||
var temp = table[i];
|
||||
table[i] = table[winner];
|
||||
table[winner] = temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user