!import
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1 //@line 42 "/home/visbrero/mnt/roisin/rev_control/hg/mozilla/toolkit/components/passwordmgr/content/passwordManagerCommon.js"
2
3 /*** =================== INITIALISATION CODE =================== ***/
4
5 var kObserverService;
6 var gSelectUserInUse = false;
7
8 // interface variables
9 var passwordmanager = null;
10
11 // password-manager lists
12 var signons = [];
13 var rejects = [];
14 var deletedSignons = [];
15 var deletedRejects = [];
16
17 var signonsTree;
18 var rejectsTree;
19
20 var showingPasswords = false;
21
Startup
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
22 function Startup() {
23 // xpconnect to password manager interfaces
24 passwordmanager = Components.classes["@mozilla.org/login-manager;1"]
25 .getService(Components.interfaces.nsILoginManager);
26
27 // be prepared to reload the display if anything changes
28 kObserverService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
29 kObserverService.addObserver(signonReloadDisplay, "signonChanged", false);
30
31 // be prepared to disable the buttons when selectuser dialog is in use
32 kObserverService.addObserver(signonReloadDisplay, "signonSelectUser", false);
33
34 signonsTree = document.getElementById("signonsTree");
35 rejectsTree = document.getElementById("rejectsTree");
36 }
37
Shutdown
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
38 function Shutdown() {
39 kObserverService.removeObserver(signonReloadDisplay, "signonChanged");
40 kObserverService.removeObserver(signonReloadDisplay, "signonSelectUser");
41 }
42
43 var signonReloadDisplay = {
observe
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
44 observe: function(subject, topic, state) {
45 if (topic == "signonChanged") {
46 if (state == "signons") {
47 signons.length = 0;
48 if (lastSignonSortColumn == "hostname") {
49 lastSignonSortAscending = !lastSignonSortAscending; // prevents sort from being reversed
50 }
51 LoadSignons();
52 // apply the filter if needed
53 if (document.getElementById("filter") && document.getElementById("filter").value != "") {
54 _filterPasswords();
55 }
56 } else if (state == "rejects") {
57 rejects.length = 0;
58 if (lastRejectSortColumn == "hostname") {
59 lastRejectSortAscending = !lastRejectSortAscending; // prevents sort from being reversed
60 }
61 LoadRejects();
62 }
63 } else if (topic == "signonSelectUser") {
64 if (state == "suspend") {
65 gSelectUserInUse = true;
66 document.getElementById("removeSignon").disabled = true;
67 document.getElementById("removeAllSignons").disabled = true;
68 document.getElementById("togglePasswords").disabled = true;
69 } else if (state == "resume") {
70 gSelectUserInUse = false;
71 var selections = GetTreeSelections(signonsTree);
72 if (selections.length > 0) {
73 document.getElementById("removeSignon").disabled = false;
74 }
75 if (signons.length > 0) {
76 document.getElementById("removeAllSignons").disabled = false;
77 document.getElementById("togglePasswords").disabled = false;
78 }
79 } else if (state == "inUse") {
80 gSelectUserInUse = true;
81 }
82 }
83 }
84 }
85
86 /*** =================== GENERAL CODE =================== ***/
87
DeleteAllFromTree
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
88 function DeleteAllFromTree(tree, view, table, deletedTable, removeButton, removeAllButton) {
89
90 // remove all items from table and place in deleted table
91 for (var i=0; i<table.length; i++) {
92 deletedTable[deletedTable.length] = table[i];
93 }
94 table.length = 0;
95
96 // clear out selections
97 view.selection.select(-1);
98
99 // update the tree view and notify the tree
100 view.rowCount = 0;
101
102 var box = tree.treeBoxObject;
103 box.rowCountChanged(0, -deletedTable.length);
104 box.invalidate();
105
106
107 // disable buttons
108 document.getElementById(removeButton).setAttribute("disabled", "true")
109 document.getElementById(removeAllButton).setAttribute("disabled","true");
110 }
111
DeleteSelectedItemFromTree
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
112 function DeleteSelectedItemFromTree
113 (tree, view, table, deletedTable, removeButton, removeAllButton) {
114
115 // Turn off tree selection notifications during the deletion
116 tree.view.selection.selectEventsSuppressed = true;
117
118 // remove selected items from list (by setting them to null) and place in deleted list
119 var selections = GetTreeSelections(tree);
120 for (var s=selections.length-1; s>= 0; s--) {
121 var i = selections[s];
122 deletedTable[deletedTable.length] = table[i];
123 table[i] = null;
124 }
125
126 // collapse list by removing all the null entries
127 for (var j=0; j<table.length; j++) {
128 if (table[j] == null) {
129 var k = j;
130 while ((k < table.length) && (table[k] == null)) {
131 k++;
132 }
133 table.splice(j, k-j);
134 view.rowCount -= k - j;
135 tree.treeBoxObject.rowCountChanged(j, j - k);
136 }
137 }
138
139 // update selection and/or buttons
140 if (table.length) {
141 // update selection
142 var nextSelection = (selections[0] < table.length) ? selections[0] : table.length-1;
143 tree.view.selection.select(nextSelection);
144 tree.treeBoxObject.ensureRowIsVisible(nextSelection);
145 } else {
146 // disable buttons
147 document.getElementById(removeButton).setAttribute("disabled", "true")
148 document.getElementById(removeAllButton).setAttribute("disabled","true");
149 }
150 tree.view.selection.selectEventsSuppressed = false;
151 }
152
GetTreeSelections
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
153 function GetTreeSelections(tree) {
154 var selections = [];
155 var select = tree.view.selection;
156 if (select) {
157 var count = select.getRangeCount();
158 var min = new Object();
159 var max = new Object();
160 for (var i=0; i<count; i++) {
161 select.getRangeAt(i, min, max);
162 for (var k=min.value; k<=max.value; k++) {
163 if (k != -1) {
164 selections[selections.length] = k;
165 }
166 }
167 }
168 }
169 return selections;
170 }
171
SortTree
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
172 function SortTree(tree, view, table, column, lastSortColumn, lastSortAscending, updateSelection) {
173
174 // remember which item was selected so we can restore it after the sort
175 var selections = GetTreeSelections(tree);
176 var selectedNumber = selections.length ? table[selections[0]].number : -1;
177
178 // determine if sort is to be ascending or descending
179 var ascending = (column == lastSortColumn) ? !lastSortAscending : true;
180
181 // do the sort
182 var compareFunc;
183 if (ascending) {
compare
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
184 compareFunc = function compare(first, second) {
185 return CompareLowerCase(first[column], second[column]);
186 }
187 } else {
compare
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
188 compareFunc = function compare(first, second) {
189 return CompareLowerCase(second[column], first[column]);
190 }
191 }
192 table.sort(compareFunc);
193
194 // restore the selection
195 var selectedRow = -1;
196 if (selectedNumber>=0 && updateSelection) {
197 for (var s=0; s<table.length; s++) {
198 if (table[s].number == selectedNumber) {
199 // update selection
200 // note: we need to deselect before reselecting in order to trigger ...Selected()
201 tree.view.selection.select(-1);
202 tree.view.selection.select(s);
203 selectedRow = s;
204 break;
205 }
206 }
207 }
208
209 // display the results
210 tree.treeBoxObject.invalidate();
211 if (selectedRow >= 0) {
212 tree.treeBoxObject.ensureRowIsVisible(selectedRow)
213 }
214
215 return ascending;
216 }
217
218 /**
219 * Case insensitive string comparator.
220 */
CompareLowerCase
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
221 function CompareLowerCase(first, second) {
222 var firstLower, secondLower;
223
224 // Are we sorting nsILoginInfo entries or just strings?
225 if (first.hostname) {
226 firstLower = first.hostname.toLowerCase();
227 secondLower = second.hostname.toLowerCase();
228 } else {
229 firstLower = first.toLowerCase();
230 secondLower = second.toLowerCase();
231 }
232
233 if (firstLower < secondLower) {
234 return -1;
235 }
236
237 if (firstLower > secondLower) {
238 return 1;
239 }
240
241 return 0;
242 }