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:
morse%netscape.com 2001-11-22 00:16:37 +00:00
parent fb92157584
commit 61558cddcc
10 changed files with 1029 additions and 1230 deletions

View File

@ -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">

View File

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

View File

@ -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.

View File

@ -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>

View File

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

View File

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

View File

@ -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, '')
}

View File

@ -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();"/>

View File

@ -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;

View File

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