[tor-commits] [tor-messenger-build/master] Bug 16478: Update certificate pane in preferences window

sukhbir at torproject.org sukhbir at torproject.org
Fri Nov 6 21:55:21 UTC 2015


commit cb67f64b596101638e43478f54df6aac16b0d5fb
Author: Sukhbir Singh <sukhbir at torproject.org>
Date:   Fri Nov 6 16:55:13 2015 -0500

    Bug 16478: Update certificate pane in preferences window
---
 .../instantbird/certificate-settings-xul.patch     | 1355 ++++++++++++++++++++
 projects/instantbird/config                        |    1 +
 2 files changed, 1356 insertions(+)

diff --git a/projects/instantbird/certificate-settings-xul.patch b/projects/instantbird/certificate-settings-xul.patch
new file mode 100644
index 0000000..7650cb8
--- /dev/null
+++ b/projects/instantbird/certificate-settings-xul.patch
@@ -0,0 +1,1355 @@
+
+# HG changeset patch
+# User Patrick Cloke <clokep at gmail.com>
+# Date 1437737959 -7200
+# Node ID 0b348fa4d3448a8c341ba35f83ff51b8d00f6742
+# Parent  6962356b69b1fa7c71243cc934a8c67d9144ae7e
+Bug 955738 - Port 'Bug 733632 - Remove TLS version UI (Options > Advanced > Encryption > Protocols)'. r=florian
+
+diff --git a/im/content/preferences/advanced.js b/im/content/preferences/advanced.js
+--- a/im/content/preferences/advanced.js
++++ b/im/content/preferences/advanced.js
+@@ -1,15 +1,20 @@
+-# -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
++# -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ # This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
+ // Load DownloadUtils module for convertByteUnits
+ Components.utils.import("resource://gre/modules/DownloadUtils.jsm");
++Components.utils.import("resource://gre/modules/ctypes.jsm");
++Components.utils.import("resource://gre/modules/Services.jsm");
++Components.utils.import("resource://gre/modules/LoadContextInfo.jsm");
++Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
++Components.utils.import("resource://gre/modules/BrowserUtils.jsm");
+ 
+ var gAdvancedPane = {
+   _inited: false,
+ 
+   /**
+    * Brings the appropriate tab to the front and initializes various bits of UI.
+    */
+   init: function ()
+@@ -23,35 +28,44 @@ var gAdvancedPane = {
+     } else {
+       var preference = document.getElementById("browser.preferences.advanced.selectedTabIndex");
+       if (preference.value !== null)
+         advancedPrefs.selectedIndex = preference.value;
+     }
+ 
+     this.updateConnectionGroupbox();
+ #ifdef MOZ_UPDATER
+-    this.updateAppUpdateItems();
+-    this.updateAutoItems();
+-    this.updateModeItems();
++    let onUnload = function () {
++      window.removeEventListener("unload", onUnload, false);
++      Services.prefs.removeObserver("app.update.", this);
++    }.bind(this);
++    window.addEventListener("unload", onUnload, false);
++    Services.prefs.addObserver("app.update.", this, false);
++    this.updateReadPrefs();
+ #endif
++
++    let bundlePrefs = document.getElementById("bundlePreferences");
++
++    // Notify observers that the UI is now ready
++    Services.obs.notifyObservers(window, "advanced-pane-loaded", null);
+   },
+ 
+   /**
+    * Stores the identity of the current tab in preferences so that the selected
+    * tab can be persisted between openings of the preferences window.
+    */
+   tabSelectionChanged: function ()
+   {
+     if (!this._inited)
+       return;
+     var advancedPrefs = document.getElementById("advancedPrefs");
+     var preference = document.getElementById("browser.preferences.advanced.selectedTabIndex");
+     preference.valueFromPreferences = advancedPrefs.selectedIndex;
+   },
+-  
++
+   // GENERAL TAB
+ 
+   /*
+    * Preferences:
+    *
+    * accessibility.browsewithcaret
+    * - true enables keyboard navigation and selection within web pages using a
+    *   visible caret, false uses normal keyboard navigation with no caret
+@@ -110,31 +124,68 @@ var gAdvancedPane = {
+     var window = Services.wm.getMostRecentWindow("Browser:SearchManager");
+     if (window)
+       window.focus();
+     else {
+       openDialog("chrome://instantbird/content/engineManager.xul",
+                  "_blank", "chrome,dialog,modal,centerscreen");
+     }
+   },
+-  
++
+   showConfigEdit: function()
+   {
+     document.documentElement.openWindow("Preferences:ConfigManager",
+                                         "chrome://global/content/config.xul",
+                                         "", null);
+   },
+ 
++  /**
++   * security.OCSP.enabled is an integer value for legacy reasons.
++   * A value of 1 means OCSP is enabled. Any other value means it is disabled.
++   */
++  readEnableOCSP: function ()
++  {
++    var preference = document.getElementById("security.OCSP.enabled");
++    // This is the case if the preference is the default value.
++    if (preference.value === undefined) {
++      return true;
++    }
++    return preference.value == 1;
++  },
++
++  /**
++   * See documentation for readEnableOCSP.
++   */
++  writeEnableOCSP: function ()
++  {
++    var checkbox = document.getElementById("enableOCSP");
++    return checkbox.checked ? 1 : 0;
++  },
++
++  /**
++   * When the user toggles the layers.acceleration.disabled pref,
++   * sync its new value to the gfx.direct2d.disabled pref too.
++   */
++  updateHardwareAcceleration: function()
++  {
++#ifdef XP_WIN
++    var fromPref = document.getElementById("layers.acceleration.disabled");
++    var toPref = document.getElementById("gfx.direct2d.disabled");
++    toPref.value = fromPref.value;
++#endif
++  },
++
+   // NETWORK TAB
+ 
+   /*
+    * Preferences:
+    *
+    * browser.cache.disk.capacity
+    * - the size of the browser cache in KB
++   * - Only used if browser.cache.disk.smart_size.enabled is disabled
+    */
+ 
+   /**
+    * Displays a dialog in which proxy settings may be changed.
+    */
+   showConnections: function ()
+   {
+     document.documentElement.openSubDialog("chrome://instantbird/content/preferences/connection.xul",
+@@ -185,92 +236,137 @@ var gAdvancedPane = {
+    * app.update.mode
+    * - an integer:
+    *     0    do not warn if an update will disable extensions or themes
+    *     1    warn if an update will disable extensions or themes
+    *     2    warn if an update will disable extensions or themes *or* if the
+    *          update is a major update
+    */
+ 
++#ifdef MOZ_UPDATER
+   /**
+-   * Enables and disables various UI preferences as necessary to reflect locked,
+-   * disabled, and checked/unchecked states.
++   * Selects the item of the radiogroup, and sets the warnIncompatible checkbox
++   * based on the pref values and locked states.
+    *
+    * UI state matrix for update preference conditions
+-   * 
+-   * UI Components:                                     Preferences
+-   * 1 = Firefox checkbox                               i   = app.update.enabled
+-   * 2 = When updates for Firefox are found label       ii  = app.update.auto
+-   * 3 = Automatic Radiogroup (Ask vs. Automatically)   iii = app.update.mode
+-   * 4 = Warn before disabling extensions checkbox
+-   * 
+-   * States:
+-   * Element     p   val     locked    Disabled 
+-   * 1           i   t/f     f         false
+-   *             i   t/f     t         true
+-   *             ii  t/f     t/f       false
+-   *             iii 0/1/2   t/f       false
+-   * 2,3         i   t       t/f       false
+-   *             i   f       t/f       true
+-   *             ii  t/f     f         false
+-   *             ii  t/f     t         true
+-   *             iii 0/1/2   t/f       false
+-   * 4           i   t       t/f       false
+-   *             i   f       t/f       true
+-   *             ii  t       t/f       false
+-   *             ii  f       t/f       true
+-   *             iii 0/1/2   f         false
+-   *             iii 0/1/2   t         true   
+-   * 
++   *
++   * UI Components:                              Preferences
++   * Radiogroup                                  i   = app.update.enabled
++   * Warn before disabling extensions checkbox   ii  = app.update.auto
++   *                                             iii = app.update.mode
++   *
++   * Disabled states:
++   * Element           pref  value  locked  disabled
++   * radiogroup        i     t/f    f       false
++   *                   i     t/f    *t*     *true*
++   *                   ii    t/f    f       false
++   *                   ii    t/f    *t*     *true*
++   *                   iii   0/1/2  t/f     false
++   * warnIncompatible  i     t      f       false
++   *                   i     t      *t*     *true*
++   *                   i     *f*    t/f     *true*
++   *                   ii    t      f       false
++   *                   ii    t      *t*     *true*
++   *                   ii    *f*    t/f     *true*
++   *                   iii   0/1/2  f       false
++   *                   iii   0/1/2  *t*     *true*
+    */
+-#ifdef MOZ_UPDATER
+-  updateAppUpdateItems: function () 
++  updateReadPrefs: function ()
+   {
+-    var aus = 
+-        Components.classes["@mozilla.org/updates/update-service;1"].
+-        getService(Components.interfaces.nsIApplicationUpdateService);
++    var enabledPref = document.getElementById("app.update.enabled");
++    var autoPref = document.getElementById("app.update.auto");
++    var radiogroup = document.getElementById("updateRadioGroup");
+ 
+-    var enabledPref = document.getElementById("app.update.enabled");
+-    var enableAppUpdate = document.getElementById("enableAppUpdate");
++    if (!enabledPref.value)   // Don't care for autoPref.value in this case.
++      radiogroup.value="manual";    // 3. Never check for updates.
++    else if (autoPref.value)  // enabledPref.value && autoPref.value
++      radiogroup.value="auto";      // 1. Automatically install updates for Desktop only
++    else                      // enabledPref.value && !autoPref.value
++      radiogroup.value="checkOnly"; // 2. Check, but let me choose
+ 
+-    enableAppUpdate.disabled = !aus.canCheckForUpdates || enabledPref.locked;
++    var canCheck = Components.classes["@mozilla.org/updates/update-service;1"].
++                     getService(Components.interfaces.nsIApplicationUpdateService).
++                     canCheckForUpdates;
++    // canCheck is false if the enabledPref is false and locked,
++    // or the binary platform or OS version is not known.
++    // A locked pref is sufficient to disable the radiogroup.
++    radiogroup.disabled = !canCheck || enabledPref.locked || autoPref.locked;
++
++    var modePref = document.getElementById("app.update.mode");
++    var warnIncompatible = document.getElementById("warnIncompatible");
++    // the warnIncompatible checkbox value is set by readAddonWarn
++    warnIncompatible.disabled = radiogroup.disabled || modePref.locked ||
++                                !enabledPref.value || !autoPref.value;
++
++#ifdef MOZ_MAINTENANCE_SERVICE
++    // Check to see if the maintenance service is installed.
++    // If it is don't show the preference at all.
++    var installed;
++    try {
++      var wrk = Components.classes["@mozilla.org/windows-registry-key;1"]
++                .createInstance(Components.interfaces.nsIWindowsRegKey);
++      wrk.open(wrk.ROOT_KEY_LOCAL_MACHINE,
++               "SOFTWARE\\Mozilla\\MaintenanceService",
++               wrk.ACCESS_READ | wrk.WOW64_64);
++      installed = wrk.readIntValue("Installed");
++      wrk.close();
++    } catch(e) {
++    }
++    if (installed != 1) {
++      document.getElementById("useService").hidden = true;
++    }
++    try {
++      const DRIVE_FIXED = 3;
++      const LPCWSTR = ctypes.char16_t.ptr;
++      const UINT = ctypes.uint32_t;
++      let kernel32 = ctypes.open("kernel32");
++      let GetDriveType = kernel32.declare("GetDriveTypeW", ctypes.default_abi, UINT, LPCWSTR);
++      var UpdatesDir = Components.classes["@mozilla.org/updates/update-service;1"].
++                       getService(Components.interfaces.nsIApplicationUpdateService);
++      let rootPath = UpdatesDir.getUpdatesDirectory();
++      while (rootPath.parent != null) {
++        rootPath = rootPath.parent;
++      }
++      if (GetDriveType(rootPath.path) != DRIVE_FIXED) {
++        document.getElementById("useService").hidden = true;
++      }
++      kernel32.close();
++    } catch(e) {
++    }
++#endif
+   },
+ 
+   /**
+-   * Enables/disables UI for "when updates are found" based on the values,
+-   * and "locked" states of associated preferences.
++   * Sets the pref values based on the selected item of the radiogroup,
++   * and sets the disabled state of the warnIncompatible checkbox accordingly.
+    */
+-  updateAutoItems: function () 
+-  {
+-    var enabledPref = document.getElementById("app.update.enabled");
+-    var autoPref = document.getElementById("app.update.auto");
+-    
+-    var updateModeLabel = document.getElementById("updateModeLabel");
+-    var updateMode = document.getElementById("updateMode");
+-    
+-    var disable = enabledPref.locked || !enabledPref.value ||
+-                  autoPref.locked;
+-    updateModeLabel.disabled = updateMode.disabled = disable;
+-  },
+-
+-  /**
+-   * Enables/disables the "warn if incompatible extensions/themes exist" UI
+-   * based on the values and "locked" states of various preferences.
+-   */
+-  updateModeItems: function () 
++  updateWritePrefs: function ()
+   {
+     var enabledPref = document.getElementById("app.update.enabled");
+     var autoPref = document.getElementById("app.update.auto");
+     var modePref = document.getElementById("app.update.mode");
+-    
++    var radiogroup = document.getElementById("updateRadioGroup");
++    switch (radiogroup.value) {
++      case "auto":      // 1. Automatically install updates for Desktop only
++        enabledPref.value = true;
++        autoPref.value = true;
++        break;
++      case "checkOnly": // 2. Check, but let me choose
++        enabledPref.value = true;
++        autoPref.value = false;
++        break;
++      case "manual":    // 3. Never check for updates.
++        enabledPref.value = false;
++        autoPref.value = false;
++    }
++
+     var warnIncompatible = document.getElementById("warnIncompatible");
+-    
+-    var disable = enabledPref.locked || !enabledPref.value || autoPref.locked ||
+-                  !autoPref.value || modePref.locked;
+-    warnIncompatible.disabled = disable;
++    warnIncompatible.disabled = enabledPref.locked || !enabledPref.value ||
++                                autoPref.locked || !autoPref.value ||
++                                modePref.locked;
+   },
+ 
+   /**
+    * Stores the value of the app.update.mode preference, which is a tristate
+    * integer preference.  We store the value here so that we can properly
+    * restore the preference value if the UI reflecting the preference value
+    * is in a state which can represent either of two integer values (as
+    * opposed to only one possible value in the other UI state).
+@@ -279,28 +375,28 @@ var gAdvancedPane = {
+ 
+   /**
+    * Reads the app.update.mode preference and converts its value into a
+    * true/false value for use in determining whether the "Warn me if this will
+    * disable extensions or themes" checkbox is checked.  We also save the value
+    * of the preference so that the preference value can be properly restored if
+    * the user's preferences cannot adequately be expressed by a single checkbox.
+    *
+-   * app.update.modee         Checkbox State    Meaning
++   * app.update.mode          Checkbox State    Meaning
+    * 0                        Unchecked         Do not warn
+    * 1                        Checked           Warn if there are incompatibilities
+    * 2                        Checked           Warn if there are incompatibilities,
+    *                                            or the update is major.
+    */
+   readAddonWarn: function ()
+   {
+     var preference = document.getElementById("app.update.mode");
+-    var doNotWarn = preference.value != 0;
+-    gAdvancedPane._modePreference = doNotWarn ? preference.value : 1;
+-    return doNotWarn;
++    var warn = preference.value != 0;
++    gAdvancedPane._modePreference = warn ? preference.value : 1;
++    return warn;
+   },
+ 
+   /**
+    * Converts the state of the "Warn me if this will disable extensions or
+    * themes" checkbox into the integer preference which represents it,
+    * returning that value.
+    */
+   writeAddonWarn: function ()
+@@ -315,37 +411,21 @@ var gAdvancedPane = {
+   showUpdates: function ()
+   {
+     var prompter = Components.classes["@mozilla.org/updates/update-prompt;1"]
+                              .createInstance(Components.interfaces.nsIUpdatePrompt);
+     prompter.showUpdateHistory(window);
+   },
+ #endif
+ 
+-  /**
+-   * The Extensions checkbox and button are disabled only if the enable Addon
+-   * update preference is locked. 
+-   */
+-  updateAddonUpdateUI: function ()
+-  {
+-    var enabledPref = document.getElementById("extensions.update.enabled");
+-    var enableAddonUpdate = document.getElementById("enableAddonUpdate");
+-
+-    enableAddonUpdate.disabled = enabledPref.locked;
+-  },  
+-  
+   // ENCRYPTION TAB
+ 
+   /*
+    * Preferences:
+    *
+-   * security.enable_ssl3
+-   * - true if SSL 3 encryption is enabled, false otherwise
+-   * security.enable_tls
+-   * - true if TLS encryption is enabled, false otherwise
+    * security.default_personal_cert
+    * - a string:
+    *     "Select Automatically"   select a certificate automatically when a site
+    *                              requests one
+    *     "Ask Every Time"         present a dialog to the user so he can select
+    *                              the certificate to use on a site which
+    *                              requests one
+    */
+@@ -356,71 +436,27 @@ var gAdvancedPane = {
+   showCertificates: function ()
+   {
+     document.documentElement.openWindow("mozilla:certmanager",
+                                         "chrome://pippki/content/certManager.xul",
+                                         "", null);
+   },
+ 
+   /**
+-   * Displays a dialog in which OCSP preferences can be configured.
+-   */
+-  showOCSP: function ()
+-  {
+-    document.documentElement.openSubDialog("chrome://mozapps/content/preferences/ocsp.xul",
+-                                           "", null);
+-  },
+-
+-  /**
+    * Displays a dialog from which the user can manage his security devices.
+    */
+   showSecurityDevices: function ()
+   {
+     document.documentElement.openWindow("mozilla:devicemanager",
+                                         "chrome://pippki/content/device_manager.xul",
+                                         "", null);
+-  }
+-#ifdef HAVE_SHELL_SERVICE
+-  ,
++  },
+ 
+-  // SYSTEM DEFAULTS
+-
+-  /*
+-   * Preferences:
+-   *
+-   * browser.shell.checkDefault
+-   * - true if a default-browser check (and prompt to make it so if necessary)
+-   *   occurs at startup, false otherwise
+-   */
+-
+-  /**
+-   * Checks whether the browser is currently registered with the operating
+-   * system as the default browser.  If the browser is not currently the
+-   * default browser, the user is given the option of making it the default;
+-   * otherwise, the user is informed that this browser already is the browser.
+-   */
+-  checkNow: function ()
+-  {
+-    var shellSvc = Components.classes["@mozilla.org/browser/shell-service;1"]
+-                             .getService(Components.interfaces.nsIShellService);
+-    var brandBundle = document.getElementById("bundleBrand");
+-    var shellBundle = document.getElementById("bundleShell");
+-    var brandShortName = brandBundle.getString("brandShortName");
+-    var promptTitle = shellBundle.getString("setDefaultBrowserTitle");
+-    var promptMessage;
+-    var psvc = Services.prompt;
+-    if (!shellSvc.isDefaultBrowser(false)) {
+-      promptMessage = shellBundle.getFormattedString("setDefaultBrowserMessage", 
+-                                                     [brandShortName]);
+-      var rv = psvc.confirmEx(window, promptTitle, promptMessage, 
+-                              psvc.STD_YES_NO_BUTTONS,
+-                              null, null, null, null, { });
+-      if (rv == 0)
+-        shellSvc.setDefaultBrowser(true, false);
++#ifdef MOZ_UPDATER
++  observe: function (aSubject, aTopic, aData) {
++    switch(aTopic) {
++      case "nsPref:changed":
++        this.updateReadPrefs();
++        break;
+     }
+-    else {
+-      promptMessage = shellBundle.getFormattedString("alreadyDefaultBrowser",
+-                                                     [brandShortName]);
+-      psvc.alert(window, promptTitle, promptMessage);
+-    }
+-  }
++  },
+ #endif
+ };
+diff --git a/im/content/preferences/advanced.xul b/im/content/preferences/advanced.xul
+--- a/im/content/preferences/advanced.xul
++++ b/im/content/preferences/advanced.xul
+@@ -24,81 +24,85 @@
+                   name="browser.preferences.advanced.selectedTabIndex"
+                   type="int"/>
+ 
+       <!--XXX button prefs -->
+ 
+       <!-- General tab -->
+       <preference id="accessibility.browsewithcaret"   name="accessibility.browsewithcaret"   type="bool"/>
+       <preference id="accessibility.typeaheadfind"     name="accessibility.typeaheadfind"     type="bool"/>
++      <preference id="accessibility.blockautorefresh"  name="accessibility.blockautorefresh"  type="bool"/>
+ 
+       <preference id="general.autoScroll"              name="general.autoScroll"              type="bool"/>
+       <preference id="general.smoothScroll"            name="general.smoothScroll"            type="bool"/>
++      <preference id="layers.acceleration.disabled"    name="layers.acceleration.disabled"    type="bool"   inverted="true"
++                  onchange="gAdvancedPane.updateHardwareAcceleration()"/>
++#ifdef XP_WIN
++      <preference id="gfx.direct2d.disabled"           name="gfx.direct2d.disabled"           type="bool"   inverted="true"/>
++#endif
+       <preference id="layout.spellcheckDefault"        name="layout.spellcheckDefault"        type="int"/>
+ 
+-#ifdef HAVE_SHELL_SERVICE
+-      <preference id="browser.shell.checkDefaultBrowser"
+-                  name="browser.shell.checkDefaultBrowser"
++      <!-- Network tab -->
++      <preference id="browser.cache.disk.capacity"     name="browser.cache.disk.capacity"     type="int"/>
++      <preference id="browser.offline-apps.notify"     name="browser.offline-apps.notify"     type="bool"/>
++
++      <preference id="browser.cache.disk.smart_size.enabled"
++                  name="browser.cache.disk.smart_size.enabled"
++                  inverted="true"
+                   type="bool"/>
+ 
+-      <preference id="pref.general.disable_button.default_browser"
+-                  name="pref.general.disable_button.default_browser"
+-                  type="bool"/>
+-#endif
+-
+-      <!-- Update tab -->
++     <!-- Update tab -->
+ #ifdef MOZ_UPDATER
+-      <preference id="app.update.enabled"              name="app.update.enabled"              type="bool"
+-                  onchange="gAdvancedPane.updateAppUpdateItems();
+-                            gAdvancedPane.updateAutoItems();
+-                            gAdvancedPane.updateModeItems();"/>
+-      <preference id="app.update.auto"                 name="app.update.auto"                 type="bool"
+-                  onchange="gAdvancedPane.updateAutoItems();
+-                            gAdvancedPane.updateModeItems();"/>
+-      <preference id="app.update.mode"                 name="app.update.mode"                 type="int"
+-                  onchange="gAdvancedPane.updateModeItems();"/>
++      <preference id="app.update.enabled"              name="app.update.enabled"              type="bool"/>
++      <preference id="app.update.auto"                 name="app.update.auto"                 type="bool"/>
++      <preference id="app.update.mode"                 name="app.update.mode"                 type="int"/>
+ 
+       <preference id="app.update.disable_button.showUpdateHistory"
+                   name="app.update.disable_button.showUpdateHistory"
+                   type="bool"/>
++
++#ifdef MOZ_MAINTENANCE_SERVICE
++      <preference id="app.update.service.enabled"
++                  name="app.update.service.enabled"
++                  type="bool"/>
++#endif
+ #endif
+ 
+-      <preference id="extensions.update.enabled"       name="extensions.update.enabled"       type="bool"
+-                  onchange="gAdvancedPane.updateAddonUpdateUI();"/>
+       <preference id="browser.search.update"           name="browser.search.update"           type="bool"/>
+ 
+-      <!-- Encryption tab -->
+-      <preference id="security.enable_ssl3"            name="security.enable_ssl3"            type="bool"/>
+-      <preference id="security.enable_tls"             name="security.enable_tls"             type="bool"/>
+-
++      <!-- Certificates tab -->
+       <preference id="security.default_personal_cert"  name="security.default_personal_cert"  type="string"/>
+ 
+       <preference id="security.disable_button.openCertManager"
+                   name="security.disable_button.openCertManager"
+                   type="bool"/>
+       <preference id="security.disable_button.openDeviceManager"
+                   name="security.disable_button.openDeviceManager"
+                   type="bool"/>
++      <preference id="security.OCSP.enabled"
++                  name="security.OCSP.enabled"
++                  type="int"/>
+     </preferences>
+-    
++
+ #ifdef HAVE_SHELL_SERVICE
+     <stringbundle id="bundleShell" src="chrome://browser/locale/shellservice.properties"/>
+     <stringbundle id="bundleBrand" src="chrome://branding/locale/brand.properties"/>
+ #endif
++    <stringbundle id="bundlePreferences" src="chrome://instantbird/locale/preferences/preferences.properties"/>
+ 
+     <script type="application/javascript" src="chrome://instantbird/content/preferences/advanced.js"/>
+ 
+     <tabbox id="advancedPrefs" flex="1"
+             onselect="gAdvancedPane.tabSelectionChanged();">
+ 
+       <tabs id="tabsElement">
+         <tab id="generalTab" label="&generalTab.label;"/>
+         <tab id="networkTab" label="&networkTab.label;"/>
+         <tab id="updateTab" label="&updateTab.label;"/>
+-        <tab id="encryptionTab" label="&encryptionTab.label;"/>
++        <tab id="encryptionTab" label="&certificateTab.label;"/>
+       </tabs>
+ 
+       <tabpanels flex="1">
+ 
+         <!-- General -->
+         <tabpanel id="generalPanel" orient="vertical">
+ 
+           <!-- Accessibility -->
+@@ -122,16 +126,20 @@
+             <checkbox id="useAutoScroll"
+                       label="&useAutoScroll.label;"
+                       accesskey="&useAutoScroll.accesskey;"
+                       preference="general.autoScroll"/>
+             <checkbox id="useSmoothScrolling"
+                       label="&useSmoothScrolling.label;"
+                       accesskey="&useSmoothScrolling.accesskey;"
+                       preference="general.smoothScroll"/>
++            <checkbox id="allowHWAccel"
++                      label="&allowHWAccel.label;"
++                      accesskey="&allowHWAccel.accesskey;"
++                      preference="layers.acceleration.disabled"/>
+             <checkbox id="checkSpelling"
+                       label="&checkSpelling.label;"
+                       accesskey="&checkSpelling.accesskey;"
+                       onsyncfrompreference="return gAdvancedPane.readCheckSpelling();"
+                       onsynctopreference="return gAdvancedPane.writeCheckSpelling();"
+                       preference="layout.spellcheckDefault"/>
+           </groupbox>
+ 
+@@ -141,33 +149,16 @@
+ 
+             <description control="manageSearchEnginesButton"
+                          flex="1">&searchEnginesDesc.label;</description>
+             <button id="manageSearchEnginesButton" label="&searchEngines.label;"
+                     accesskey="&searchEngines.accesskey;"
+                     oncommand="gAdvancedPane.showSearchEngineManager();"/>
+           </groupbox>
+ 
+-#ifdef HAVE_SHELL_SERVICE
+-          <!-- System Defaults -->
+-          <groupbox id="systemDefaultsGroup" orient="horizontal">
+-            <caption label="&systemDefaults.label;"/>
+-
+-            <hbox id="checkDefaultBox" align="center" flex="1">      
+-              <checkbox id="alwaysCheckDefault" preference="browser.shell.checkDefaultBrowser"
+-                        label="&alwaysCheckDefault.label;" accesskey="&alwaysCheckDefault.accesskey;"
+-                        flex="1"/>
+-              <button id="checkDefaultButton"
+-                      label="&checkNow.label;" accesskey="&checkNow.accesskey;"
+-                      oncommand="gAdvancedPane.checkNow()"
+-                      preference="pref.general.disable_button.default_browser"/>
+-            </hbox>
+-          </groupbox>
+-#endif
+-
+           <!-- Advanced Configuration -->
+           <groupbox>
+             <caption label="&configEditDesc.label;"/>
+             <hbox pack="end">
+               <button id="configEditor" label="&configEdit.label;"
+                       accesskey="&configEdit.accesskey;"
+                       oncommand="gAdvancedPane.showConfigEdit();"/>
+             </hbox>
+@@ -201,134 +192,113 @@
+              <hbox align="center" id="mozillaConnectionBox">
+                <description id="mozConnLabelWithoutLibpurple" flex="1" control="connectionSettings">&connectionDesc.label;</description>
+                <description id="mozConnLabelWithLibpurple" flex="1" control="connectionSettings">&connectionOtherDesc.label;</description>
+                <button id="connectionSettings" icon="network" label="&connectionSettings.label;"
+                        accesskey="&connectionSettings2.accesskey;"
+                        oncommand="gAdvancedPane.showConnections();"/>
+              </hbox>
+            </groupbox>
++
++           <!-- Porting Note:
++              - The Cache and Offline apps section (+ related strings and
++              - JavaScript methods) have been removed. -->
+         </tabpanel>
+ 
+         <!-- Update -->
+-        <tabpanel id="updatePanel" orient="vertical" align="start">
+-          <label control="autoUpdateGroup">&autoCheck.label;</label>
+-          <vbox class="indent" id="autoUpdateGroup" role="group">
++        <tabpanel id="updatePanel" orient="vertical">
+ #ifdef MOZ_UPDATER
+-            <checkbox id="enableAppUpdate"
+-                      label="&enableAppUpdate.label;"
+-                      accesskey="&enableAppUpdate.accesskey;"
+-                      preference="app.update.enabled"/>
++          <groupbox id="updateApp">
++            <caption label="&updateApp.label;"/>
++            <radiogroup id="updateRadioGroup"
++                        oncommand="gAdvancedPane.updateWritePrefs();">
++              <radio id="autoDesktop"
++                     value="auto"
++                     label="&updateAuto1.label;"
++                     accesskey="&updateAuto1.accesskey;"/>
++              <hbox class="indent">
++                <checkbox id="warnIncompatible"
++                          label="&updateAutoAddonWarn.label;"
++                          accesskey="&updateAutoAddonWarn.accesskey;"
++                          preference="app.update.mode"
++                          onsyncfrompreference="return gAdvancedPane.readAddonWarn();"
++                          onsynctopreference="return gAdvancedPane.writeAddonWarn();"/>
++              </hbox>
++              <radio value="checkOnly"
++                     label="&updateCheck.label;"
++                     accesskey="&updateCheck.accesskey;"/>
++              <radio value="manual"
++                     label="&updateManual.label;"
++                     accesskey="&updateManual.accesskey;"/>
++            </radiogroup>
++
++            <hbox>
++              <button id="showUpdateHistory"
++                      label="&updateHistory.label;"
++                      accesskey="&updateHistory.accesskey;"
++                      preference="app.update.disable_button.showUpdateHistory"
++                      oncommand="gAdvancedPane.showUpdates();"/>
++            </hbox>
++
++#ifdef MOZ_MAINTENANCE_SERVICE
++            <checkbox id="useService"
++                      label="&useService.label;"
++                      accesskey="&useService.accesskey;"
++                      preference="app.update.service.enabled"/>
+ #endif
+-            <checkbox id="enableAddonUpdate"
+-                      label="&enableAddonsUpdate.label;"
+-                      accesskey="&enableAddonsUpdate.accesskey;"
+-                      preference="extensions.update.enabled"/>
++          </groupbox>
++#endif
++          <groupbox id="updateOthers">
++            <caption label="&updateOthers.label;"/>
+             <checkbox id="enableSearchUpdate"
+                       label="&enableSearchUpdate.label;"
+                       accesskey="&enableSearchUpdate.accesskey;"
+                       preference="browser.search.update"/>
+-          </vbox>
+-
+-#ifdef MOZ_UPDATER
+-          <separator id="updateSeparator1"/>
+-
+-          <label id="updateModeLabel" control="updateMode">&whenUpdatesFound.label;</label>
+-          <radiogroup id="updateMode" class="indent"
+-                      preference="app.update.auto">
+-            <radio id="ask" value="false"
+-                   label="&askMe.label;"
+-                   accesskey="&askMe.accesskey;"/>
+-            <radio id="automatic" value="true"
+-                   label="&modeAutomatic.label;"
+-                   accesskey="&modeAutomatic.accesskey;"/>
+-            <hbox class="indent">
+-              <checkbox id="warnIncompatible" 
+-                        label="&modeAutoAddonWarn.label;" accesskey="&modeAutoAddonWarn.accesskey;"
+-                        preference="app.update.mode"
+-                        onsyncfrompreference="return gAdvancedPane.readAddonWarn();"
+-                        onsynctopreference="return gAdvancedPane.writeAddonWarn();"/>
+-            </hbox>
+-          </radiogroup>
+-
+-          <separator id="updateSeparator2"/>
+-
+-          <hbox>
+-            <button id="showUpdateHistory" 
+-                    label="&updateHistory.label;" accesskey="&updateHistory.accesskey;"
+-                    preference="app.update.disable_button.showUpdateHistory"
+-                    oncommand="gAdvancedPane.showUpdates();"/>
+-          </hbox>
+-#endif
++          </groupbox>
+         </tabpanel>
+ 
+-        <!-- Encryption -->
++        <!-- Certificates -->
+         <tabpanel id="encryptionPanel" orient="vertical">
+ 
+-          <!-- Protocols -->
+-          <groupbox id="protocolsGroup">
+-            <caption label="&protocols.label;"/>
+-
+-            <grid>
+-              <columns>
+-                <column flex="1"/>
+-                <column flex="1"/>
+-              </columns>
+-              <rows>
+-                <row>
+-                  <hbox>
+-                    <checkbox id="useSSL3" label="&useSSL3.label;"
+-                              accesskey="&useSSL3.accesskey;"
+-                              preference="security.enable_ssl3"/>
+-                  </hbox>
+-                  <hbox>
+-                    <checkbox id="useTLS1" label="&useTLS1.label;"
+-                              accesskey="&useTLS1.accesskey;"
+-                              preference="security.enable_tls"/>
+-                  </hbox>
+-                </row>
+-              </rows>
+-            </grid>
+-          </groupbox>
+-
+-          <!-- Certificates -->
+-          <groupbox id="certificatesGroup">
+-            <caption id="CertGroupCaption" label="&certificates.label;"/>
+-
+             <description id="CertSelectionDesc" control="certSelection">&certSelection.description;</description>
+ 
+             <!--
+               The values on these radio buttons may look like l12y issues, but
+               they're not - this preference uses *those strings* as its values.
+               I KID YOU NOT.
+             -->
+             <radiogroup id="certSelection" orient="horizontal" preftype="string"
+                         preference="security.default_personal_cert"
+-                        aria-labelledby="CertGroupCaption CertSelectionDesc">
+-              <radio label="&certs.auto;" accesskey="&certs.auto.accesskey;" 
++                        aria-labelledby="CertSelectionDesc">
++              <radio label="&certs.auto;" accesskey="&certs.auto.accesskey;"
+                      value="Select Automatically"/>
+-              <radio label="&certs.ask;" accesskey="&certs.ask.accesskey;" 
++              <radio label="&certs.ask;" accesskey="&certs.ask.accesskey;"
+                      value="Ask Every Time"/>
+             </radiogroup>
+ 
+             <separator/>
+ 
++            <checkbox id="enableOCSP"
++                      label="&enableOCSP.label;"
++                      accesskey="&enableOCSP.accesskey;"
++                      onsyncfrompreference="return gAdvancedPane.readEnableOCSP();"
++                      onsynctopreference="return gAdvancedPane.writeEnableOCSP();"
++                      preference="security.OCSP.enabled"/>
++
++            <separator/>
++
+             <hbox>
+               <button id="viewCertificatesButton"
+-                      label="&viewCerts.label;" accesskey="&viewCerts.accesskey;" 
++                      label="&viewCerts.label;" accesskey="&viewCerts.accesskey;"
+                       oncommand="gAdvancedPane.showCertificates();"
+                       preference="security.disable_button.openCertManager"/>
+-              <button id="verificationButton"
+-                      label="&verify2.label;" accesskey="&verify2.accesskey;" 
+-                      oncommand="gAdvancedPane.showOCSP();"/>
+               <button id="viewSecurityDevicesButton"
+                       label="&viewSecurityDevices.label;" accesskey="&viewSecurityDevices.accesskey;"
+                       oncommand="gAdvancedPane.showSecurityDevices();"
+                       preference="security.disable_button.openDeviceManager"/>
+             </hbox>
+-          </groupbox>
+         </tabpanel>
+ 
+       </tabpanels>
+     </tabbox>
+   </prefpane>
+ 
+ </overlay>
+diff --git a/im/content/preferences/connection.js b/im/content/preferences/connection.js
+--- a/im/content/preferences/connection.js
++++ b/im/content/preferences/connection.js
+@@ -1,91 +1,117 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+  * License, v. 2.0. If a copy of the MPL was not distributed with this
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+-Components.utils.import("resource:///modules/imServices.jsm");
+-
+ var gConnectionsDialog = {
+   beforeAccept: function ()
+   {
+     var proxyTypePref = document.getElementById("network.proxy.type");
+     if (proxyTypePref.value == 2) {
+       this.doAutoconfigURLFixup();
+       return true;
+     }
+ 
+     if (proxyTypePref.value != 1)
+       return true;
+ 
+     var httpProxyURLPref = document.getElementById("network.proxy.http");
+     var httpProxyPortPref = document.getElementById("network.proxy.http_port");
+     var shareProxiesPref = document.getElementById("network.proxy.share_proxy_settings");
++
++    // If the port is 0 and the proxy server is specified, focus on the port and cancel submission.
++    for (let prefName of ["http","ssl","ftp","socks"]) {
++      let proxyPortPref = document.getElementById("network.proxy." + prefName + "_port");
++      let proxyPref = document.getElementById("network.proxy." + prefName);
++      // Only worry about ports which are currently active. If the share option is on, then ignore
++      // all ports except the HTTP port
++      if (proxyPref.value != "" && proxyPortPref.value == 0 &&
++            (prefName == "http" || !shareProxiesPref.value)) {
++        document.getElementById("networkProxy" + prefName.toUpperCase() + "_Port").focus();
++        return false;
++      }
++    }
++
++    // In the case of a shared proxy preference, backup the current values and update with the HTTP value
+     if (shareProxiesPref.value) {
+-      var proxyPrefs = ["ssl", "ftp", "socks", "gopher"];
++      var proxyPrefs = ["ssl", "ftp", "socks"];
+       for (var i = 0; i < proxyPrefs.length; ++i) {
+         var proxyServerURLPref = document.getElementById("network.proxy." + proxyPrefs[i]);
+         var proxyPortPref = document.getElementById("network.proxy." + proxyPrefs[i] + "_port");
+         var backupServerURLPref = document.getElementById("network.proxy.backup." + proxyPrefs[i]);
+         var backupPortPref = document.getElementById("network.proxy.backup." + proxyPrefs[i] + "_port");
+-        backupServerURLPref.value = proxyServerURLPref.value;
+-        backupPortPref.value = proxyPortPref.value;
++        backupServerURLPref.value = backupServerURLPref.value || proxyServerURLPref.value;
++        backupPortPref.value = backupPortPref.value || proxyPortPref.value;
+         proxyServerURLPref.value = httpProxyURLPref.value;
+         proxyPortPref.value = httpProxyPortPref.value;
+       }
+     }
+     
+-    var noProxiesPref = document.getElementById("network.proxy.no_proxies_on");
+-    noProxiesPref.value = noProxiesPref.value.replace(/[;]/g,',');
++    this.sanitizeNoProxiesPref();
+     
+     return true;
+   },
+ 
+   checkForSystemProxy: function ()
+   {
+     if ("@mozilla.org/system-proxy-settings;1" in Components.classes)
+       document.getElementById("systemPref").removeAttribute("hidden");
+   },
+   
+   proxyTypeChanged: function ()
+   {
+     var proxyTypePref = document.getElementById("network.proxy.type");
+-    
++
+     // Update http
+     var httpProxyURLPref = document.getElementById("network.proxy.http");
+     httpProxyURLPref.disabled = proxyTypePref.value != 1;
+     var httpProxyPortPref = document.getElementById("network.proxy.http_port");
+     httpProxyPortPref.disabled = proxyTypePref.value != 1;
+ 
+     // Now update the other protocols
+     this.updateProtocolPrefs();
+ 
+     var shareProxiesPref = document.getElementById("network.proxy.share_proxy_settings");
+     shareProxiesPref.disabled = proxyTypePref.value != 1;
+-    
++    var autologinProxyPref = document.getElementById("signon.autologin.proxy");
++    autologinProxyPref.disabled = proxyTypePref.value == 0;
+     var noProxiesPref = document.getElementById("network.proxy.no_proxies_on");
+     noProxiesPref.disabled = proxyTypePref.value != 1;
+-    
++
+     var autoconfigURLPref = document.getElementById("network.proxy.autoconfig_url");
+     autoconfigURLPref.disabled = proxyTypePref.value != 2;
+ 
+     this.updateReloadButton();
+   },
+-
++  
++  updateDNSPref: function ()
++  {
++    var socksVersionPref = document.getElementById("network.proxy.socks_version");
++    var socksDNSPref = document.getElementById("network.proxy.socks_remote_dns");
++    var proxyTypePref = document.getElementById("network.proxy.type");
++    var isDefinitelySocks4 = !socksVersionPref.disabled && socksVersionPref.value == 4;
++    socksDNSPref.disabled = (isDefinitelySocks4 || proxyTypePref.value == 0);
++    return undefined;
++  },
++  
+   updateReloadButton: function ()
+   {
+     // Disable the "Reload PAC" button if the selected proxy type is not PAC or
+     // if the current value of the PAC textbox does not match the value stored
+     // in prefs.  Likewise, disable the reload button if PAC is not configured
+     // in prefs.
+ 
+     var typedURL = document.getElementById("networkProxyAutoconfigURL").value;
+     var proxyTypeCur = document.getElementById("network.proxy.type").value;
+ 
+-    var prefs = Services.prefs;
++    var prefs =
++        Components.classes["@mozilla.org/preferences-service;1"].
++        getService(Components.interfaces.nsIPrefBranch);
+     var pacURL = prefs.getCharPref("network.proxy.autoconfig_url");
+     var proxyType = prefs.getIntPref("network.proxy.type");
+ 
+     var disableReloadPref =
+         document.getElementById("pref.advanced.proxies.disable_button.reload");
+     disableReloadPref.disabled =
+         (proxyTypeCur != 2 || proxyType != 2 || typedURL != pacURL);
+   },
+@@ -95,17 +121,17 @@ var gConnectionsDialog = {
+     this.proxyTypeChanged();
+     return undefined;
+   },
+   
+   updateProtocolPrefs: function ()
+   {
+     var proxyTypePref = document.getElementById("network.proxy.type");
+     var shareProxiesPref = document.getElementById("network.proxy.share_proxy_settings");
+-    var proxyPrefs = ["ssl", "ftp", "socks", "gopher"];
++    var proxyPrefs = ["ssl", "ftp", "socks"];
+     for (var i = 0; i < proxyPrefs.length; ++i) {
+       var proxyServerURLPref = document.getElementById("network.proxy." + proxyPrefs[i]);
+       var proxyPortPref = document.getElementById("network.proxy." + proxyPrefs[i] + "_port");
+       
+       // Restore previous per-proxy custom settings, if present. 
+       if (!shareProxiesPref.value) {
+         var backupServerURLPref = document.getElementById("network.proxy.backup." + proxyPrefs[i]);
+         var backupPortPref = document.getElementById("network.proxy.backup." + proxyPrefs[i] + "_port");
+@@ -121,17 +147,17 @@ var gConnectionsDialog = {
+ 
+       proxyServerURLPref.updateElements();
+       proxyPortPref.updateElements();
+       proxyServerURLPref.disabled = proxyTypePref.value != 1 || shareProxiesPref.value;
+       proxyPortPref.disabled = proxyServerURLPref.disabled;
+     }
+     var socksVersionPref = document.getElementById("network.proxy.socks_version");
+     socksVersionPref.disabled = proxyTypePref.value != 1 || shareProxiesPref.value;
+-    
++    this.updateDNSPref();
+     return undefined;
+   },
+   
+   readProxyProtocolPref: function (aProtocol, aIsPort)
+   {
+     var shareProxiesPref = document.getElementById("network.proxy.share_proxy_settings");
+     if (shareProxiesPref.value) {
+       var pref = document.getElementById("network.proxy.http" + (aIsPort ? "_port" : ""));    
+@@ -153,16 +179,26 @@ var gConnectionsDialog = {
+     var autoURL = document.getElementById("networkProxyAutoconfigURL");
+     var autoURLPref = document.getElementById("network.proxy.autoconfig_url");
+     var URIFixup = Components.classes["@mozilla.org/docshell/urifixup;1"]
+                              .getService(Components.interfaces.nsIURIFixup);
+     try {
+       autoURLPref.value = autoURL.value = URIFixup.createFixupURI(autoURL.value, 0).spec;
+     } catch(ex) {}
+   },
++
++  sanitizeNoProxiesPref: function()
++  {
++    var noProxiesPref = document.getElementById("network.proxy.no_proxies_on");
++    // replace substrings of ; and \n with commas if they're neither immediately
++    // preceded nor followed by a valid separator character
++    noProxiesPref.value = noProxiesPref.value.replace(/([^, \n;])[;\n]+(?![,\n;])/g, '$1,');
++    // replace any remaining ; and \n since some may follow commas, etc. 
++    noProxiesPref.value = noProxiesPref.value.replace(/[;\n]/g, '');
++  },
+   
+   readHTTPProxyServer: function ()
+   {
+     var shareProxiesPref = document.getElementById("network.proxy.share_proxy_settings");
+     if (shareProxiesPref.value)
+       this.updateProtocolPrefs();
+     return undefined;
+   },
+diff --git a/im/content/preferences/connection.xul b/im/content/preferences/connection.xul
+--- a/im/content/preferences/connection.xul
++++ b/im/content/preferences/connection.xul
+@@ -7,62 +7,65 @@
+ 
+ <!DOCTYPE prefwindow SYSTEM "chrome://instantbird/locale/preferences/connection.dtd">
+ 
+ <?xml-stylesheet href="chrome://global/skin/"?>
+ 
+ <prefwindow id="ConnectionsDialog" type="child"
+             xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+             title="&connectionsDialog.title;"
+-            dlgbuttons="accept,cancel"
++            dlgbuttons="accept,cancel,help"
+             onbeforeaccept="return gConnectionsDialog.beforeAccept();"
+             onload="gConnectionsDialog.checkForSystemProxy();"
+ #ifdef XP_MACOSX
+             style="width: &window.macWidth; !important;">
+ #else
+             style="width: &window.width; !important;">
+ #endif
+ 
+-  <prefpane id="ConnectionsDialogPane">
++  <prefpane id="ConnectionsDialogPane"
++            helpTopic="prefs-connection-settings">
+ 
+     <preferences>
+       <preference id="network.proxy.type"         name="network.proxy.type"         type="int" onchange="gConnectionsDialog.proxyTypeChanged();"/>
+       <preference id="network.proxy.http"         name="network.proxy.http"         type="string"/>
+       <preference id="network.proxy.http_port"    name="network.proxy.http_port"    type="int"/>
+       <preference id="network.proxy.ftp"          name="network.proxy.ftp"          type="string"/>
+       <preference id="network.proxy.ftp_port"     name="network.proxy.ftp_port"     type="int"/>
+       <preference id="network.proxy.ssl"          name="network.proxy.ssl"          type="string"/>
+       <preference id="network.proxy.ssl_port"     name="network.proxy.ssl_port"     type="int"/>
+       <preference id="network.proxy.socks"        name="network.proxy.socks"        type="string"/>
+       <preference id="network.proxy.socks_port"   name="network.proxy.socks_port"   type="int"/>
+-      <preference id="network.proxy.gopher"       name="network.proxy.gopher"       type="string"/>
+-      <preference id="network.proxy.gopher_port"  name="network.proxy.gopher_port"  type="int"/>
+-      <preference id="network.proxy.socks_version"  name="network.proxy.socks_version"  type="int"/>
++      <preference id="network.proxy.socks_version"  name="network.proxy.socks_version"  type="int" onchange="gConnectionsDialog.updateDNSPref();"/>
++      <preference id="network.proxy.socks_remote_dns"  name="network.proxy.socks_remote_dns"  type="bool"/>
+       <preference id="network.proxy.no_proxies_on"  name="network.proxy.no_proxies_on"  type="string"/>
+       <preference id="network.proxy.autoconfig_url" name="network.proxy.autoconfig_url" type="string"/>
+       <preference id="network.proxy.share_proxy_settings"
+                   name="network.proxy.share_proxy_settings"
+                   type="bool"/>
+-      
++      <preference id="signon.autologin.proxy"
++                  name="signon.autologin.proxy"
++                  type="bool"/>
++
+       <preference id="pref.advanced.proxies.disable_button.reload"
+                   name="pref.advanced.proxies.disable_button.reload"
+                   type="bool"/>
+ 
+       <preference id="network.proxy.backup.ftp"          name="network.proxy.backup.ftp"          type="string"/>
+       <preference id="network.proxy.backup.ftp_port"     name="network.proxy.backup.ftp_port"     type="int"/>
+       <preference id="network.proxy.backup.ssl"          name="network.proxy.backup.ssl"          type="string"/>
+       <preference id="network.proxy.backup.ssl_port"     name="network.proxy.backup.ssl_port"     type="int"/>
+       <preference id="network.proxy.backup.socks"        name="network.proxy.backup.socks"        type="string"/>
+       <preference id="network.proxy.backup.socks_port"   name="network.proxy.backup.socks_port"   type="int"/>
+-      <preference id="network.proxy.backup.gopher"       name="network.proxy.backup.gopher"       type="string"/>
+-      <preference id="network.proxy.backup.gopher_port"  name="network.proxy.backup.gopher_port"  type="int"/>
+     </preferences>
+     
+     <script type="application/javascript" src="chrome://instantbird/content/preferences/connection.js"/>
+ 
++    <stringbundle id="preferencesBundle" src="chrome://instantbird/locale/preferences/preferences.properties"/>
++
+     <groupbox>
+       <caption label="&proxyTitle.label;"/>
+ 
+       <radiogroup id="networkProxyType" preference="network.proxy.type"
+                   onsyncfrompreference="return gConnectionsDialog.readProxyType();">
+         <radio value="0" label="&noProxyTypeRadio.label;" accesskey="&noProxyTypeRadio.accesskey;"/>
+         <radio value="4" label="&WPADTypeRadio.label;" accesskey="&WPADTypeRadio.accesskey;"/>
+         <radio value="5" label="&systemTypeRadio.label;" accesskey="&systemTypeRadio.accesskey;" id="systemPref" hidden="true"/>
+@@ -114,65 +117,55 @@
+                          onsyncfrompreference="return gConnectionsDialog.readProxyProtocolPref('ftp', false);"/>
+                 <label value="&port.label;" accesskey="&FTPport.accesskey;" control="networkProxyFTP_Port"/>
+                 <textbox id="networkProxyFTP_Port" type="number" max="65535" size="5" preference="network.proxy.ftp_port"
+                          onsyncfrompreference="return gConnectionsDialog.readProxyProtocolPref('ftp', true);"/>
+               </hbox>
+             </row>
+             <row align="center">
+               <hbox pack="end">
+-                <label value="&gopher.label;" accesskey="&gopher.accesskey;" control="networkProxyGopher"/>
+-              </hbox>
+-              <hbox align="center">
+-                <textbox id="networkProxyGopher" flex="1" preference="network.proxy.gopher"
+-                         onsyncfrompreference="return gConnectionsDialog.readProxyProtocolPref('gopher', false);"/>
+-                <label value="&port.label;" accesskey="&gopherPort.accesskey;" control="networkProxyGopher_Port"/>
+-                <textbox id="networkProxyGopher_Port" type="number" max="65535" size="5" preference="network.proxy.gopher_port"
+-                         onsyncfrompreference="return gConnectionsDialog.readProxyProtocolPref('gopher', true);"/>
+-              </hbox>
+-            </row>
+-            <row align="center">
+-              <hbox pack="end">
+                 <label value="&socks.label;" accesskey="&socks.accesskey;" control="networkProxySOCKS"/>
+               </hbox>
+               <hbox align="center">
+                 <textbox id="networkProxySOCKS" flex="1" preference="network.proxy.socks"
+                          onsyncfrompreference="return gConnectionsDialog.readProxyProtocolPref('socks', false);"/>
+                 <label value="&port.label;" accesskey="&SOCKSport.accesskey;" control="networkProxySOCKS_Port"/>
+                 <textbox id="networkProxySOCKS_Port" type="number" max="65535" size="5" preference="network.proxy.socks_port"
+                          onsyncfrompreference="return gConnectionsDialog.readProxyProtocolPref('socks', true);"/>
+               </hbox>
+             </row>
+             <row>
+               <spacer/>
++              <box pack="start">
+               <radiogroup id="networkProxySOCKSVersion" orient="horizontal"
+                           preference="network.proxy.socks_version">
+                 <radio id="networkProxySOCKSVersion4" value="4" label="&socks4.label;" accesskey="&socks4.accesskey;" />
+                 <radio id="networkProxySOCKSVersion5" value="5" label="&socks5.label;" accesskey="&socks5.accesskey;" />
+               </radiogroup>
++              <checkbox id="networkProxySOCKSRemoteDNS"  preference="network.proxy.socks_remote_dns" label="&socksRemoteDNS.label;" accesskey="&socksRemoteDNS.accesskey;" />
++              </box>
+             </row>
+-
+-            <row align="center"> 
+-              <hbox align="center" pack="end">
+-                <label value="&noproxy.label;" accesskey="&noproxy.accesskey;" control="networkProxyNone"/>
+-              </hbox>
+-              <textbox id="networkProxyNone" preference="network.proxy.no_proxies_on"/>
+-            </row>
+-            <row>
+-              <spacer/>
+-              <label value="&noproxyExplain.label;" control="networkProxyNone"/>
+-            </row>
++            <label value="&noproxy.label;" accesskey="&noproxy.accesskey;" control="networkProxyNone"/>
++            <textbox id="networkProxyNone" preference="network.proxy.no_proxies_on" multiline="true" rows="2"/>
++            <label value="&noproxyExplain.label;" control="networkProxyNone"/>
+           </rows>
+         </grid>
+         <radio value="2" label="&autoTypeRadio.label;" accesskey="&autoTypeRadio.accesskey;"/>
+         <hbox class="indent" flex="1" align="center">
+           <textbox id="networkProxyAutoconfigURL" flex="1" preference="network.proxy.autoconfig_url"
+                    oninput="gConnectionsDialog.updateReloadButton();"/>
+           <button id="autoReload" icon="refresh"
+                   label="&reload.label;" accesskey="&reload.accesskey;"
+                   oncommand="gConnectionsDialog.reloadPAC();" 
+                   preference="pref.advanced.proxies.disable_button.reload"/>
+         </hbox>
+       </radiogroup>
+     </groupbox>
++    <separator class="thin"/>
++    <checkbox id="autologinProxy"
++              label="&autologinproxy.label;"
++              accesskey="&autologinproxy.accesskey;"
++              preference="signon.autologin.proxy"
++              tooltiptext="&autologinproxy.tooltip;"/>
++    <separator/>
+   </prefpane>
+ </prefwindow>
+ 
+diff --git a/im/locales/en-US/chrome/instantbird/preferences/advanced.dtd b/im/locales/en-US/chrome/instantbird/preferences/advanced.dtd
+--- a/im/locales/en-US/chrome/instantbird/preferences/advanced.dtd
++++ b/im/locales/en-US/chrome/instantbird/preferences/advanced.dtd
+@@ -14,16 +14,18 @@
+ <!ENTITY searchStartTyping.accesskey     "x">
+ 
+ <!ENTITY conversations.label             "Conversations">
+ 
+ <!ENTITY useAutoScroll.label             "Use autoscrolling">
+ <!ENTITY useAutoScroll.accesskey         "a">
+ <!ENTITY useSmoothScrolling.label        "Use smooth scrolling">
+ <!ENTITY useSmoothScrolling.accesskey    "m">
++<!ENTITY allowHWAccel.label              "Use hardware acceleration when available">
++<!ENTITY allowHWAccel.accesskey          "r">
+ <!ENTITY checkSpelling.label             "Check my spelling as I type">
+ <!ENTITY checkSpelling.accesskey         "t">
+ 
+ <!ENTITY searchEnginesGroup.label        "Search engines">
+ <!ENTITY searchEnginesDesc.label         "Change options for your search engines">
+ <!ENTITY searchEngines.label             "Manage Search Engines…">
+ <!ENTITY searchEngines.accesskey         "S">
+ 
+@@ -40,44 +42,42 @@
+ <!ENTITY connectionLibpurpleDesc.label   "For libpurple-based accounts">
+ <!ENTITY connectionOtherDesc.label       "For everything else (updates, addons, …)">
+ <!ENTITY connectionSettings.label        "Settings…">
+ <!ENTITY connectionSettings.accesskey    "e">
+ <!ENTITY connectionSettings2.accesskey   "i">
+ 
+ <!ENTITY updateTab.label                 "Update">
+ 
+-<!ENTITY autoCheck.label                 "Automatically check for updates to:">
+-<!ENTITY enableAppUpdate.label           "&brandShortName;">
+-<!ENTITY enableAppUpdate.accesskey       "I">
+-<!ENTITY enableAddonsUpdate.label        "Installed Add-ons">
+-<!ENTITY enableAddonsUpdate.accesskey    "n">
+-<!ENTITY enableSearchUpdate.label        "Search Engines">
+-<!ENTITY enableSearchUpdate.accesskey    "h">
+-<!ENTITY whenUpdatesFound.label          "When updates to &brandShortName; are found:">
+-<!ENTITY askMe.label                     "Ask me what I want to do">
+-<!ENTITY askMe.accesskey                 "k">
+-<!ENTITY modeAutomatic.label             "Automatically download and install the update">
+-<!ENTITY modeAutomatic.accesskey         "d">
+-<!ENTITY modeAutoAddonWarn.label         "Warn me if this will disable any of my add-ons">
+-<!ENTITY modeAutoAddonWarn.accesskey     "W">
++<!ENTITY updateApp.label                 "&brandShortName; updates:">
++<!ENTITY updateAuto1.label               "Automatically install updates (recommended: improved security)">
++<!ENTITY updateAuto1.accesskey           "A">
++<!ENTITY updateCheck.label               "Check for updates, but let me choose whether to install them">
++<!ENTITY updateCheck.accesskey           "C">
++<!ENTITY updateManual.label              "Never check for updates (not recommended: security risk)">
++<!ENTITY updateManual.accesskey          "N">
++
++<!ENTITY updateAutoAddonWarn.label       "Warn me if this will disable any of my add-ons">
++<!ENTITY updateAutoAddonWarn.accesskey   "W">
++
+ <!ENTITY updateHistory.label             "Show Update History">
+ <!ENTITY updateHistory.accesskey         "p">
+ 
+-<!ENTITY encryptionTab.label             "Encryption">
++<!ENTITY useService.label                "Use a background service to install updates">
++<!ENTITY useService.accesskey            "b">
+ 
+-<!ENTITY protocols.label                 "Protocols">
+-<!ENTITY useSSL3.label                   "Use SSL 3.0">
+-<!ENTITY useSSL3.accesskey               "3">
+-<!ENTITY useTLS1.label                   "Use TLS 1.0">
+-<!ENTITY useTLS1.accesskey               "1">
+-<!ENTITY certificates.label              "Certificates">
++<!ENTITY updateOthers.label              "Automatically update:">
++<!ENTITY enableSearchUpdate.label        "Search Engines">
++<!ENTITY enableSearchUpdate.accesskey    "E">
++
++<!ENTITY certificateTab.label            "Certificates">
++<!ENTITY certSelection.label             "Requests">
+ <!ENTITY certSelection.description       "When a server requests my personal certificate:">
+ <!ENTITY certs.auto                      "Select one automatically">
+-<!ENTITY certs.auto.accesskey            "l">
++<!ENTITY certs.auto.accesskey            "S">
+ <!ENTITY certs.ask                       "Ask me every time">
+-<!ENTITY certs.ask.accesskey             "i">
++<!ENTITY certs.ask.accesskey             "A">
++<!ENTITY enableOCSP.label                "Query OCSP responder servers to confirm the current validity of certificates">
++<!ENTITY enableOCSP.accesskey            "Q">
+ <!ENTITY viewCerts.label                 "View Certificates">
+-<!ENTITY viewCerts.accesskey             "s">
+-<!ENTITY verify2.label                   "Validation">
+-<!ENTITY verify2.accesskey               "V">
++<!ENTITY viewCerts.accesskey             "C">
+ <!ENTITY viewSecurityDevices.label       "Security Devices">
+-<!ENTITY viewSecurityDevices.accesskey   "y">
++<!ENTITY viewSecurityDevices.accesskey   "D">
+diff --git a/im/locales/en-US/chrome/instantbird/preferences/connection.dtd b/im/locales/en-US/chrome/instantbird/preferences/connection.dtd
+--- a/im/locales/en-US/chrome/instantbird/preferences/connection.dtd
++++ b/im/locales/en-US/chrome/instantbird/preferences/connection.dtd
+@@ -17,32 +17,33 @@
+ <!ENTITY  manualTypeRadio.label         "Manual proxy configuration:">
+ <!ENTITY  manualTypeRadio.accesskey     "m">
+ <!ENTITY  autoTypeRadio.label           "Automatic proxy configuration URL:">
+ <!ENTITY  autoTypeRadio.accesskey       "A">
+ <!ENTITY  reload.label                  "Reload">
+ <!ENTITY  reload.accesskey              "e">
+ <!ENTITY  ftp.label                     "FTP Proxy:">
+ <!ENTITY  ftp.accesskey                 "F">
+-<!ENTITY  gopher.label                  "Gopher Proxy:">
+-<!ENTITY  gopher.accesskey              "G">
+ <!ENTITY  http.label                    "HTTP Proxy:">
+ <!ENTITY  http.accesskey                "x">
+ <!ENTITY  ssl.label                     "SSL Proxy:">
+ <!ENTITY  ssl.accesskey                 "L">
+ <!ENTITY  socks.label                   "SOCKS Host:">
+ <!ENTITY  socks.accesskey               "C">
+ <!ENTITY  socks4.label                  "SOCKS v4">
+ <!ENTITY  socks4.accesskey              "K">
+ <!ENTITY  socks5.label                  "SOCKS v5">
+ <!ENTITY  socks5.accesskey              "v">
++<!ENTITY  socksRemoteDNS.label          "Remote DNS">
++<!ENTITY  socksRemoteDNS.accesskey      "d">
+ <!ENTITY  port.label                    "Port:">
+ <!ENTITY  HTTPport.accesskey            "P">
+ <!ENTITY  SSLport.accesskey             "o">
+ <!ENTITY  FTPport.accesskey             "r">
+-<!-- No accesskey for gopher (':' doesn't go well) - mpt's going to redesign the window -->
+-<!ENTITY  gopherPort.accesskey          "">
+ <!ENTITY  SOCKSport.accesskey           "t">
+ <!ENTITY  noproxy.label                 "No Proxy for:">
+ <!ENTITY  noproxy.accesskey             "n">
+ <!ENTITY  noproxyExplain.label          "Example: .mozilla.org, .net.nz, 192.168.1.0/24">
+ <!ENTITY  shareproxy.label              "Use this proxy server for all protocols">
+ <!ENTITY  shareproxy.accesskey          "s">
++<!ENTITY  autologinproxy.label          "Do not prompt for authentication if password is saved">
++<!ENTITY  autologinproxy.accesskey      "i">
++<!ENTITY  autologinproxy.tooltip        "This option silently authenticates you to proxies when you have saved credentials for them. You will be prompted if authentication fails.">
+
diff --git a/projects/instantbird/config b/projects/instantbird/config
index afdb042..4993c8c 100644
--- a/projects/instantbird/config
+++ b/projects/instantbird/config
@@ -74,6 +74,7 @@ input_files:
   - filename: version.patch
   - filename: search-context-menu.patch
   - filename: search-preferences-xul.patch
+  - filename: certificate-settings-xul.patch
   - filename: log-preferences-xul.patch
   - filename: ifdef-performance-toolkit-xpt.patch
   - filename: 8ea23862252b-remove__DATE__and__TIME__.nsspatch



More information about the tor-commits mailing list