diff --git a/mozilla/toolkit/components/passwordmgr/resources/content/contents.rdf b/mozilla/toolkit/components/passwordmgr/resources/content/contents.rdf new file mode 100644 index 00000000000..e21e80a5f57 --- /dev/null +++ b/mozilla/toolkit/components/passwordmgr/resources/content/contents.rdf @@ -0,0 +1,18 @@ + + + + + + + + + + + + + diff --git a/mozilla/toolkit/components/passwordmgr/resources/content/passwordManager.js b/mozilla/toolkit/components/passwordmgr/resources/content/passwordManager.js new file mode 100644 index 00000000000..803f9211482 --- /dev/null +++ b/mozilla/toolkit/components/passwordmgr/resources/content/passwordManager.js @@ -0,0 +1,511 @@ +# -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- +# +# The contents of this file are subject to the Netscape Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/NPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is Mozilla Communicator client code, released March +# 31, 1998. +# +# The Initial Developer of the Original Code is Netscape Communications +# Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): +# Ben "Count XULula" Goodger +# Brian Ryner + +/*** =================== INITIALISATION CODE =================== ***/ + +var kObserverService; +var kSignonBundle; +var gSelectUserInUse = false; + +// interface variables +var passwordmanager = null; + +// password-manager lists +var signons = []; +var rejects = []; +var deletedSignons = []; +var deletedRejects = []; + +function Startup() { + // xpconnect to password manager interfaces + passwordmanager = Components.classes["@mozilla.org/passwordmanager;1"].getService(Components.interfaces.nsIPasswordManager); + + kSignonBundle = document.getElementById("signonBundle"); + + // be prepared to reload the display if anything changes + kObserverService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService); + kObserverService.addObserver(signonReloadDisplay, "signonChanged", false); + + // be prepared to disable the buttons when selectuser dialog is in use + kObserverService.addObserver(signonReloadDisplay, "signonSelectUser", false); + + signonsTree = document.getElementById("signonsTree"); + rejectsTree = document.getElementById("rejectsTree"); + + // set initial password-manager tab + var tabBox = document.getElementById("tabbox"); + tabBox.selectedTab = document.getElementById("signonsTab"); + + // load password manager items + if (!LoadSignons()) { + return; /* user failed to unlock the database */ + } + LoadRejects(); + + + // label the close button + document.documentElement.getButton("accept").label = kSignonBundle.getString("close"); +} + +function Shutdown() { + if (isPasswordManager) { + kObserverService.removeObserver(signonReloadDisplay, "signonChanged"); + kObserverService.removeObserver(signonReloadDisplay, "signonSelectUser"); + } +} + +var signonReloadDisplay = { + observe: function(subject, topic, state) { + if (topic == "signonChanged") { + if (state == "signons") { + signons.length = 0; + if (lastSignonSortColumn == "host") { + lastSignonSortAscending = !lastSignonSortAscending; // prevents sort from being reversed + } + LoadSignons(); + } else if (state == "rejects") { + rejects.length = 0; + if (lastRejectSortColumn == "host") { + lastRejectSortAscending = !lastRejectSortAscending; // prevents sort from being reversed + } + LoadRejects(); + } + } else if (topic == "signonSelectUser") { + if (state == "suspend") { + gSelectUserInUse = true; + document.getElementById("removeSignon").disabled = true; + document.getElementById("removeAllSignons").disabled = true; + } else if (state == "resume") { + gSelectUserInUse = false; + var selections = GetTreeSelections(signonsTree); + if (selections.length > 0) { + document.getElementById("removeSignon").disabled = false; + } + if (signons.length > 0) { + document.getElementById("removeAllSignons").disabled = false; + } + } else if (state == "inUse") { + gSelectUserInUse = true; + } + } + } +} + +/*** =================== SAVED SIGNONS CODE =================== ***/ + +var signonsTreeView = { + rowCount : 0, + setTree : function(tree){}, + getImageSrc : function(row,column) {}, + getProgressMode : function(row,column) {}, + getCellValue : function(row,column) {}, + getCellText : function(row,column){ + var rv=""; + if (column=="siteCol") { + rv = signons[row].host; + } else if (column=="userCol") { + rv = signons[row].user; + } + return rv; + }, + isSeparator : function(index) {return false;}, + isSorted: function() { 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 signonsTree; + +function Signon(number, host, user, rawuser) { + this.number = number; + this.host = host; + this.user = user; + this.rawuser = rawuser; +} + +function LoadSignons() { + // loads signons into table + var enumerator = passwordmanager.enumerator; + var count = 0; + + while (enumerator.hasMoreElements()) { + var nextPassword; + try { + 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 == "") { + var unused = { }; + var ioService = Components.classes["@mozilla.org/network/io-service;1"] + .getService(Components.interfaces.nsIIOService); + var username; + try { + username = ioService.newURI(host, null, null).username; + } catch(e) { + username = ""; + } + if (username != "") { + user = username; + } else { + user = "<>"; + } + } + + signons[count] = new Signon(count++, host, user, rawuser); + } + signonsTreeView.rowCount = signons.length; + + // sort and display the table + signonsTree.treeBoxObject.view = signonsTreeView; + SignonColumnSort('host'); + + // disable "remove all signons" button if there are no signons + var element = document.getElementById("removeAllSignons"); + if (signons.length == 0 || gSelectUserInUse) { + element.setAttribute("disabled","true"); + } else { + element.removeAttribute("disabled"); + } + + return true; +} + +function SignonSelected() { + var selections = GetTreeSelections(signonsTree); + if (selections.length && !gSelectUserInUse) { + document.getElementById("removeSignon").removeAttribute("disabled"); + } +} + +function DeleteSignon() { + DeleteSelectedItemFromTree(signonsTree, signonsTreeView, + signons, deletedSignons, + "removeSignon", "removeAllSignons"); + FinalizeSignonDeletions(); +} + +function DeleteAllSignons() { + DeleteAllFromTree(signonsTree, signonsTreeView, + signons, deletedSignons, + "removeSignon", "removeAllSignons"); + FinalizeSignonDeletions(); +} + +function FinalizeSignonDeletions() { + for (var s=0; s= 0; s--) { + var i = selections[s]; + deletedTable[deletedTable.length] = table[i]; + table[i] = null; + } + + // collapse list by removing all the null entries + for (var j=0; j (table.length-1) ) { + firstRow = table.length-1; + } + 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; + tree.treeBoxObject.view.selection.select(-1); + tree.treeBoxObject.view.selection.select(nextSelection); + + } else { + + // disable buttons + document.getElementById(removeButton).setAttribute("disabled", "true") + document.getElementById(removeAllButton).setAttribute("disabled","true"); + + // clear out selections + tree.treeBoxObject.view.selection.select(-1); + } +} + +function GetTreeSelections(tree) { + var selections = []; + var select = tree.treeBoxObject.selection; + if (select) { + var count = select.getRangeCount(); + var min = new Object(); + var max = new Object(); + for (var i=0; i second[column]) + return 1; + return 0; + } + } else { + compareFunc = function compare(first, second) { + if (first[column] < second[column]) + return 1; + if (first[column] > second[column]) + return -1; + return 0; + } + } + table.sort(compareFunc); + + // restore the selection + var selectedRow = -1; + if (selectedNumber>=0 && updateSelection) { + for (var s=0; s= 0) { + tree.treeBoxObject.ensureRowIsVisible(selectedRow) + } + + return ascending; +} diff --git a/mozilla/toolkit/components/passwordmgr/resources/content/passwordManager.xul b/mozilla/toolkit/components/passwordmgr/resources/content/passwordManager.xul new file mode 100644 index 00000000000..baac73adde9 --- /dev/null +++ b/mozilla/toolkit/components/passwordmgr/resources/content/passwordManager.xul @@ -0,0 +1,99 @@ + +# The contents of this file are subject to the Netscape Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/NPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is Mozilla Communicator client code, released +# March 31, 1998. +# +# The Initial Developer of the Original Code is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998-1999 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): +# Ben Goodger +# Brian Ryner + + + + + + + +