toolkit/components/passwordmgr/content/passwordManagerCommon.js

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     1 // -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
     3 /* This Source Code Form is subject to the terms of the Mozilla Public
     4  * License, v. 2.0. If a copy of the MPL was not distributed with this
     5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 /*** =================== INITIALISATION CODE =================== ***/
     9 var kObserverService;
    11 // interface variables
    12 var passwordmanager     = null;
    14 // password-manager lists
    15 var signons             = [];
    16 var rejects             = [];
    17 var deletedSignons      = [];
    18 var deletedRejects      = [];
    20 var signonsTree;
    21 var rejectsTree;
    23 var showingPasswords = false;
    25 function Startup() {
    26   // xpconnect to password manager interfaces
    27   passwordmanager = Components.classes["@mozilla.org/login-manager;1"]
    28                         .getService(Components.interfaces.nsILoginManager);
    30   // be prepared to reload the display if anything changes
    31   kObserverService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
    32   kObserverService.addObserver(signonReloadDisplay, "passwordmgr-storage-changed", false);
    34   signonsTree = document.getElementById("signonsTree");
    35   rejectsTree = document.getElementById("rejectsTree");
    36 }
    38 function Shutdown() {
    39   kObserverService.removeObserver(signonReloadDisplay, "passwordmgr-storage-changed");
    40 }
    42 var signonReloadDisplay = {
    43   observe: function(subject, topic, data) {
    44     if (topic == "passwordmgr-storage-changed") {
    45       switch (data) {
    46         case "addLogin":
    47         case "modifyLogin":
    48         case "removeLogin":
    49         case "removeAllLogins":
    50           if (!signonsTree) {
    51             return;
    52           }
    53           signons.length = 0;
    54           LoadSignons();
    55           // apply the filter if needed
    56           if (document.getElementById("filter") && document.getElementById("filter").value != "") {
    57             _filterPasswords();
    58           }
    59           break;
    60         case "hostSavingEnabled":
    61         case "hostSavingDisabled":
    62           if (!rejectsTree) {
    63             return;
    64           }
    65           rejects.length = 0;
    66           if (lastRejectSortColumn == "hostname") {
    67             lastRejectSortAscending = !lastRejectSortAscending; // prevents sort from being reversed
    68           }
    69           LoadRejects();
    70           break;
    71       }
    72       kObserverService.notifyObservers(null, "passwordmgr-dialog-updated", null);
    73     }
    74   }
    75 }
    77 /*** =================== GENERAL CODE =================== ***/
    79 function DeleteAllFromTree(tree, view, table, deletedTable, removeButton, removeAllButton) {
    81   // remove all items from table and place in deleted table
    82   for (var i=0; i<table.length; i++) {
    83     deletedTable[deletedTable.length] = table[i];
    84   }
    85   table.length = 0;
    87   // clear out selections
    88   view.selection.select(-1); 
    90   // update the tree view and notify the tree
    91   view.rowCount = 0;
    93   var box = tree.treeBoxObject;
    94   box.rowCountChanged(0, -deletedTable.length);
    95   box.invalidate();
    98   // disable buttons
    99   document.getElementById(removeButton).setAttribute("disabled", "true")
   100   document.getElementById(removeAllButton).setAttribute("disabled","true");
   101 }
   103 function DeleteSelectedItemFromTree
   104     (tree, view, table, deletedTable, removeButton, removeAllButton) {
   106   // Turn off tree selection notifications during the deletion
   107   tree.view.selection.selectEventsSuppressed = true;
   109   // remove selected items from list (by setting them to null) and place in deleted list
   110   var selections = GetTreeSelections(tree);
   111   for (var s=selections.length-1; s>= 0; s--) {
   112     var i = selections[s];
   113     deletedTable[deletedTable.length] = table[i];
   114     table[i] = null;
   115   }
   117   // collapse list by removing all the null entries
   118   for (var j=0; j<table.length; j++) {
   119     if (table[j] == null) {
   120       var k = j;
   121       while ((k < table.length) && (table[k] == null)) {
   122         k++;
   123       }
   124       table.splice(j, k-j);
   125       view.rowCount -= k - j;
   126       tree.treeBoxObject.rowCountChanged(j, j - k);
   127     }
   128   }
   130   // update selection and/or buttons
   131   if (table.length) {
   132     // update selection
   133     var nextSelection = (selections[0] < table.length) ? selections[0] : table.length-1;
   134     tree.view.selection.select(nextSelection);
   135     tree.treeBoxObject.ensureRowIsVisible(nextSelection);
   136   } else {
   137     // disable buttons
   138     document.getElementById(removeButton).setAttribute("disabled", "true")
   139     document.getElementById(removeAllButton).setAttribute("disabled","true");
   140   }
   141   tree.view.selection.selectEventsSuppressed = false;
   142 }
   144 function GetTreeSelections(tree) {
   145   var selections = [];
   146   var select = tree.view.selection;
   147   if (select) {
   148     var count = select.getRangeCount();
   149     var min = new Object();
   150     var max = new Object();
   151     for (var i=0; i<count; i++) {
   152       select.getRangeAt(i, min, max);
   153       for (var k=min.value; k<=max.value; k++) {
   154         if (k != -1) {
   155           selections[selections.length] = k;
   156         }
   157       }
   158     }
   159   }
   160   return selections;
   161 }
   163 function SortTree(tree, view, table, column, lastSortColumn, lastSortAscending, updateSelection) {
   165   // remember which item was selected so we can restore it after the sort
   166   var selections = GetTreeSelections(tree);
   167   var selectedNumber = selections.length ? table[selections[0]].number : -1;
   169   // determine if sort is to be ascending or descending
   170   var ascending = (column == lastSortColumn) ? !lastSortAscending : true;
   172   // do the sort
   173   var compareFunc;
   174   if (ascending) {
   175     compareFunc = function compare(first, second) {
   176       return CompareLowerCase(first[column], second[column]);
   177     }
   178   } else {
   179     compareFunc = function compare(first, second) {
   180       return CompareLowerCase(second[column], first[column]);
   181     }
   182   }
   183   table.sort(compareFunc);
   185   // restore the selection
   186   var selectedRow = -1;
   187   if (selectedNumber>=0 && updateSelection) {
   188     for (var s=0; s<table.length; s++) {
   189       if (table[s].number == selectedNumber) {
   190         // update selection
   191         // note: we need to deselect before reselecting in order to trigger ...Selected()
   192         tree.view.selection.select(-1);
   193         tree.view.selection.select(s);
   194         selectedRow = s;
   195         break;
   196       }
   197     }
   198   }
   200   // display the results
   201   tree.treeBoxObject.invalidate();
   202   if (selectedRow >= 0) {
   203     tree.treeBoxObject.ensureRowIsVisible(selectedRow)
   204   }
   206   return ascending;
   207 }
   209 /**
   210  * Case insensitive string comparator.
   211  */
   212 function CompareLowerCase(first, second) {
   213   var firstLower, secondLower;
   215   // Are we sorting nsILoginInfo entries or just strings?
   216   if (first.hostname) {
   217     firstLower  = first.hostname.toLowerCase();
   218     secondLower = second.hostname.toLowerCase();
   219   } else {
   220     firstLower  = first.toLowerCase();
   221     secondLower = second.toLowerCase();
   222   }
   224   if (firstLower < secondLower) {
   225     return -1;
   226   }
   228   if (firstLower > secondLower) {
   229     return 1;
   230   }
   232   return 0;
   233 }

mercurial