home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / firefox-3.0.14 / chrome / browser.jar / content / browser / preferences / main.js < prev    next >
Encoding:
JavaScript  |  2008-02-12  |  16.3 KB  |  442 lines

  1. //@line 40 "/build/buildd/firefox-3.0-3.0.14+build2+nobinonly/build-tree/mozilla/browser/components/preferences/main.js"
  2.  
  3. var gMainPane = {
  4.   _pane: null,
  5.  
  6.   /**
  7.    * Initialization of this.
  8.    */
  9.   init: function ()
  10.   {
  11.     this._pane = document.getElementById("paneMain");
  12.  
  13.     // set up the "use current page" label-changing listener
  14.     this._updateUseCurrentButton();
  15.     window.addEventListener("focus", this._updateUseCurrentButton, false);
  16.   },
  17.  
  18.   // HOME PAGE
  19.  
  20.   /*
  21.    * Preferences:
  22.    *
  23.    * browser.startup.homepage
  24.    * - the user's home page, as a string; if the home page is a set of tabs,
  25.    *   this will be those URLs separated by the pipe character "|"
  26.    * browser.startup.page
  27.    * - what page(s) to show when the user starts the application, as an integer:
  28.    *
  29.    *     0: a blank page
  30.    *     1: the home page (as set by the browser.startup.homepage pref)
  31.    *     2: the last page the user visited (DEPRECATED)
  32.    *     3: windows and tabs from the last session (a.k.a. session restore)
  33.    *
  34.    *   The deprecated option is not exposed in UI; however, if the user has it
  35.    *   selected and doesn't change the UI for this preference, the deprecated
  36.    *   option is preserved.
  37.    */
  38.  
  39.   /**
  40.    * Sets the home page to the current displayed page (or frontmost tab, if the
  41.    * most recent browser window contains multiple tabs), updating preference
  42.    * window UI to reflect this.
  43.    */
  44.   setHomePageToCurrent: function ()
  45.   {
  46.     var win;
  47.     if (document.documentElement.instantApply) {
  48.       // If we're in instant-apply mode, use the most recent browser window
  49.       var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  50.                          .getService(Components.interfaces.nsIWindowMediator);
  51.       win = wm.getMostRecentWindow("navigator:browser");
  52.     }
  53.     else
  54.       win = window.opener;
  55.  
  56.     if (win) {
  57.       var homePage = document.getElementById("browser.startup.homepage");
  58.       var browser = win.document.getElementById("content");
  59.  
  60.       var newVal = browser.browsers[0].currentURI.spec;
  61.       if (browser.browsers.length > 1) {
  62.         // XXX using dangerous "|" joiner!
  63.         for (var i = 1; i < browser.browsers.length; i++)
  64.           newVal += "|" + browser.browsers[i].currentURI.spec;
  65.       }
  66.  
  67.       homePage.value = newVal;
  68.     }
  69.   },
  70.  
  71.   /**
  72.    * Displays a dialog in which the user can select a bookmark to use as home
  73.    * page.  If the user selects a bookmark, that bookmark's name is displayed in
  74.    * UI and the bookmark's address is stored to the home page preference.
  75.    */
  76.   setHomePageToBookmark: function ()
  77.   {
  78.     var rv = { urls: null, names: null };
  79.     document.documentElement.openSubDialog("chrome://browser/content/preferences/selectBookmark.xul",
  80.                                            "resizable", rv);  
  81.     if (rv.urls && rv.names) {
  82.       var homePage = document.getElementById("browser.startup.homepage");
  83.  
  84.       // XXX still using dangerous "|" joiner!
  85.       homePage.value = rv.urls.join("|");
  86.     }
  87.   },
  88.  
  89.   /**
  90.    * Switches the "Use Current Page" button between its singular and plural
  91.    * forms.
  92.    */
  93.   _updateUseCurrentButton: function () {
  94.     var useCurrent = document.getElementById("useCurrent");
  95.  
  96.     var windowIsPresent;
  97.     var win;
  98.     if (document.documentElement.instantApply) {
  99.       const Cc = Components.classes, Ci = Components.interfaces;
  100.       // If we're in instant-apply mode, use the most recent browser window
  101.       var wm = Cc["@mozilla.org/appshell/window-mediator;1"]
  102.                  .getService(Ci.nsIWindowMediator);
  103.       win = wm.getMostRecentWindow("navigator:browser");
  104.     }
  105.     else
  106.       win = window.opener;
  107.  
  108.     if (win && win.document.documentElement
  109.                   .getAttribute("windowtype") == "navigator:browser") {
  110.       windowIsPresent = true;
  111.  
  112.       var tabbrowser = win.document.getElementById("content");
  113.       if (tabbrowser.browsers.length > 1)
  114.         useCurrent.label = useCurrent.getAttribute("label2");
  115.       else
  116.         useCurrent.label = useCurrent.getAttribute("label1");
  117.     }
  118.     else {
  119.       windowIsPresent = false;
  120.       useCurrent.label = useCurrent.getAttribute("label1");
  121.     }
  122.  
  123.     // In this case, the button's disabled state is set by preferences.xml.
  124.     if (document.getElementById
  125.         ("pref.browser.homepage.disable_button.current_page").locked)
  126.       return;
  127.  
  128.     useCurrent.disabled = !windowIsPresent;
  129.   },
  130.  
  131.   /**
  132.    * Restores the default home page as the user's home page.
  133.    */
  134.   restoreDefaultHomePage: function ()
  135.   {
  136.     var homePage = document.getElementById("browser.startup.homepage");
  137.     homePage.value = homePage.defaultValue;
  138.   },
  139.  
  140.   // DOWNLOADS
  141.  
  142.   /*
  143.    * Preferences:
  144.    * 
  145.    * browser.download.showWhenStarting - bool
  146.    *   True if the Download Manager should be opened when a download is
  147.    *   started, false if it shouldn't be opened.
  148.    * browser.download.closeWhenDone - bool
  149.    *   True if the Download Manager should be closed when all downloads
  150.    *   complete, false if it should be left open.
  151.    * browser.download.useDownloadDir - bool
  152.    *   True - Save files directly to the folder configured via the
  153.    *   browser.download.folderList preference.
  154.    *   False - Always ask the user where to save a file and default to 
  155.    *   browser.download.lastDir when displaying a folder picker dialog.
  156.    * browser.download.dir - local file handle
  157.    *   A local folder the user may have selected for downloaded files to be
  158.    *   saved. Migration of other browser settings may also set this path.
  159.    *   This folder is enabled when folderList equals 2.
  160.    * browser.download.lastDir - local file handle
  161.    *   May contain the last folder path accessed when the user browsed
  162.    *   via the file save-as dialog. (see contentAreaUtils.js)
  163.    * browser.download.folderList - int
  164.    *   Indicates the location users wish to save downloaded files too.
  165.    *   It is also used to display special file labels when the default
  166.    *   download location is either the Desktop or the Downloads folder.
  167.    *   Values:
  168.    *     0 - The desktop is the default download location.
  169.    *     1 - The system's downloads folder is the default download location.
  170.    *     2 - The default download location is elsewhere as specified in
  171.    *         browser.download.dir.
  172.    * browser.download.downloadDir
  173.    *   depreciated.
  174.    * browser.download.defaultFolder
  175.    *   depreciated.
  176.    */
  177.  
  178.   /**
  179.    * Updates preferences which depend upon the value of the preference which
  180.    * determines whether the Downloads manager is opened at the start of a
  181.    * download.
  182.    */
  183.   readShowDownloadsWhenStarting: function ()
  184.   {
  185.     this.showDownloadsWhenStartingPrefChanged();
  186.  
  187.     // don't override the preference's value in UI
  188.     return undefined;
  189.   },
  190.  
  191.   /**
  192.    * Enables or disables the "close Downloads manager when downloads finished"
  193.    * preference element, consequently updating the associated UI.
  194.    */
  195.   showDownloadsWhenStartingPrefChanged: function ()
  196.   {
  197.     var showWhenStartingPref = document.getElementById("browser.download.manager.showWhenStarting");
  198.     var closeWhenDonePref = document.getElementById("browser.download.manager.closeWhenDone");
  199.     closeWhenDonePref.disabled = !showWhenStartingPref.value;
  200.   },
  201.  
  202.   /**
  203.    * Enables/disables the folder field and Browse button based on whether a
  204.    * default download directory is being used.
  205.    */
  206.   readUseDownloadDir: function ()
  207.   {
  208.     var downloadFolder = document.getElementById("downloadFolder");
  209.     var chooseFolder = document.getElementById("chooseFolder");
  210.     var preference = document.getElementById("browser.download.useDownloadDir");
  211.     downloadFolder.disabled = !preference.value;
  212.     chooseFolder.disabled = !preference.value;
  213.  
  214.     // don't override the preference's value in UI
  215.     return undefined;
  216.   },
  217.   
  218.   /**
  219.    * Displays a file picker in which the user can choose the location where
  220.    * downloads are automatically saved, updating preferences and UI in
  221.    * response to the choice, if one is made.
  222.    */
  223.   chooseFolder: function ()
  224.   {
  225.     const nsIFilePicker = Components.interfaces.nsIFilePicker;
  226.     const nsILocalFile = Components.interfaces.nsILocalFile;
  227.  
  228.     var fp = Components.classes["@mozilla.org/filepicker;1"]
  229.                        .createInstance(nsIFilePicker);
  230.     var bundlePreferences = document.getElementById("bundlePreferences");
  231.     var title = bundlePreferences.getString("chooseDownloadFolderTitle");
  232.     fp.init(window, title, nsIFilePicker.modeGetFolder);
  233.     fp.appendFilters(nsIFilePicker.filterAll);
  234.  
  235.     var folderListPref = document.getElementById("browser.download.folderList");
  236.     var currentDirPref = this._indexToFolder(folderListPref.value); // file
  237.     var defDownloads = this._indexToFolder(1); // file
  238.  
  239.     // First try to open what's currently configured
  240.     if (currentDirPref && currentDirPref.exists()) {
  241.       fp.displayDirectory = currentDirPref;
  242.     } // Try the system's download dir
  243.     else if (defDownloads && defDownloads.exists()) {
  244.       fp.displayDirectory = defDownloads;
  245.     } // Fall back to Desktop
  246.     else {
  247.       fp.displayDirectory = this._indexToFolder(0);
  248.     }
  249.  
  250.     if (fp.show() == nsIFilePicker.returnOK) {
  251.       var file = fp.file.QueryInterface(nsILocalFile);
  252.       var currentDirPref = document.getElementById("browser.download.dir");
  253.       currentDirPref.value = file;
  254.       var folderListPref = document.getElementById("browser.download.folderList");
  255.       folderListPref.value = this._folderToIndex(file);
  256.       // Note, the real prefs will not be updated yet, so dnld manager's
  257.       // userDownloadsDirectory may not return the right folder after
  258.       // this code executes. displayDownloadDirPref will be called on
  259.       // the assignment above to update the UI.
  260.     }
  261.   },
  262.  
  263.   /**
  264.    * Initializes the download folder display settings based on the user's 
  265.    * preferences.
  266.    */
  267.   displayDownloadDirPref: function ()
  268.   {
  269.     var folderListPref = document.getElementById("browser.download.folderList");
  270.     var bundlePreferences = document.getElementById("bundlePreferences");
  271.     var downloadFolder = document.getElementById("downloadFolder");
  272.     var currentDirPref = document.getElementById("browser.download.dir");
  273.  
  274.     // The user's download folder is based on the preferences listed above.
  275.     // However, if the system does not support a download folder, the
  276.     // actual path returned will be the system's desktop or home folder.
  277.     // If this is the case, skip off displaying the Download label and
  278.     // display Desktop, even though folderList might be 1.
  279.     var fileLocator = Components.classes["@mozilla.org/file/directory_service;1"]
  280.                                 .getService(Components.interfaces.nsIProperties);
  281.     var desk = fileLocator.get("Desk", Components.interfaces.nsILocalFile);
  282.     var dnldMgr = Components.classes["@mozilla.org/download-manager;1"]
  283.                             .getService(Components.interfaces.nsIDownloadManager);
  284.     var supportDownloadLabel = !dnldMgr.defaultDownloadsDirectory.equals(desk);
  285.  
  286.     // Used in defining the correct path to the folder icon.
  287.     var ios = Components.classes["@mozilla.org/network/io-service;1"]
  288.                         .getService(Components.interfaces.nsIIOService);
  289.     var fph = ios.getProtocolHandler("file")
  290.                  .QueryInterface(Components.interfaces.nsIFileProtocolHandler);
  291.     var iconUrlSpec;
  292.       
  293.     // Display a 'pretty' label or the path in the UI.
  294.     if (folderListPref.value == 2) {
  295.       // Custom path selected and is configured
  296.       downloadFolder.label = this._getDisplayNameOfFile(currentDirPref.value);
  297.       iconUrlSpec = fph.getURLSpecFromFile(currentDirPref.value);
  298.     } else if (folderListPref.value == 1 && supportDownloadLabel) {
  299.       // 'Downloads'
  300.       // In 1.5, this pointed to a folder we created called 'My Downloads'
  301.       // and was available as an option in the 1.5 drop down. On XP this
  302.       // was in My Documents, on OSX it was in User Docs. In 2.0, we did
  303.       // away with the drop down option, although the special label was
  304.       // still supported for the folder if it existed. Because it was
  305.       // not exposed it was rarely used.
  306.       // With 3.0, a new desktop folder - 'Downloads' was introduced for
  307.       // platforms and versions that don't support a default system downloads
  308.       // folder. See nsDownloadManager for details. 
  309.       downloadFolder.label = bundlePreferences.getString("downloadsFolderName");
  310.       iconUrlSpec = fph.getURLSpecFromFile(this._indexToFolder(1));
  311.     } else {
  312.       // 'Desktop'
  313.       downloadFolder.label = bundlePreferences.getString("desktopFolderName");
  314.       iconUrlSpec = fph.getURLSpecFromFile(desk);
  315.     }
  316.     downloadFolder.image = "moz-icon://" + iconUrlSpec + "?size=16";
  317.     
  318.     // don't override the preference's value in UI
  319.     return undefined;
  320.   },
  321.  
  322.   /**
  323.    * Returns the textual path of a folder in readable form.
  324.    */
  325.   _getDisplayNameOfFile: function (aFolder)
  326.   {
  327.     // TODO: would like to add support for 'Downloads on Macintosh HD'
  328.     //       for OS X users.
  329.     return aFolder ? aFolder.path : "";
  330.   },
  331.  
  332.   /**
  333.    * Returns the Downloads folder.  If aFolder is "Desktop", then the Downloads
  334.    * folder returned is the desktop folder; otherwise, it is a folder whose name
  335.    * indicates that it is a download folder and whose path is as determined by
  336.    * the XPCOM directory service via the download manager's attribute 
  337.    * defaultDownloadsDirectory.
  338.    *
  339.    * @throws if aFolder is not "Desktop" or "Downloads"
  340.    */
  341.   _getDownloadsFolder: function (aFolder)
  342.   {
  343.     switch(aFolder)
  344.     {
  345.       case "Desktop":
  346.         var fileLoc = Components.classes["@mozilla.org/file/directory_service;1"]
  347.                                     .getService(Components.interfaces.nsIProperties);
  348.         return fileLoc.get("Desk", Components.interfaces.nsILocalFile);
  349.       break;
  350.       case "Downloads":
  351.         var dnldMgr = Components.classes["@mozilla.org/download-manager;1"]
  352.                                 .getService(Components.interfaces.nsIDownloadManager);
  353.         return dnldMgr.defaultDownloadsDirectory;
  354.       break;
  355.     }
  356.     throw "ASSERTION FAILED: folder type should be 'Desktop' or 'Downloads'";
  357.   },
  358.  
  359.   /**
  360.    * Determines the type of the given folder.
  361.    *
  362.    * @param   aFolder
  363.    *          the folder whose type is to be determined
  364.    * @returns integer
  365.    *          0 if aFolder is the Desktop or is unspecified,
  366.    *          1 if aFolder is the Downloads folder,
  367.    *          2 otherwise
  368.    */
  369.   _folderToIndex: function (aFolder)
  370.   {
  371.     if (!aFolder || aFolder.equals(this._getDownloadsFolder("Desktop")))
  372.       return 0;
  373.     else if (aFolder.equals(this._getDownloadsFolder("Downloads")))
  374.       return 1;
  375.     return 2;
  376.   },
  377.  
  378.   /**
  379.    * Converts an integer into the corresponding folder.
  380.    *
  381.    * @param   aIndex
  382.    *          an integer
  383.    * @returns the Desktop folder if aIndex == 0,
  384.    *          the Downloads folder if aIndex == 1,
  385.    *          the folder stored in browser.download.dir
  386.    */
  387.   _indexToFolder: function (aIndex)
  388.   {
  389.     switch (aIndex) {
  390.       case 0:
  391.         return this._getDownloadsFolder("Desktop");
  392.       case 1:
  393.         return this._getDownloadsFolder("Downloads");
  394.     }
  395.     var currentDirPref = document.getElementById("browser.download.dir");
  396.     return currentDirPref.value;
  397.   },
  398.  
  399.   /**
  400.    * Returns the value for the browser.download.folderList preference.
  401.    */
  402.   getFolderListPref: function ()
  403.   {
  404.     var folderListPref = document.getElementById("browser.download.folderList");
  405.     switch(folderListPref.value) {
  406.       case 0: // Desktop
  407.       case 1: // Downloads
  408.         return folderListPref.value;
  409.       break;
  410.       case 2: // Custom
  411.         var currentDirPref = document.getElementById("browser.download.dir");
  412.         if (currentDirPref.value) {
  413.           // Resolve to a known location if possible. We are writing out
  414.           // to prefs on this call, so now would be a good time to do it.
  415.           return this._folderToIndex(currentDirPref.value);
  416.         }
  417.         return 0;
  418.       break;
  419.     }
  420.   },
  421.  
  422.   /**
  423.    * Displays the Add-ons Manager.
  424.    */
  425.   showAddonsMgr: function ()
  426.   {
  427.     const EMTYPE = "Extension:Manager";
  428.     var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  429.                        .getService(Components.interfaces.nsIWindowMediator);
  430.     var theEM = wm.getMostRecentWindow(EMTYPE);
  431.     if (theEM) {
  432.       theEM.focus();
  433.       theEM.showView("extensions");
  434.       return;
  435.     }
  436.  
  437.     const EMURL = "chrome://mozapps/content/extensions/extensions.xul";
  438.     const EMFEATURES = "chrome,menubar,extra-chrome,toolbar,dialog=no,resizable";
  439.     window.openDialog(EMURL, "", EMFEATURES, "extensions");
  440.   }
  441. };
  442.