home *** CD-ROM | disk | FTP | other *** search
/ ftp.swcp.com / ftp.swcp.com.zip / ftp.swcp.com / mac / mozilla-macos9-1.3.1.sea.bin / Mozilla1.3.1 / Chrome / comm.jar / content / communicator / wallet / CookieViewer.js next >
Text File  |  2003-06-08  |  19KB  |  547 lines

  1. /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public
  4.  * License Version 1.1 (the "License"); you may not use this file
  5.  * except in compliance with the License. You may obtain a copy of
  6.  * the License at http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the License is distributed on an "AS
  9.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  10.  * implied. See the License for the specific language governing
  11.  * rights and limitations under the License.
  12.  *
  13.  * The Original Code is Mozilla Communicator client code, released March
  14.  * 31, 1998.
  15.  *
  16.  * The Initial Developer of the Original Code is Netscape Communications
  17.  * Corporation. Portions created by Netscape are
  18.  * Copyright (C) 1998 Netscape Communications Corporation. All
  19.  * Rights Reserved.
  20.  *
  21.  * Contributor(s): 
  22.  *   Ben Goodger
  23.  */
  24.  
  25. var kObserverService;
  26.  
  27. // interface variables
  28. var cookiemanager         = null;          // cookiemanager interface
  29. var permissionmanager     = null;          // permissionmanager interface
  30. var popupmanager          = null;          // popup manager
  31. var gDateService = null;
  32.  
  33. // cookies and permissions list
  34. var cookies               = [];
  35. var permissions           = [];
  36. var deletedCookies       = [];
  37. var deletedPermissions   = [];
  38.  
  39. // differentiate between cookies, images, and popups
  40. const cookieType = 0;
  41. const imageType = 1;
  42. const popupType = 2;
  43.  
  44. var dialogType = cookieType;
  45. if (window.arguments[0] == "imageManager")
  46.   dialogType = imageType;
  47. else if (window.arguments[0] == "popupManager")
  48.   dialogType = popupType;
  49.  
  50. var cookieBundle;
  51.  
  52. function Startup() {
  53.  
  54.   // arguments passed to this routine:
  55.   //   cookieManager 
  56.   //   cookieManagerFromIcon
  57.   //   imageManager
  58.  
  59.   // xpconnect to cookiemanager/permissionmanager/popupmanager interfaces
  60.   cookiemanager = Components.classes["@mozilla.org/cookiemanager;1"].getService();
  61.   cookiemanager = cookiemanager.QueryInterface(Components.interfaces.nsICookieManager);
  62.   permissionmanager = Components.classes["@mozilla.org/permissionmanager;1"].getService();
  63.   permissionmanager = permissionmanager.QueryInterface(Components.interfaces.nsIPermissionManager);
  64.   popupmanager = Components.classes["@mozilla.org/PopupWindowManager;1"].getService();
  65.   popupmanager = popupmanager.QueryInterface(Components.interfaces.nsIPopupWindowManager);
  66.  
  67.   // intialize gDateService
  68.   if (!gDateService) {
  69.     const nsScriptableDateFormat_CONTRACTID = "@mozilla.org/intl/scriptabledateformat;1";
  70.     const nsIScriptableDateFormat = Components.interfaces.nsIScriptableDateFormat;
  71.     gDateService = Components.classes[nsScriptableDateFormat_CONTRACTID]
  72.       .getService(nsIScriptableDateFormat);
  73.   }
  74.  
  75.   // intialize string bundle
  76.   cookieBundle = document.getElementById("cookieBundle");
  77.  
  78.   // label the close button
  79.   document.documentElement.getButton("accept").label = cookieBundle.getString("close");
  80.  
  81.   // determine if labelling is for cookies or images
  82.   try {
  83.     var tabBox = document.getElementById("tabbox");
  84.     var element;
  85.     if (dialogType == cookieType) {
  86.       element = document.getElementById("cookiesTab");
  87.       tabBox.selectedTab = element;
  88.     } else if (dialogType == imageType) {
  89.       element = document.getElementById("cookieviewer");
  90.       element.setAttribute("title", cookieBundle.getString("imageTitle"));
  91.       element = document.getElementById("permissionsTab");
  92.       element.label = cookieBundle.getString("tabBannedImages");
  93.       tabBox.selectedTab = element;
  94.       element = document.getElementById("permissionsText");
  95.       element.value = cookieBundle.getString("textBannedImages");
  96.       element = document.getElementById("cookiesTab");
  97.       element.hidden = "true";
  98.     } else {
  99.       element = document.getElementById("cookieviewer");
  100.       element.setAttribute("title", cookieBundle.getString("popupTitle"));
  101.       element = document.getElementById("permissionsTab");
  102.       element.label = cookieBundle.getString("tabBannedPopups");
  103.       tabBox.selectedTab = element;
  104.       element = document.getElementById("permissionsText");
  105.       element.value = cookieBundle.getString("textBannedPopups");
  106.       element = document.getElementById("cookiesTab");
  107.       element.hidden = "true";
  108.     }
  109.   } catch(e) {
  110.   }
  111.  
  112.   // load in the cookies and permissions
  113.   cookiesTree = document.getElementById("cookiesTree");
  114.   permissionsTree = document.getElementById("permissionsTree");
  115.   if (dialogType == cookieType) {
  116.     loadCookies();
  117.   }
  118.   loadPermissions();
  119.  
  120.   // be prepared to reload the display if anything changes
  121.   kObserverService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  122.   kObserverService.addObserver(cookieReloadDisplay, "cookieChanged", false);
  123.  
  124.   window.sizeToContent();
  125. }
  126.  
  127. function Shutdown() {
  128.   kObserverService.removeObserver(cookieReloadDisplay, "cookieChanged");
  129. }
  130.  
  131. var cookieReloadDisplay = {
  132.   observe: function(subject, topic, state) {
  133.     if (topic == "cookieChanged") {
  134.       if (state == "cookies") {
  135.         cookies.length = 0;
  136.         if (lastCookieSortColumn == "rawHost") {
  137.           lastCookieSortAscending = !lastCookieSortAscending; // prevents sort from being reversed
  138.         }
  139.         loadCookies();
  140.       } else if (state == "permissions") {
  141.         permissions.length = 0;
  142.         if (lastPermissionSortColumn == "rawHost") {
  143.           lastPermissionSortAscending = !lastPermissionSortAscending; // prevents sort from being reversed
  144.         }
  145.         loadPermissions();
  146.       }
  147.     }
  148.   }
  149. }
  150.  
  151. /*** =================== COOKIES CODE =================== ***/
  152.  
  153. const nsICookie = Components.interfaces.nsICookie;
  154.  
  155. var cookiesTreeView = {
  156.   rowCount : 0,
  157.   setTree : function(tree){},
  158.   getImageSrc : function(row,column) {},
  159.   getProgressMode : function(row,column) {},
  160.   getCellValue : function(row,column) {},
  161.   getCellText : function(row,column){
  162.     var rv="";
  163.     if (column=="domainCol") {
  164.       rv = cookies[row].rawHost;
  165.     } else if (column=="nameCol") {
  166.       rv = cookies[row].name;
  167.     } else if (column=="statusCol") {
  168.       rv = GetStatusString(cookies[row].status);
  169.     }
  170.     return rv;
  171.   },
  172.   isSeparator : function(index) {return false;},
  173.   isSorted: function() { return false; },
  174.   isContainer : function(index) {return false;},
  175.   cycleHeader : function(aColId, aElt) {},
  176.   getRowProperties : function(row,column,prop){},
  177.   getColumnProperties : function(column,columnElement,prop){},
  178.   getCellProperties : function(row,prop){}
  179.  };
  180. var cookiesTree;
  181.  
  182. function Cookie(number,name,value,isDomain,host,rawHost,path,isSecure,expires,
  183.                 status,policy) {
  184.   this.number = number;
  185.   this.name = name;
  186.   this.value = value;
  187.   this.isDomain = isDomain;
  188.   this.host = host;
  189.   this.rawHost = rawHost;
  190.   this.path = path;
  191.   this.isSecure = isSecure;
  192.   this.expires = expires;
  193.   this.status = status;
  194.   this.policy = policy;
  195. }
  196.  
  197. function loadCookies() {
  198.   // load cookies into a table
  199.   var enumerator = cookiemanager.enumerator;
  200.   var count = 0;
  201.   var showPolicyField = false;
  202.   while (enumerator.hasMoreElements()) {
  203.     var nextCookie = enumerator.getNext();
  204.     nextCookie = nextCookie.QueryInterface(Components.interfaces.nsICookie);
  205.     var host = nextCookie.host;
  206.     if (nextCookie.policy != nsICookie.POLICY_UNKNOWN) {
  207.       showPolicyField = true;
  208.     }
  209.     cookies[count] =
  210.       new Cookie(count++, nextCookie.name, nextCookie.value, nextCookie.isDomain, host,
  211.                  (host.charAt(0)==".") ? host.substring(1,host.length) : host,
  212.                  nextCookie.path, nextCookie.isSecure, nextCookie.expires,
  213.                  nextCookie.status, nextCookie.policy);
  214.   }
  215.   cookiesTreeView.rowCount = cookies.length;
  216.  
  217.   // sort and display the table
  218.   cookiesTree.treeBoxObject.view = cookiesTreeView;
  219.   if (window.arguments[0] == "cookieManagerFromIcon") { // came here by clicking on cookie icon
  220.  
  221.     // turn off the icon
  222.     var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  223.     observerService.notifyObservers(null, "cookieIcon", "off");
  224.  
  225.     // unhide the status column and sort by reverse order on that column
  226.     //    Note that the sort routine normally does an ascending sort.  The only
  227.     //    exception is if you sort on the same column more than once in a row.
  228.     //    In that case, the subsequent sorts will be the reverse of the previous ones.
  229.     //    So we are now going to force an initial reverse sort by fooling the sort routine
  230.     //    into thinking that it previously sorted on the status column and in ascending
  231.     //    order.
  232.     document.getElementById("statusCol").removeAttribute("hidden");
  233.     lastCookieSortAscending = true; // force order to have blanks last instead of vice versa
  234.     lastCookieSortColumn = 'status';
  235.     CookieColumnSort('status');
  236.  
  237.   } else {
  238.     // sort by host column
  239.     CookieColumnSort('rawHost');
  240.   }
  241.  
  242.   // disable "remove all cookies" button if there are no cookies
  243.   if (cookies.length == 0) {
  244.     document.getElementById("removeAllCookies").setAttribute("disabled","true");
  245.   } else {
  246.     document.getElementById("removeAllCookies").removeAttribute("disabled");
  247.   }
  248.  
  249.   // show policy field if at least one cookie has a policy
  250.   if (showPolicyField) {
  251.     document.getElementById("policyField").removeAttribute("hidden");
  252.   }
  253. }
  254.  
  255. function GetExpiresString(expires) {
  256.   if (expires) {
  257.     var date = new Date(1000*expires);
  258.     return gDateService.FormatDateTime("", gDateService.dateFormatLong,
  259.                                        gDateService.timeFormatSeconds, date.getFullYear(),
  260.                                        date.getMonth()+1, date.getDate(), date.getHours(),
  261.                                        date.getMinutes(), date.getSeconds());
  262.   }
  263.   return cookieBundle.getString("AtEndOfSession");
  264. }
  265.  
  266. function GetStatusString(status) {
  267.   switch (status) {
  268.     case nsICookie.STATUS_ACCEPTED:
  269.       return cookieBundle.getString("accepted");
  270.     case nsICookie.STATUS_FLAGGED:
  271.       return cookieBundle.getString("flagged");
  272.     case nsICookie.STATUS_DOWNGRADED:
  273.       return cookieBundle.getString("downgraded");
  274.   }
  275.   return "";
  276. }
  277.  
  278. function GetPolicyString(policy) {
  279.   switch (policy) {
  280.     case nsICookie.POLICY_NONE:
  281.       return cookieBundle.getString("policyUnstated");
  282.     case nsICookie.POLICY_NO_CONSENT:
  283.       return cookieBundle.getString("policyNoConsent");
  284.     case nsICookie.POLICY_IMPLICIT_CONSENT:
  285.       return cookieBundle.getString("policyImplicitConsent");
  286.     case nsICookie.POLICY_EXPLICIT_CONSENT:
  287.       return cookieBundle.getString("policyExplicitConsent");
  288.     case nsICookie.POLICY_NO_II:
  289.       return cookieBundle.getString("policyNoIICollected");
  290.   }
  291.   return "";
  292. }
  293.  
  294. function CookieSelected() {
  295.   var selections = GetTreeSelections(cookiesTree);
  296.   if (selections.length) {
  297.     document.getElementById("removeCookie").removeAttribute("disabled");
  298.   } else {
  299.     ClearCookieProperties();
  300.     return true;
  301.   }
  302.     
  303.   var idx = selections[0];
  304.   if (idx >= cookies.length) {
  305.     // Something got out of synch.  See bug 119812 for details
  306.     dump("Tree and viewer state are out of sync! " +
  307.          "Help us figure out the problem in bug 119812");
  308.     return;
  309.   }
  310.  
  311.   var props = [
  312.     {id: "ifl_name", value: cookies[idx].name},
  313.     {id: "ifl_value", value: cookies[idx].value}, 
  314.     {id: "ifl_isDomain",
  315.      value: cookies[idx].isDomain ?
  316.             cookieBundle.getString("domainColon") : cookieBundle.getString("hostColon")},
  317.     {id: "ifl_host", value: cookies[idx].host},
  318.     {id: "ifl_path", value: cookies[idx].path},
  319.     {id: "ifl_isSecure",
  320.      value: cookies[idx].isSecure ?
  321.             cookieBundle.getString("yes") : cookieBundle.getString("no")},
  322.     {id: "ifl_expires", value: GetExpiresString(cookies[idx].expires)},
  323.     {id: "ifl_policy", value: GetPolicyString(cookies[idx].policy)}
  324.   ];
  325.  
  326.   var value;
  327.   var field;
  328.   for (var i = 0; i < props.length; i++)
  329.   {
  330.     field = document.getElementById(props[i].id);
  331.     if ((selections.length > 1) && (props[i].id != "ifl_isDomain")) {
  332.       value = ""; // clear field if multiple selections
  333.     } else {
  334.       value = props[i].value;
  335.     }
  336.     field.value = value;
  337.   }
  338.   return true;
  339. }
  340.  
  341. function ClearCookieProperties() {
  342.   var properties = 
  343.     ["ifl_name","ifl_value","ifl_host","ifl_path","ifl_isSecure","ifl_expires","ifl_policy"];
  344.   for (var prop=0; prop<properties.length; prop++) {
  345.     document.getElementById(properties[prop]).value = "";
  346.   }
  347. }
  348.  
  349. function DeleteCookie() {
  350.   DeleteSelectedItemFromTree(cookiesTree, cookiesTreeView,
  351.                                  cookies, deletedCookies,
  352.                                  "removeCookie", "removeAllCookies");
  353.   if (!cookies.length) {
  354.     ClearCookieProperties();
  355.   }
  356.   FinalizeCookieDeletions();
  357. }
  358.  
  359. function DeleteAllCookies() {
  360.   ClearCookieProperties();
  361.   DeleteAllFromTree(cookiesTree, cookiesTreeView,
  362.                         cookies, deletedCookies,
  363.                         "removeCookie", "removeAllCookies");
  364.   FinalizeCookieDeletions();
  365. }
  366.  
  367. function FinalizeCookieDeletions() {
  368.   for (var c=0; c<deletedCookies.length; c++) {
  369.     cookiemanager.remove(deletedCookies[c].host,
  370.                          deletedCookies[c].name,
  371.                          deletedCookies[c].path,
  372.                          document.getElementById("checkbox").checked);
  373.   }
  374.   deletedCookies.length = 0;
  375. }
  376.  
  377. function HandleCookieKeyPress(e) {
  378.   if (e.keyCode == 46) {
  379.     DeleteCookie();
  380.   }
  381. }
  382.  
  383. var lastCookieSortColumn = "";
  384. var lastCookieSortAscending = false;
  385.  
  386. function CookieColumnSort(column) {
  387.   lastCookieSortAscending =
  388.     SortTree(cookiesTree, cookiesTreeView, cookies,
  389.                  column, lastCookieSortColumn, lastCookieSortAscending);
  390.   lastCookieSortColumn = column;
  391. }
  392.  
  393. /*** =================== PERMISSIONS CODE =================== ***/
  394.  
  395. var permissionsTreeView = {
  396.   rowCount : 0,
  397.   setTree : function(tree){},
  398.   getImageSrc : function(row,column) {},
  399.   getProgressMode : function(row,column) {},
  400.   getCellValue : function(row,column) {},
  401.   getCellText : function(row,column){
  402.     var rv="";
  403.     if (column=="siteCol") {
  404.       rv = permissions[row].rawHost;
  405.     } else if (column=="statusCol") {
  406.       rv = permissions[row].capability;
  407.     }
  408.     return rv;
  409.   },
  410.   isSeparator : function(index) {return false;},
  411.   isSorted: function() { return false; },
  412.   isContainer : function(index) {return false;},
  413.   cycleHeader : function(aColId, aElt) {},
  414.   getRowProperties : function(row,column,prop){},
  415.   getColumnProperties : function(column,columnElement,prop){},
  416.   getCellProperties : function(row,prop){}
  417.  };
  418. var permissionsTree;
  419.  
  420. function Permission(number, host, rawHost, type, capability) {
  421.   this.number = number;
  422.   this.host = host;
  423.   this.rawHost = rawHost;
  424.   this.type = type;
  425.   this.capability = capability;
  426. }
  427.  
  428. function loadPermissions() {
  429.   // load permissions into a table
  430.   var enumerator = permissionmanager.enumerator;
  431.   var count = 0;
  432.   var contentStr;
  433.   var canStr, cannotStr;
  434.   if (dialogType == cookieType) {
  435.     canStr="can";
  436.     cannotStr="cannot";
  437.   } else if (dialogType == imageType) {
  438.     canStr="canImages";
  439.     cannotStr="cannotImages";
  440.   } else {
  441.     canStr="canPopups";
  442.     cannotStr="cannotPopups";
  443.   }
  444.   while (enumerator.hasMoreElements()) {
  445.     var nextPermission = enumerator.getNext();
  446.     nextPermission = nextPermission.QueryInterface(Components.interfaces.nsIPermission);
  447.     if (nextPermission.type == dialogType) {
  448.       var host = nextPermission.host;
  449.       permissions[count] = 
  450.         new Permission(count++, host,
  451.                        (host.charAt(0)==".") ? host.substring(1,host.length) : host,
  452.                        nextPermission.type,
  453.                        cookieBundle.getString(nextPermission.capability?canStr:cannotStr));
  454.     }
  455.   }
  456.   permissionsTreeView.rowCount = permissions.length;
  457.  
  458.   // sort and display the table
  459.   permissionsTree.treeBoxObject.view = permissionsTreeView;
  460.   PermissionColumnSort('rawHost');
  461.  
  462.   // disable "remove all" button if there are no cookies/images
  463.   if (permissions.length == 0) {
  464.     document.getElementById("removeAllPermissions").setAttribute("disabled","true");
  465.   } else {
  466.     document.getElementById("removeAllPermissions").removeAttribute("disabled");
  467.   }
  468.  
  469. }
  470.  
  471. function PermissionSelected() {
  472.   var selections = GetTreeSelections(permissionsTree);
  473.   if (selections.length) {
  474.     document.getElementById("removePermission").removeAttribute("disabled");
  475.   }
  476. }
  477.  
  478. function DeletePermission() {
  479.   DeleteSelectedItemFromTree(permissionsTree, permissionsTreeView,
  480.                                  permissions, deletedPermissions,
  481.                                  "removePermission", "removeAllPermissions");
  482.   FinalizePermissionDeletions();
  483. }
  484.  
  485. function DeleteAllPermissions() {
  486.   DeleteAllFromTree(permissionsTree, permissionsTreeView,
  487.                         permissions, deletedPermissions,
  488.                         "removePermission", "removeAllPermissions");
  489.   FinalizePermissionDeletions();
  490. }
  491.  
  492. function FinalizePermissionDeletions() {
  493.   var ioService = Components.classes["@mozilla.org/network/io-service;1"]
  494.                     .getService(Components.interfaces.nsIIOService);
  495.  
  496.   for (var p=0; p<deletedPermissions.length; p++) {
  497.     if (deletedPermissions[p].type == popupType) {
  498.       // we lost the URI's original scheme, but this will do because the scheme
  499.       // is stripped later anyway.
  500.       var uri = ioService.newURI("http://"+deletedPermissions[p].host, null, null);
  501.       popupmanager.remove(uri);
  502.     } else
  503.       permissionmanager.remove(deletedPermissions[p].host, deletedPermissions[p].type);
  504.   }
  505.   deletedPermissions.length = 0;
  506. }
  507.  
  508. function HandlePermissionKeyPress(e) {
  509.   if (e.keyCode == 46) {
  510.     DeletePermission();
  511.   }
  512. }
  513.  
  514. var lastPermissionSortColumn = "";
  515. var lastPermissionSortAscending = false;
  516.  
  517. function PermissionColumnSort(column) {
  518.   lastPermissionSortAscending =
  519.     SortTree(permissionsTree, permissionsTreeView, permissions,
  520.                  column, lastPermissionSortColumn, lastPermissionSortAscending);
  521.   lastPermissionSortColumn = column;
  522. }
  523.  
  524. /*** ============ CODE FOR HELP BUTTON =================== ***/
  525.  
  526. function getSelectedTab()
  527. {
  528.   var selTab = document.getElementById('tabbox').selectedTab;
  529.   var selTabID = selTab.getAttribute('id');
  530.   if (selTabID == 'cookiesTab') {
  531.     key = "cookies_stored";
  532.   } else {
  533.     key = "cookie_sites";
  534.   }  
  535.   return key;
  536. }
  537.  
  538. function doHelpButton() {
  539.   if (dialogType == imageType) {
  540.     openHelp("image_mgr");
  541.   } else {
  542.     var uri = getSelectedTab();
  543.     openHelp(uri);
  544.   }
  545.   // XXX missing popup help
  546. }
  547.