Browse Source

fixes and new stuff

Frank-Rainer Grahl 2 years ago
parent
commit
dd51615b39

+ 65 - 0
comm-central/patches/1069787-spellchecker-subject-1_1-25315.patch

@@ -0,0 +1,65 @@
+# HG changeset patch
+# User Frank-Rainer Grahl <frgrahl@gmx.net>
+# Date 1664135396 -7200
+# Parent  764669cd0405e0182705d5dd7461481d5d883876
+Bug 1069787 - Don't check subject if spellchecker is not ready. r=IanN
+
+diff --git a/suite/mailnews/components/compose/content/MsgComposeCommands.js b/suite/mailnews/components/compose/content/MsgComposeCommands.js
+--- a/suite/mailnews/components/compose/content/MsgComposeCommands.js
++++ b/suite/mailnews/components/compose/content/MsgComposeCommands.js
+@@ -2396,21 +2396,29 @@ function ComposeChangeLanguage(aLang)
+ 
+     // Update the document language as well.
+     // This is needed to synchronize the subject.
+     document.documentElement.setAttribute("lang", aLang);
+ 
+     // Update spellchecker pref
+     Services.prefs.setCharPref("spellchecker.dictionary", aLang);
+ 
+-    // now check the document and the subject over again with the new dictionary
+-    if (InlineSpellCheckerUI.enabled)
+-    {
++    // Now check the document and the subject over again with the new
++    // dictionary.
++    if (InlineSpellCheckerUI.enabled) {
+       InlineSpellCheckerUI.mInlineSpellChecker.spellCheckRange(null);
+-      GetMsgSubjectElement().inputField.parentNode.spellCheckerUI.mInlineSpellChecker.spellCheckRange(null);
++
++      // Also force a recheck of the subject. The spell checker for the subject
++      // isn't always ready yet. Usually throws unless the subject was selected
++      // at least once. So don't auto-create it, hence pass 'false'.
++      let inlineSpellChecker =
++        GetMsgSubjectElement().editor.getInlineSpellChecker(false);
++      if (inlineSpellChecker) {
++        inlineSpellChecker.spellCheckRange(null);
++      }
+     }
+   }
+ }
+ 
+ function ToggleReturnReceipt(target)
+ {
+     var msgCompFields = gMsgCompose.compFields;
+     if (msgCompFields)
+diff --git a/suite/mailnews/components/compose/content/messengercompose.xul b/suite/mailnews/components/compose/content/messengercompose.xul
+--- a/suite/mailnews/components/compose/content/messengercompose.xul
++++ b/suite/mailnews/components/compose/content/messengercompose.xul
+@@ -562,17 +562,17 @@
+                   <image class="person-icon"
+                          onclick="this.parentNode.select();"/>
+                 </textbox>
+               </listcell>
+             </listitem>
+           </listbox>
+           <hbox align="center">
+             <label value="&subject.label;" accesskey="&subject.accesskey;" control="msgSubject"/>
+-            <textbox id="msgSubject" flex="1" class="toolbar" disableonsend="true"
++            <textbox id="msgSubject" flex="1" class="toolbar" disableonsend="true" spellcheck="true"
+                      oninput="gContentChanged=true;SetComposeWindowTitle();"
+                      onkeypress="subjectKeyPress(event);" />
+           </hbox>
+         </vbox>
+         <splitter id="attachmentbucket-sizer" collapse="after"/>
+         <vbox id="attachments-box">
+           <label id="attachmentBucketText" value="&attachments.label;" crop="right"
+                  accesskey="&attachments.accesskey;" control="attachmentBucket"/>

+ 615 - 0
comm-central/patches/1392929-cc-contentprefs2-1_1-25315.patch

@@ -0,0 +1,615 @@
+# HG changeset patch
+# User Ian Neal <iann_cvs@blueyonder.co.uk>
+# Date 1663189995 -3600
+# Node ID 0ca324fbb10640c93c41c6284ef81f855cb87bc1
+# Parent  3e7fd08260e58b9ecd214f54bd7519043f71d278
+Bug 1392929 - Port Bug 886907 - Remove old synchronous contentPrefService to SeaMonkey - comm part. r=frg
+
+diff --git a/suite/base/content/viewZoomOverlay.js b/suite/base/content/viewZoomOverlay.js
+--- a/suite/base/content/viewZoomOverlay.js
++++ b/suite/base/content/viewZoomOverlay.js
+@@ -7,19 +7,16 @@
+ // One of the possible values for the mousewheel.* preferences.
+ // From nsEventStateManager.cpp.
+ const MOUSE_SCROLL_ZOOM = 3;
+ 
+ /**
+  * Controls the "full zoom" setting and its site-specific preferences.
+  */
+ var FullZoom = FullZoom || {
+-  contentPrefs: Cc["@mozilla.org/content-pref/service;1"]
+-                  .getService(Ci.nsIContentPrefService2),
+-
+   // Identifies the setting in the content prefs database.
+   name: "browser.content.full-zoom",
+ 
+   // The global value (if any) for the setting. Asynchronously loaded from the
+   // service when first requested, then updated by the pref change listener as
+   // it changes. If there is no global value, then this should be undefined.
+   globalValue: undefined,
+ 
+@@ -46,33 +43,33 @@ var FullZoom = FullZoom || {
+   //**************************************************************************//
+   // Initialization & Destruction
+ 
+   init: function FullZoom_init() {
+     // Listen for scrollwheel events so we can save scrollwheel-based changes.
+     window.addEventListener("wheel", this, true);
+ 
+     // Fetch the initial global value.
+-    this.contentPrefs.getGlobal(this.name, null, this);
++    Services.contentPrefs2.getGlobal(this.name, null, this);
+ 
+     // Register ourselves with the service so we know when our pref changes.
+-    this.contentPrefs.addObserverForName(this.name, this);
++    Services.contentPrefs2.addObserverForName(this.name, this);
+ 
+     this._siteSpecificPref =
+       Services.prefs.getBoolPref("browser.zoom.siteSpecific");
+     this.updateBackgroundTabs =
+       Services.prefs.getBoolPref("browser.zoom.updateBackgroundTabs");
+     // Listen for changes to the browser.zoom branch so we can enable/disable
+     // updating background tabs and per-site saving and restoring of zoom levels.
+     Services.prefs.addObserver("browser.zoom.", this, true);
+   },
+ 
+   destroy: function FullZoom_destroy() {
+     Services.prefs.removeObserver("browser.zoom.", this);
+-    this.contentPrefs.removeObserverForName(this.name, this);
++    Services.contentPrefs2.removeObserverForName(this.name, this);
+     window.removeEventListener("wheel", this, true);
+   },
+ 
+ 
+   //**************************************************************************//
+   // Event Handlers
+ 
+   // nsIDOMEventListener
+@@ -135,40 +132,40 @@ var FullZoom = FullZoom || {
+         }
+         break;
+     }
+   },
+ 
+   // nsIContentPrefObserver
+ 
+   onContentPrefSet: function FullZoom_onContentPrefSet(aGroup, aName, aValue) {
+-    if (aGroup == this.contentPrefs.extractDomain(getBrowser().currentURI.spec))
++    if (aGroup == Services.contentPrefs2.extractDomain(getBrowser().currentURI.spec))
+       this._applyPrefToSetting(aValue);
+     else if (aGroup == null) {
+       this.globalValue = this._ensureValid(aValue);
+ 
+       // If the current page doesn't have a site-specific preference,
+       // then its zoom should be set to the new global preference now that
+       // the global preference has changed.
+-      var zoomValue = this.contentPrefs.getCachedByDomainAndName(getBrowser().currentURI.spec, this.name, getBrowser().docShell);
++      var zoomValue = Services.contentPrefs2.getCachedByDomainAndName(getBrowser().currentURI.spec, this.name, getBrowser().docShell);
+       if (zoomValue && !zoomValue.value)
+         this._applyPrefToSetting();
+     }
+   },
+ 
+   onContentPrefRemoved: function FullZoom_onContentPrefRemoved(aGroup, aName) {
+-    if (aGroup == this.contentPrefs.extractDomain(getBrowser().currentURI.spec))
++    if (aGroup == Services.contentPrefs2.extractDomain(getBrowser().currentURI.spec))
+       this._applyPrefToSetting();
+     else if (aGroup == null) {
+       this.globalValue = undefined;
+ 
+       // If the current page doesn't have a site-specific preference,
+       // then its zoom should be set to the default preference now that
+       // the global preference has changed.
+-      var zoomValue = this.contentPrefs.getCachedByDomainAndName(getBrowser().currentURI.spec, this.name, getBrowser().docShell);
++      var zoomValue = Services.contentPrefs2.getCachedByDomainAndName(getBrowser().currentURI.spec, this.name, getBrowser().docShell);
+       if (zoomValue && !zoomValue.value)
+         this._applyPrefToSetting();
+     }
+   },
+ 
+   // nsIContentPrefCallback2
+ 
+   handleCompletion: function(aReason) {},
+@@ -202,21 +199,21 @@ var FullZoom = FullZoom || {
+ 
+     // Image documents should always start at 1, and are not affected by prefs.
+     if (!aIsTabSwitch && aBrowser.contentDocument.mozSyntheticDocument) {
+       ZoomManager.setZoomForBrowser(aBrowser, this._ensureValid(1));
+       return;
+     }
+ 
+     var loadContext = aBrowser.docShell;
+-    var zoomValue = this.contentPrefs.getCachedByDomainAndName(aURI.spec, this.name, loadContext);
++    var zoomValue = Services.contentPrefs2.getCachedByDomainAndName(aURI.spec, this.name, loadContext);
+     if (zoomValue) {
+       this._applyPrefToSetting(zoomValue.value, aBrowser);
+     } else {
+-      this.contentPrefs.getByDomainAndName(aURI.spec, this.name, loadContext, {
++      Services.contentPrefs2.getByDomainAndName(aURI.spec, this.name, loadContext, {
+         self: this,
+         value: undefined,
+         handleCompletion: function(aReason) {
+           // Check that we're still where we expect to be in case this took a
+           // while. Null check currentURI, since the window may have been
+           // destroyed before we were called.
+           if (aBrowser.currentURI && aURI.equals(aBrowser.currentURI))
+             this.self._applyPrefToSetting(this.value, aBrowser);
+@@ -299,22 +296,22 @@ var FullZoom = FullZoom || {
+   },
+ 
+   _applySettingToPref: function FullZoom_applySettingToPref() {
+     if (!this.siteSpecific || window.gInPrintPreviewMode ||
+         content.document.mozSyntheticDocument)
+       return;
+ 
+     var zoomLevel = ZoomManager.zoom;
+-    this.contentPrefs.set(getBrowser().currentURI.spec, this.name, zoomLevel, getBrowser().docShell);
++    Services.contentPrefs2.set(getBrowser().currentURI.spec, this.name, zoomLevel, getBrowser().docShell);
+   },
+ 
+   _removePref: function FullZoom_removePref() {
+     if (!content.document.mozSyntheticDocument)
+-      this.contentPrefs.removeByDomainAndName(getBrowser().currentURI.spec, this.name, getBrowser().docShell);
++      Services.contentPrefs2.removeByDomainAndName(getBrowser().currentURI.spec, this.name, getBrowser().docShell);
+   },
+ 
+ 
+   //**************************************************************************//
+   // Utilities
+ 
+   _ensureValid: function FullZoom_ensureValid(aValue) {
+     if (isNaN(aValue))
+diff --git a/suite/components/dataman/content/dataman.js b/suite/components/dataman/content/dataman.js
+--- a/suite/components/dataman/content/dataman.js
++++ b/suite/components/dataman/content/dataman.js
+@@ -51,17 +51,17 @@ var gDataman = {
+       this.debug = Services.prefs.getBoolPref("data_manager.debug");
+     }
+     catch (e) {}
+     this.bundle = document.getElementById("datamanBundle");
+ 
+     Services.obs.addObserver(this, "cookie-changed");
+     Services.obs.addObserver(this, "perm-changed");
+     Services.obs.addObserver(this, "passwordmgr-storage-changed");
+-    // Services.contentPrefs.addObserver(null, this);
++    Services.contentPrefs2.addObserverForName(null, this);
+     Services.obs.addObserver(this, "satchel-storage-changed");
+     Services.obs.addObserver(this, "dom-storage-changed");
+     Services.obs.addObserver(this, "dom-storage2-changed");
+ 
+     this.timer = Cc["@mozilla.org/timer;1"]
+                    .createInstance(Ci.nsITimer);
+ 
+     gTabs.initialize();
+@@ -73,17 +73,17 @@ var gDataman = {
+       this.loadView(window.arguments[0])
+     }
+   },
+ 
+   shutdown: function dataman_shutdown() {
+     Services.obs.removeObserver(this, "cookie-changed");
+     Services.obs.removeObserver(this, "perm-changed");
+     Services.obs.removeObserver(this, "passwordmgr-storage-changed");
+-    // Services.contentPrefs.removeObserver(null, this);
++    Services.contentPrefs2.removeObserverForName(null, this);
+     Services.obs.removeObserver(this, "satchel-storage-changed");
+     Services.obs.removeObserver(this, "dom-storage-changed");
+     Services.obs.removeObserver(this, "dom-storage2-changed");
+ 
+     gDomains.shutdown();
+   },
+ 
+   loadView: function dataman_loadView(aView) {
+@@ -252,21 +252,28 @@ var gDomains = {
+ 
+     this.tree = document.getElementById("domainTree");
+     this.tree.view = this;
+ 
+     this.selectfield = document.getElementById("typeSelect");
+     this.searchfield = document.getElementById("domainSearch");
+ 
+     // global "domain"
+-    this.domainObjects["*"] = {title: "*",
+-                               displayTitle: "*",
+-                               hasPermissions: true,
+-//                               hasPreferences: Services.contentPrefs.getPrefs(null, null).enumerator.hasMoreElements(),
+-                               hasFormData: true};
++    Services.contentPrefs2.hasPrefs(null, null, {
++      handleResult(resultPref) {
++        gDomains.domainObjects["*"] = {title: "*",
++                                       displayTitle: "*",
++                                       hasPermissions: true,
++                                       hasPreferences: resultPref.value,
++                                       hasFormData: true};
++      },
++      handleCompletion: () => {
++      },
++    });
++
+     this.search("");
+     if (!gDataman.viewToLoad.length)
+       this.tree.view.selection.select(0);
+ 
+     let loaderInstance;
+ 
+     function nextStep() {
+       loaderInstance.next();
+@@ -296,33 +303,35 @@ var gDomains = {
+         else {
+           gDomains.addDomainOrFlag(nextPermission.principal.URI.host.replace(/^\./, ""), "hasPermissions");
+         }
+       }
+       gDomains.ignoreUpdate = false;
+       gDomains.search(gDomains.searchfield.value);
+       yield setTimeout(nextStep, 0);
+ 
+-      // Add domains for content prefs.
+-      gDataman.debugMsg("Add content prefs to domain list: " + Date.now()/1000);
+-      gDomains.ignoreUpdate = true;
+-      try {
+-        var statement = Services.contentPrefs.DBConnection.createStatement("SELECT groups.name AS host FROM groups");
+-        while (statement.executeStep()) {
+-          gDataman.debugMsg("Found pref: " + statement.row["host"]);
+-          let prefHost = gDomains.getDomainFromHostWithCheck(statement.row["host"]);
+-          gDomains.addDomainOrFlag(prefHost, "hasPreferences");
+-        }
+-      }
+-      finally {
+-        statement.reset();
+-      }
+-      gDomains.ignoreUpdate = false;
+-      gDomains.search(gDomains.searchfield.value);
+-      yield setTimeout(nextStep, 0);
++      let domains = [];
++      Services.contentPrefs2.getDomains(null, {
++        handleResult(resultPref) {
++          domains.push(resultPref.domain);
++        },
++        handleCompletion: () => {
++          // Add domains for content prefs.
++          gDataman.debugMsg("Add content prefs to domain list: " +
++                            Date.now()/1000);
++          gDomains.ignoreUpdate = true;
++          for (let domain of domains) {
++            gDataman.debugMsg("Found pref: " + domain);
++            let prefHost = gDomains.getDomainFromHostWithCheck(domain);
++            gDomains.addDomainOrFlag(prefHost, "hasPreferences");
++          }
++          gDomains.ignoreUpdate = false;
++          gDomains.search(gDomains.searchfield.value);
++        },
++      });
+ 
+       // Add domains for passwords.
+       gDataman.debugMsg("Add passwords to domain list: " + Date.now()/1000);
+       gDomains.ignoreUpdate = true;
+       gPasswords.loadList();
+       for (let pSignon of gPasswords.allSignons) {
+         gDomains.addDomainOrFlag(pSignon.hostname, "hasPasswords");
+       }
+@@ -1715,52 +1724,47 @@ var gPrefs = {
+ 
+   initialize: function prefs_initialize() {
+     gDataman.debugMsg("Initializing prefs panel");
+     this.tree = document.getElementById("prefsTree");
+     this.tree.view = this;
+ 
+     this.removeButton = document.getElementById("prefsRemove");
+ 
+-    this.tree.treeBoxObject.beginUpdateBatch();
+     // Get all groups (hosts) that match the domain.
+     let domain = gDomains.selectedDomain.title;
+ 
+     if (domain == "*") {
+-      let enumerator = Services.contentPrefs.getPrefs(null, null).enumerator;
+-      while (enumerator.hasMoreElements()) {
+-        let pref = enumerator.getNext().QueryInterface(Ci.nsIProperty);
+-        this.prefs.push({host: null, displayHost: "", name: pref.name,
+-                         value: pref.value});
+-      }
++      domain = null;
+     }
+ 
+-    try {
+-      var statement = Services.contentPrefs.DBConnection.createStatement("SELECT groups.name AS host FROM groups");
+-
+-      while (statement.executeStep()) {
+-        if (gDomains.hostMatchesSelected(gDomains.getDomainFromHostWithCheck(statement.row["host"]))) {
+-          // Now, get all prefs for that host.
+-          let enumerator =  Services.contentPrefs.getPrefs(statement.row["host"], null).enumerator;
+-          while (enumerator.hasMoreElements()) {
+-            let pref = enumerator.getNext().QueryInterface(Ci.nsIProperty);
+-            this.prefs.push({host: statement.row["host"],
+-                             displayHost: gLocSvc.idn.convertToDisplayIDN(statement.row["host"], {}),
+-                             name: pref.name,
+-                             value: pref.value});
++    let prefs = [];
++    Services.contentPrefs2.getBySubdomain(domain, null, {
++      handleResult(resultPref) {
++        prefs.push(resultPref);
++      },
++      handleCompletion: () => {
++        gPrefs.tree.treeBoxObject.beginUpdateBatch();
++        gPrefs.prefs = [];
++        for (let pref of prefs) {
++          if (!domain) {
++            gPrefs.prefs.push({host: null, displayHost: "", name: pref.name,
++                               value: pref.value});
++          }
++          else {
++            let display = gLocSvc.idn.convertToDisplayIDN(pref.domain, {});
++            gPrefs.prefs.push({host: pref.domain, displayHost: display,
++                               name: pref.name, value: pref.value});
+           }
+         }
+-      }
+-    }
+-    finally {
+-      statement.reset();
+-    }
+-
+-    this.sort(null, false, false);
+-    this.tree.treeBoxObject.endUpdateBatch();
++
++        gPrefs.sort(null, false, false);
++        gPrefs.tree.treeBoxObject.endUpdateBatch();
++      },
++    });
+   },
+ 
+   shutdown: function prefs_shutdown() {
+     gDataman.debugMsg("Shutting down prefs panel");
+     this.tree.view.selection.clearSelection();
+     this.tree.view = null;
+     this.prefs = [];
+   },
+@@ -1863,17 +1867,17 @@ var gPrefs = {
+     }
+ 
+     this.tree.view.selection.clearSelection();
+     // Loop backwards so later indexes in the list don't change.
+     for (let i = selections.length - 1; i >= 0; i--) {
+       let delPref = this.prefs[selections[i]];
+       this.prefs.splice(selections[i], 1);
+       this.tree.treeBoxObject.rowCountChanged(selections[i], -1);
+-      Services.contentPrefs.removePref(delPref.host, delPref.name, null);
++      Services.contentPrefs2.removeByDomainAndName(delPref.host, delPref.name, null);
+     }
+     if (!this.prefs.length)
+       gDomains.removeDomainOrFlag(gDomains.selectedDomain.title, "hasPreferences");
+     // Select the entry after the first deleted one or the last of all entries.
+     if (selections.length && this.prefs.length)
+       this.tree.view.selection.toggleSelect(selections[0] < this.prefs.length ?
+                                             selections[0] :
+                                             this.prefs.length - 1);
+@@ -1906,44 +1910,28 @@ var gPrefs = {
+           break;
+         }
+       }
+       if (aData == "prefRemoved")
+         domainPrefs = this.prefs.length;
+     }
+     else if (aData == "prefRemoved") {
+       // See if there are any prefs left for that domain.
+-      if (domain == "*") {
+-        let enumerator = Services.contentPrefs.getPrefs(null, null).enumerator;
+-        if (enumerator.hasMoreElements())
+-          domainPrefs++;
+-      }
+-
+-      try {
+-        let sql = "SELECT groups.name AS host FROM groups";
+-        var statement = Services.contentPrefs.DBConnection.createStatement(sql);
+-
+-        while (statement.executeStep()) {
+-          if (gDomains.hostMatchesSelected(gDomains.getDomainFromHostWithCheck(statement.row["host"]))) {
+-            // Now, get all prefs for that host.
+-            let enumerator = Services.contentPrefs.getPrefs(statement.row["host"], null).enumerator;
+-            if (enumerator.hasMoreElements())
+-              domainPrefs++;
++      Services.contentPrefs2.hasPrefs(domain != "*" ? domain : null, null, {
++        handleResult(prefResult) {
++          if (!prefResult.value) {
++            gDomains.removeDomainOrFlag(domain, "hasPreferences");
+           }
+-        }
+-      }
+-      finally {
+-        statement.reset();
+-      }
+-
+-      if (!domainPrefs)
+-        gDomains.removeDomainOrFlag(domain, "hasPreferences");
++        },
++        handleCompletion: () => {
++        },
++      });
+     }
+     if (aData == "prefSet")
+-        aSubject.displayHost = gLocSvc.idn.convertToDisplayIDN(aSubject.host, {});
++      aSubject.displayHost = gLocSvc.idn.convertToDisplayIDN(aSubject.host, {});
+ 
+     // Affects loaded domain and is an existing pref.
+     if (idx >= 0) {
+       if (aData == "prefSet") {
+         this.prefs[idx] = aSubject;
+         if (affectsLoaded)
+           this.tree.treeBoxObject.invalidateRow(idx);
+       }
+@@ -1967,50 +1955,31 @@ var gPrefs = {
+       // Not the loaded domain but it now has a preference.
+       else {
+         gDomains.addDomainOrFlag(domain, "hasPreferences");
+       }
+     }
+   },
+ 
+   forget: function prefs_forget() {
+-    let delPrefs = [];
+-    try {
+-      // Get all groups (hosts) that match the domain.
+-      let domain = gDomains.selectedDomain.title;
+-      if (domain == "*") {
+-        let enumerator =  Services.contentPrefs.getPrefs(null, null).enumerator;
+-        while (enumerator.hasMoreElements()) {
+-          let pref = enumerator.getNext().QueryInterface(Ci.nsIProperty);
+-          delPrefs.push({host: null, name: pref.name, value: pref.value});
+-        }
+-      }
+-
+-      let sql = "SELECT groups.name AS host FROM groups";
+-      var statement = Services.contentPrefs.DBConnection.createStatement(sql);
+-
+-      while (statement.executeStep()) {
+-        if (gDomains.hostMatchesSelected(gDomains.getDomainFromHostWithCheck(statement.row["host"]))) {
+-          // Now, get all prefs for that host.
+-          let enumerator =  Services.contentPrefs.getPrefs(statement.row["host"], null).enumerator;
+-          while (enumerator.hasMoreElements()) {
+-            let pref = enumerator.getNext().QueryInterface(Ci.nsIProperty);
+-            delPrefs.push({host: statement.row["host"], name: pref.name, value: pref.value});
+-          }
+-        }
+-      }
++    let callbacks = {
++      handleResult(resultDomain) {
++      },
++      handleCompletion: () => {
++        gDomains.removeDomainOrFlag(domain, "hasPreferences");
++      },
++    };
++
++    let domain = gDomains.selectedDomain.title;
++    if (domain == "*") {
++      Services.contentPrefs2.removeAllGlobals(null, callbacks);
+     }
+-    finally {
+-      statement.reset();
++    else {
++      Services.contentPrefs2.removeBySubdomain(domain, null, callbacks);
+     }
+-    // Loop backwards so later indexes in the list don't change.
+-    for (let i = delPrefs.length - 1; i >= 0; i--) {
+-      Services.contentPrefs.removePref(delPrefs[i].host, delPrefs[i].name, null);
+-    }
+-    gDomains.removeDomainOrFlag(gDomains.selectedDomain.title, "hasPreferences");
+   },
+ 
+   // nsITreeView
+   __proto__: gBaseTreeView,
+   get rowCount() {
+     return this.prefs.length;
+   },
+   getCellText: function(aRow, aColumn) {
+diff --git a/suite/components/dataman/tests/browser_dataman_basics.js b/suite/components/dataman/tests/browser_dataman_basics.js
+--- a/suite/components/dataman/tests/browser_dataman_basics.js
++++ b/suite/components/dataman/tests/browser_dataman_basics.js
+@@ -512,18 +512,18 @@ function test_permissions_add(aWin) {
+   is(aWin.gPerms.addHost.value, "getpersonas.com",
+      "On add, the host is set correctly");
+   is(aWin.gPerms.addType.value, "",
+      "Again, no type is selected");
+   Services.obs.notifyObservers(window, TEST_DONE);
+ },
+ 
+ function test_prefs_panel(aWin) {
+-  Services.contentPrefs.setPref("my.drumbeat.org", "data_manager.test", "foo", null);
+-  Services.contentPrefs.setPref("drumbeat.org", "data_manager.test", "bar", null);
++  Services.contentPrefs2.setPref("my.drumbeat.org", "data_manager.test", "foo", null);
++  Services.contentPrefs2.setPref("drumbeat.org", "data_manager.test", "bar", null);
+   is(aWin.gDomains.tree.view.rowCount, kPreexistingDomains + 5,
+      "The domain for prefs tests has been added from the list");
+   aWin.gDomains.tree.view.selection.select(4);
+   is(aWin.gDomains.selectedDomain.title, "drumbeat.org",
+      "For prefs tests, correct domain is selected");
+   is(aWin.gTabs.activePanel, "preferencesPanel",
+      "Preferences panel is selected");
+   is(aWin.gPrefs.tree.view.rowCount, 2,
+@@ -710,22 +710,22 @@ function test_idn(aWin) {
+      "After deleting, correctly switched to permissions panel");
+   let perm = aWin.gPerms.list.children[0];
+   is(perm.host, "bug413909." + testDomain,
+      "Permission has correct host");
+   is(perm.getAttribute("displayHost"), "bug413909." + idnDomain,
+      "Permission has correct display host");
+ 
+   // Add pref with decoded IDN name.
+-  Services.contentPrefs.setPref(testDomain, "data_manager.test", "foo", null);
++  Services.contentPrefs2.setPref(testDomain, "data_manager.test", "foo", null);
+   aWin.gTabs.tabbox.selectedTab = aWin.document.getElementById("preferencesTab");
+   is(aWin.gTabs.activePanel, "preferencesPanel",
+      "Successfully switched to preferences panel for IDN tests");
+   // Add pref with encoded IDN name while panel is shown (different code path).
+-  Services.contentPrefs.setPref(idnDomain, "data_manager.test2", "bar", null);
++  Services.contentPrefs2.setPref(idnDomain, "data_manager.test2", "bar", null);
+   is(aWin.gPrefs.tree.view.getCellText(0, aWin.gPrefs.tree.columns["prefsHostCol"]),
+      idnDomain,
+      "Correct domain displayed for punycode IDN preference");
+   is(aWin.gPrefs.tree.view.getCellText(1, aWin.gPrefs.tree.columns["prefsHostCol"]),
+      idnDomain,
+      "Correct domain displayed for utf8 IDN preference");
+   aWin.gPrefs.tree.view.selection.select(0);
+   aWin.document.getElementById("prefsRemove").click();
+diff --git a/suite/components/pref/content/pref-content.js b/suite/components/pref/content/pref-content.js
+--- a/suite/components/pref/content/pref-content.js
++++ b/suite/components/pref/content/pref-content.js
+@@ -36,27 +36,25 @@ function Startup()
+ 
+   /*   defaultZoom  stuff   */
+ 
+   let defaultElement = document.getElementById("defaultZoom");
+ 
+   defaultElement.min = Services.prefs.getIntPref("zoom.minPercent");
+   defaultElement.max = Services.prefs.getIntPref("zoom.maxPercent");
+ 
+-  let cps2 = Cc["@mozilla.org/content-pref/service;1"]
+-               .getService(Ci.nsIContentPrefService2);
+-
+-  var zoomValue = cps2.getCachedGlobal("browser.content.full-zoom", null);
++  var zoomValue = Services.contentPrefs2
++                          .getCachedGlobal("browser.content.full-zoom", null);
+   if (zoomValue && zoomValue.value) {
+     defaultElement.value = Math.round(zoomValue.value * 100);
+     return;
+   }
+ 
+   defaultElement.value = 100;
+-  cps2.getGlobal("browser.content.full-zoom", null, {
++  Services.contentPrefs2.getGlobal("browser.content.full-zoom", null, {
+     handleResult(pref) {
+       defaultElement.value = Math.round(pref.value * 100);
+     },
+     handleCompletion(reason) {}
+   });
+ }
+ 
+ /**
+@@ -115,26 +113,25 @@ function AdjustMinZoom()
+ }
+ 
+ /**
+  * Set default zoom.
+  */
+ function SetDefaultZoom()
+ {
+   let defaultElement  = document.getElementById("defaultZoom");
+-  let cps2 = Cc["@mozilla.org/content-pref/service;1"]
+-               .getService(Ci.nsIContentPrefService2);
+ 
+   if (defaultElement.valueNumber == 100) {
+-    cps2.removeGlobal("browser.content.full-zoom", null);
++    Services.contentPrefs2.removeGlobal("browser.content.full-zoom", null);
+     return;
+   }
+ 
+   let new_value = defaultElement.valueNumber / 100.;
+-  cps2.setGlobal("browser.content.full-zoom", new_value, null);
++  Services.contentPrefs2.setGlobal("browser.content.full-zoom", new_value,
++                                   null);
+ }
+ 
+ /**
+  * When the user toggles the layers.acceleration.disabled pref,
+  * sync its new value to the gfx.direct2d.disabled pref too.
+  */
+ function updateHardwareAcceleration(aVal)
+ {

+ 226 - 0
comm-central/patches/1441016-port1414390-25315.patch

@@ -0,0 +1,226 @@
+# HG changeset patch
+# User Ian Neal <iann_cvs@blueyonder.co.uk>
+# Date 1587833525 -3600
+# Parent  02a167ebc43e364e3aa0ff382493ee9c0721b5fa
+Bug 1441016 - Migrate to intl.locale.requested.locale list from general.useragent.locale. r=frg
+
+Also port the relevant parts of the following bugs to SeaMonkey:
+* Bug 1346616 - Migrate callsites that are retrieving requested locale from pref, to use LocaleService::GetRequestedLocales
+* Bug 1414390 - Add intl.locale.requested locale list to replace general.useragent.locale
+
+diff --git a/suite/components/nsSuiteGlue.js b/suite/components/nsSuiteGlue.js
+--- a/suite/components/nsSuiteGlue.js
++++ b/suite/components/nsSuiteGlue.js
+@@ -407,17 +407,17 @@ SuiteGlue.prototype = {
+   },
+ 
+   /**
+    * Determine if the UI has been upgraded for this release. If not
+    * reset or migrate some user configurations depending on the migration
+    * level.
+    */
+   _migrateUI() {
+-    const UI_VERSION = 9;
++    const UI_VERSION = 10;
+ 
+     // If the pref is not set this is a new or pre SeaMonkey 2.49 profile.
+     // We can't tell so we just run migration with version 0.
+     let currentUIVersion =
+       Services.prefs.getIntPref("suite.migration.version", 0);
+ 
+     if (currentUIVersion >= UI_VERSION)
+       return;
+@@ -588,16 +588,41 @@ SuiteGlue.prototype = {
+           Cu.reportError(ex);
+         }
+       }
+ 
+       // We might bring this back later but currently set to default.
+       Services.prefs.clearUserPref("browser.tabs.opentabfor.doubleclick");
+     }
+ 
++    // Migrate the old requested locales prefs to use the new model
++    if (currentUIVersion < 10) {
++      const SELECTED_LOCALE_PREF = "general.useragent.locale";
++      const MATCHOS_LOCALE_PREF = "intl.locale.matchOS";
++
++      if (Services.prefs.prefHasUserValue(MATCHOS_LOCALE_PREF) ||
++          Services.prefs.prefHasUserValue(SELECTED_LOCALE_PREF)) {
++        if (Services.prefs.getBoolPref(MATCHOS_LOCALE_PREF, false)) {
++          Services.locale.setRequestedLocales([]);
++        } else {
++          let locale = Services.prefs.getComplexValue(SELECTED_LOCALE_PREF,
++            Ci.nsIPrefLocalizedString);
++          if (locale) {
++            try {
++              Services.locale.setRequestedLocales([locale.data]);
++            } catch (e) {
++              /* Don't panic if the value is not a valid locale code. */
++            }
++          }
++        }
++        Services.prefs.clearUserPref(SELECTED_LOCALE_PREF);
++        Services.prefs.clearUserPref(MATCHOS_LOCALE_PREF);
++      }
++    }
++
+     // Update the migration version.
+     Services.prefs.setIntPref("suite.migration.version", UI_VERSION);
+   },
+ 
+   /**
+    * Determine if the UI has been upgraded for this 2.57 or later release.
+    * If not reset or migrate some user configurations depending on the
+    * migration level.
+diff --git a/suite/components/pref/content/pref-appearance.js b/suite/components/pref/content/pref-appearance.js
+--- a/suite/components/pref/content/pref-appearance.js
++++ b/suite/components/pref/content/pref-appearance.js
+@@ -13,24 +13,25 @@ function Startup()
+ }
+ 
+ /**
+  * From locale switcher's switch.js:
+  * Load available locales into selection menu
+  */
+ function SwitchLocales_Load() {
+   var menulist = document.getElementById("switchLocales");
+-  var pref = document.getElementById("general.useragent.locale");
+ 
+   var cr = Cc["@mozilla.org/chrome/chrome-registry;1"]
+              .getService(Ci.nsIToolkitChromeRegistry);
+ 
+   var langNames = document.getElementById("languageNamesBundle");
+   var regNames  = document.getElementById("regionNamesBundle");
+ 
++  var matched = false;
++  var currentLocale = Services.locale.getRequestedLocale() || undefined;
+   var locales = cr.getLocalesForPackage("global");
+ 
+   while (locales.hasMore()) {
+     var locale = locales.getNext();
+ 
+     var parts = locale.split(/-/);
+ 
+     var displayName;
+@@ -44,50 +45,37 @@ function SwitchLocales_Load() {
+           displayName += " (" + parts[1] + ")";
+         }
+       }
+     }
+     catch (e) {
+       displayName = locale;
+     }
+ 
+-    menulist.appendItem(displayName, locale);
++    var item = menulist.appendItem(displayName, locale);
++    if (!matched && currentLocale && currentLocale == locale) {
++      matched = true;
++      menulist.selectedItem = item;
++    }
+   }
+-  pref.setElementValue(menulist);
++  // If somehow we have not found the current locale, select the first in list.
++  if (!matched) {
++    menulist.selectedIndex = 1;
++  }
+ }
+ 
+ /**
+- * determine the appropriate value to select
+- * go through element value, pref value and pref default value and use the first one available
+- * else fall back to the first available selection
++ * Determine the appropriate value to set and set it.
+  */
+-function SelectLocale(aElement)
+-{
+-  var matchItems;
+-  var pref = document.getElementById(aElement.getAttribute("preference"));
+-  if (pref.value) {
+-    matchItems = aElement.getElementsByAttribute("value", pref.value);
+-    // If the pref matches an entry that actually is in the list, use it.
+-    if (matchItems.length)
+-      return pref.value;
++function SelectLocale(aElement) {
++  var locale = aElement.value;
++  var currentLocale = Services.locale.getRequestedLocale() || undefined;
++  if (!currentLocale || (currentLocale && currentLocale != locale)) {
++    Services.locale.setRequestedLocales([locale]);
+   }
+-
+-  if (pref.defaultValue) {
+-    matchItems = aElement.getElementsByAttribute("value", pref.defaultValue);
+-    // If the pref's default matches an entry that actually is in the list, use it.
+-    if (matchItems.length)
+-      return pref.defaultValue;
+-  }
+-
+-  // If prefs can't point us to a valid value and something is set, leave that.
+-  if (aElement.value)
+-    return aElement.value;
+-
+-  // If somehow we still have no value, return the first value in the list
+-  return aElement.firstChild.firstChild.getAttribute("value");
+ }
+ 
+ /**
+  * When starting up, determine application and regional locale settings
+  * and add the respective strings to the prefpane labels.
+  */
+ function NumberLocales_Load()
+ {
+diff --git a/suite/components/pref/content/pref-appearance.xul b/suite/components/pref/content/pref-appearance.xul
+--- a/suite/components/pref/content/pref-appearance.xul
++++ b/suite/components/pref/content/pref-appearance.xul
+@@ -22,19 +22,16 @@
+                   name="browser.chrome.toolbar_style"
+                   type="int"/>
+       <preference id="browser.chrome.toolbar_tips"
+                   name="browser.chrome.toolbar_tips"
+                   type="bool"/>
+       <preference id="browser.toolbars.grippyhidden"
+                   name="browser.toolbars.grippyhidden"
+                   type="bool"/>
+-      <preference id="general.useragent.locale"
+-                  name="general.useragent.locale"
+-                  type="string"/>
+       <preference id="intl.regional_prefs.use_os_locales"
+                   name="intl.regional_prefs.use_os_locales"
+                   type="bool"/>
+     </preferences>
+ 
+     <hbox>
+       <groupbox id="generalStartupPreferences" align="start" flex="1">
+         <caption label="&onStartLegend.label;"/>
+@@ -78,18 +75,17 @@
+                 preference="browser.toolbars.grippyhidden"/>
+     </vbox>
+ #endif
+     <groupbox id="switchLocaleBox" align="start">
+       <caption label="&pref.locales.title;"/>
+       <description>&selectLocale.label;</description>
+ 
+       <menulist id="switchLocales"
+-                preference="general.useragent.locale"
+-                onsyncfrompreference="return document.getElementById('appearance_pane').SelectLocale(this);"/>
++                onselect="SelectLocale(this);"/>
+ 
+     </groupbox>
+ 
+     <groupbox id="dateTimeFormatting" align="start">
+       <caption label="&dateTimeFormatting.label;"/>
+       <radiogroup id="formatLocale"
+                   preference="intl.regional_prefs.use_os_locales"
+                   orient="vertical">
+diff --git a/suite/locales/en-US/suite-l10n.js b/suite/locales/en-US/suite-l10n.js
+--- a/suite/locales/en-US/suite-l10n.js
++++ b/suite/locales/en-US/suite-l10n.js
+@@ -1,8 +1,8 @@
+ # 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/.
+ 
+ #filter substitution
+ 
+-pref("general.useragent.locale", "@AB_CD@");
++pref("intl.locale.requested", "@AB_CD@");
+ pref("spellchecker.dictionary", "@AB_CD@");

+ 30 - 0
comm-central/patches/1684772-l10n-toml-suite.patch

@@ -0,0 +1,30 @@
+# HG changeset patch
+# User Ian Neal <iann_cvs@blueyonder.co.uk>
+# Date 1609700583 0
+# Parent  667dc1ba9ebcbb1d7b46062335ad72445b453dbc
+Bug 1684772 - Remove editor l10n.toml change for obsolete suite branches. r=frg
+
+diff --git a/suite/locales/l10n.toml b/suite/locales/l10n.toml
+--- a/suite/locales/l10n.toml
++++ b/suite/locales/l10n.toml
+@@ -40,20 +40,16 @@ locales = [
+     l = "{l10n_base}/{locale}/"
+     mozilla = ".."
+ 
+ [[paths]]
+     reference = "suite/locales/en-US/**"
+     l10n = "{l}suite/**"
+ 
+ [[paths]]
+-    reference = "editor/ui/locales/en-US/**"
+-    l10n = "{l}editor/ui/**"
+-
+-[[paths]]
+     reference = "suite/branding/seamonkey/locales/en-US/**"
+     l10n = "{l}suite/branding/seamonkey/**"
+ 
+ [[paths]]
+     reference = "{mozilla}/services/sync/locales/en-US/**"
+     l10n = "{l}services/sync/**"
+ 
+ [[includes]]

+ 56 - 0
comm-central/patches/1790695-decodeimageasync-25315.patch

@@ -0,0 +1,56 @@
+# HG changeset patch
+# User Frank-Rainer Grahl <frgrahl@gmx.net>
+# Date 1663004214 -7200
+# Parent  a2ee9aad47052223e7fe93c7f2caad0c3191f990
+Bug 1790695 - Call Imagelibs decodeImageAsyncWindows using a callback. r=IanN
+
+The previous code did always draw the default icon only because the decoding is
+done async and returns the data at a later point.
+
+diff --git a/suite/modules/WindowsPreviewPerTab.jsm b/suite/modules/WindowsPreviewPerTab.jsm
+--- a/suite/modules/WindowsPreviewPerTab.jsm
++++ b/suite/modules/WindowsPreviewPerTab.jsm
+@@ -78,21 +78,40 @@ function _imageFromURI(uri, privateMode,
+ 
+   try {
+     channel.QueryInterface(Ci.nsIPrivateBrowsingChannel);
+     channel.setPrivate(privateMode);
+   } catch (e) {
+     // Ignore channels which do not support nsIPrivateBrowsingChannel.
+   }
+   NetUtil.asyncFetch(channel, function(inputStream, resultCode) {
+-    if (!Components.isSuccessCode(resultCode))
++    if (!Components.isSuccessCode(resultCode)) {
+       return;
++    }
++
++    const decodeCallback = {
++      onImageReady(image, status) {
++        if (!image) {
++          // We failed, so use the default favicon (only if this wasn't the
++          // default favicon).
++          let defaultURI = PlacesUtils.favicons.defaultFavicon;
++          if (!defaultURI.equals(uri)) {
++            _imageFromURI(defaultURI, privateMode, callback);
++            return;
++          }
++        }
++
++        callback(image);
++      }
++    };
++
+     try {
+-      let out_img = imgTools.decodeImageAsync(inputStream, channel.contentType);
+-      callback(out_img);
++      let threadManager = Cc["@mozilla.org/thread-manager;1"].getService();
++      imgTools.decodeImageAsync(inputStream, channel.contentType,
++                                decodeCallback, threadManager.currentThread);
+     } catch (e) {
+       // We failed, so use the default favicon (only if this wasn't the default
+       // favicon).
+       let defaultURI = PlacesUtils.favicons.defaultFavicon;
+       if (!defaultURI.equals(uri))
+         _imageFromURI(defaultURI, privateMode, callback);
+     }
+   });

+ 48 - 0
comm-central/patches/1792578-flushmemory-25315.patch

@@ -0,0 +1,48 @@
+# HG changeset patch
+# User Ian Neal <iann_cvs@blueyonder.co.uk>
+# Date 1664320891 -3600
+# Parent  92040bf84c6afcf32fd7d04618e268899227934a
+Bug 1792578 - Remove use of nsIMemory. r=frg
+
+diff --git a/suite/extensions/debugQA/content/debugQAMenuOverlay.js b/suite/extensions/debugQA/content/debugQAMenuOverlay.js
+--- a/suite/extensions/debugQA/content/debugQAMenuOverlay.js
++++ b/suite/extensions/debugQA/content/debugQAMenuOverlay.js
+@@ -35,8 +35,16 @@ function onLoadBloat()
+ // Open a debug QA link from the menu in the current tab.
+ function openQAUrl(aUrl)
+ {
+   openUILinkIn(aUrl, "current",
+                { triggeringPrincipal:
+                    Services.scriptSecurityManager.createNullPrincipal({}),
+                });
+ }
++
++// Flush the memory using minimizeMemoryUsage.
++function flushMemory() {
++  Services.obs.notifyObservers(null, "child-mmu-request");
++  Cc["@mozilla.org/memory-reporter-manager;1"]
++    .getService(Ci.nsIMemoryReporterManager)
++    .minimizeMemoryUsage(() => {});
++}
+diff --git a/suite/extensions/debugQA/content/debugQAMenuOverlay.xul b/suite/extensions/debugQA/content/debugQAMenuOverlay.xul
+--- a/suite/extensions/debugQA/content/debugQAMenuOverlay.xul
++++ b/suite/extensions/debugQA/content/debugQAMenuOverlay.xul
+@@ -85,17 +85,17 @@
+           </menupopup>
+         </menu>
+ 
+         <menuseparator/>
+ 
+         <menuitem label="Composer (with test page)"
+                   oncommand="NewEditorWindow('chrome://debugqa/content/EditorInitPage.html');"/>
+         <menuitem label="Flush Memory"
+-                  oncommand="Cc['@mozilla.org/xpcom/memory-service;1'].getService(Ci.nsIMemory).heapMinimize(true);"/>
++                  oncommand="flushMemory();"/>
+         <menuitem label="Show Configuration Editor"
+                   oncommand="goAbout('config');"/>
+       </menupopup>
+     </menu>
+ 
+     <menu id="qaMenu" accesskey="Q" label="QA" insertbefore="menu_Help">
+       <menupopup id="qaMenuPopup">
+         <menuitem label="Getting Involved"

+ 275 - 0
comm-central/patches/1793291-help-25315.patch

@@ -0,0 +1,275 @@
+# HG changeset patch
+# User Rainer Bielefeld <RainerBielefeldNG@BielefeldUndBuss.de>
+# Date 1665267234 -7200
+# Parent  7cbd4799ce541645884f1015d5b30d8c1cd07b94
+Bug 1793291 - Correct mailnews_account_settings.xhtml. r=frg
+
+diff --git a/suite/locales/en-US/chrome/common/help/mailnews_account_settings.xhtml b/suite/locales/en-US/chrome/common/help/mailnews_account_settings.xhtml
+--- a/suite/locales/en-US/chrome/common/help/mailnews_account_settings.xhtml
++++ b/suite/locales/en-US/chrome/common/help/mailnews_account_settings.xhtml
+@@ -48,17 +48,17 @@
+     <li><a href="#junk_settings">Junk Settings</a></li>
+     <li><a href="#return_receipts">Return Receipts</a></li>
+     <li><a href="#security">Security</a></li>
+     <li><a href="#local_folders">Local Folders</a></li>
+     <li><a href="#outgoing_server">Outgoing Server (SMTP)</a></li>
+   </ul>
+ </div>
+ 
+-<h2 id="account_settings">Mail &amp; Newsgroups Account Settings - Account
++<h2 id="account_settings">Mail &amp; Newsgroups Account Settings – Account
+   Settings</h2>
+ 
+ <p>This section describes how to view or change your Account Settings, such as
+   your user name, reply-to address, and signature. If you are not already
+   viewing the Account Settings, begin from the Mail window:</p>
+ 
+ <ol>
+   <li>Open the Edit menu and choose Mail &amp; Newsgroups Account Settings. You
+@@ -114,17 +114,17 @@
+         &amp; news feeds account.</li>
+     </ul>
+   </li>
+ </ul>
+ 
+ <p>[<a href="#mail_and_newsgroups_account_settings">Return to beginning of
+   section</a>]</p>
+ 
+-<h2 id="server_settings">Mail &amp; Newsgroups Account Settings - Server
++<h2 id="server_settings">Mail &amp; Newsgroups Account Settings – Server
+   Settings</h2>
+ 
+ <p>&brandShortName; Mail &amp; Newsgroups can work with two types of mail
+   servers: IMAP and POP. If you are not sure which server type your Internet
+   service provider supports, ask your service provider. If your Internet
+   service provider supports both, the following descriptions may help you
+   choose which one to use.</p>
+ 
+@@ -498,17 +498,17 @@
+     likely you might receive messages in which the text encoding (MIME charset
+     parameter) is not indicated, such as when reading messages in international
+     newsgroups.</li>
+ </ul>
+ 
+ <p>[<a href="#mail_and_newsgroups_account_settings">Return to beginning of
+   section</a>]</p>
+ 
+-<h2 id="copies_and_folders">Mail &amp; Newsgroups Account Settings - Copies
++<h2 id="copies_and_folders">Mail &amp; Newsgroups Account Settings – Copies
+   &amp; Folders</h2>
+ 
+ <p>This section describes the settings for sending automatic copies, for
+   storing copies of outgoing messages, for storing draft messages and message
+   templates, and where to move archived messages.</p>
+ 
+ <p>By default, &brandShortName; Mail &amp; Newsgroups stores copies of your
+   outgoing messages in the Sent folder for the current account.
+@@ -571,17 +571,17 @@
+     dialog box will appear when you save a draft or template to remind you
+     where &brandShortName; Mail &amp; Newsgroups is saving the draft or
+     template.</li>
+ </ul>
+ 
+ <p>[<a href="#mail_and_newsgroups_account_settings">Return to beginning of
+   section</a>]</p>
+ 
+-<h2 id="addressing">Mail &amp; Newsgroups Account Settings - Composition &amp;
++<h2 id="addressing">Mail &amp; Newsgroups Account Settings – Composition &amp;
+   Addressing</h2>
+ 
+ <p>You use Composition settings to choose how to format text, handle replies,
+   and how a signature you defined is included.</p>
+ 
+ <p>If you are not already viewing the Composition settings, begin from the Mail
+   window:</p>
+ 
+@@ -598,18 +598,18 @@
+     unchecked to use the plain-text editor by default. HTML messages can
+     include formatted text, links, images, and tables, just like a web page.
+     However, some recipients may not be able to receive HTML messages.
+ 
+     <p><strong>Tip</strong>: If you only want to use an editor occasionally,
+       you can hold down the Shift key while clicking the Compose or the Reply
+       button to switch to the non-default on an as-needed basis.</p>
+   </li>
+-  <li><strong>Automatically quote the original message when replying</strong>: 
+-    Select this to include the original message text in your reply. Use the 
++  <li><strong>Automatically quote the original message when replying</strong>:
++    Select this to include the original message text in your reply. Use the
+     drop-down list to select if the cursor should be positioned below or above
+     the quoted text. You can also choose the quoting to be automatically
+     selected.
+     <ul>
+       <li><strong>and place my signature</strong>: This drop-down list lets you
+         choose where you want your signature to be placed. It&apos;s only
+         applicable if you decided to <a href="#account_settings">attach a
+         signature</a> and to place the cursor above the quoted text.</li>
+@@ -861,23 +861,23 @@
+   deleted</strong>:</p>
+ 
+ <ul>
+   <li><strong>Don't delete any messages</strong>: Keep all messages. Never
+     delete messages automatically based on their age.</li>
+   <li><strong>Delete all but the most recent [__] messages</strong>: Enter the
+     number of messages to keep. With this setting only messages older than these
+     messages are deleted.</li>
+-  <li><strong>Delete messages more than [__] days old </strong>:
++  <li><strong>Delete messages more than [__] days old</strong>:
+     Keep all messages that arrived within the given number of days.</li>
+ </ul>
+ 
+ <p>With the following settings you can further constrain the three options to
+   delete messages automatically. This is especially useful in combination with
+-  the option to keep all messages.</p> 
++  the option to keep all messages.</p>
+ 
+ <ul>
+   <li><strong>Always keep flagged messages</strong>: Use this option to deny
+     &brandShortName; to delete any messages you have flagged.</li>
+   <li><strong>Remove bodies from message more than [__] days old</strong>:
+     Select this option to retain all headers but to delete message bodies that
+     are older than the number of days you specify here (news accounts only).
+     Any option to delete the entire message based on age still applies.</li>
+@@ -888,34 +888,34 @@
+ 
+ <p><strong>Note:</strong> If message synchronization is enabled (for IMAP), or
+   messages are left on the server (for POP accounts), the settings apply to
+   <em>both</em> local copies and their originals on the server.</p>
+ 
+ <p>[<a href="#mail_and_newsgroups_account_settings">Return to beginning of
+   section</a>]</p>
+ 
+-<h2 id="junk_settings">Mail &amp; Newsgroups Account Settings - Junk
++<h2 id="junk_settings">Mail &amp; Newsgroups Account Settings – Junk
+   Settings</h2>
+-  
++
+ <p>This section describes how to use the account junk settings. If
+   you are not currently viewing the Junk Settings, follow these steps:</p>
+ 
+ <ol>
+   <li>Open the Edit menu, and choose Mail &amp; Newsgroups Account Settings.
+     You see the Mail &amp; Newsgroups Account Settings dialog box.</li>
+   <li>Click the Junk Settings category for your mail account.</li>
+ </ol>
+ 
+ <p>You use the Junk Settings panel to define your account-specific settings
+   for the adaptive mail filter. Global junk settings are changed under
+   <a href="mailnews_preferences.xhtml#junk_and_suspect_preferences">Mail &amp;
+-  Newsgroups Preferences - Junk &amp; Suspect Mail</a>.</p>
+-  
+-<ul>  
++  Newsgroups Preferences – Junk &amp; Suspect Mail</a>.</p>
++
++<ul>
+   <li><strong>Enable adaptive junk mail controls for this account</strong>:
+     Toggle this option to activate or deactivate junk mail classification.</li>
+   <li><strong>Do not mark mail as junk if the sender is in [the address
+     book chosen from all your address books available in the drop down
+     box]</strong>:
+     Choose this option to prevent messages from people you know inadvertently
+     classified as junk mail.</li>
+   <li><strong>Trust junk mail headers set by [an external junk filter
+@@ -935,17 +935,17 @@
+         old junk messages after a grace period.</li>
+     </ul>
+   </li>
+ </ul>
+ 
+ <p>[<a href="#mail_and_newsgroups_account_settings">Return to beginning of
+   section</a>]</p>
+ 
+-<h2 id="return_receipts">Mail &amp; Newsgroups Account Settings - Return
++<h2 id="return_receipts">Mail &amp; Newsgroups Account Settings – Return
+   Receipts</h2>
+ 
+ <p>This section describes how to use the Return Receipts account settings. If
+   you are not currently viewing the Return Receipts settings, follow these
+   steps:</p>
+ 
+ <ol>
+   <li>Open the Edit menu, and choose Mail &amp; Newsgroups Account Settings.
+@@ -953,24 +953,24 @@
+   <li>Click the Return Receipts category for your mail account.</li>
+ </ol>
+ 
+ <p>You use the Return Receipts settings to define return receipt settings for
+   outgoing messages from this mail account. You also use the Return Receipt
+   settings to specify how to manage requests you receive for return receipts.
+   These settings override global return receipt preferences you specified using
+   <a href="mailnews_preferences.xhtml#return_receipts_preferences">Mail &amp;
+-  Newsgroups Preferences - Return Receipts</a>.</p>
++  Newsgroups Preferences – Return Receipts</a>.</p>
+ 
+ <ul>
+   <li><strong>Use my global return receipt preferences for this
+     account</strong>: By default, this account uses the return receipt
+     preferences specified by <a
+     href="mailnews_preferences.xhtml#return_receipts_preferences">Mail &amp;
+-    Newsgroups Preferences - Return Receipts</a>.</li>
++    Newsgroups Preferences – Return Receipts</a>.</li>
+   <li><strong>Customize return receipts for this account</strong>: Lets you
+     change the return receipt preferences for this account.
+     <ul>
+       <li><strong>When sending messages, always request a return
+         receipt</strong>: Enables automatic return receipt requests for all
+         outgoing messages from this mail account.</li>
+       <li><strong>Leave it in my Inbox</strong>: Return receipt
+         confirmation messages are delivered to the Inbox for this account.
+@@ -992,17 +992,17 @@
+         you want to respond to requests you receive for return receipts.</li>
+     </ul>
+   </li>
+ </ul>
+ 
+ <p>[<a href="#mail_and_newsgroups_account_settings">Return to beginning of
+   section</a>]</p>
+ 
+-<h2 id="security">Mail &amp; Newsgroups Account Settings - Security</h2>
++<h2 id="security">Mail &amp; Newsgroups Account Settings – Security</h2>
+ 
+ <p>This section describes how to configure the Mail &amp; Newsgroups Account
+   Settings that control mail message security. Before you do so, however, you
+   must obtain one or more mail certificates. For details, see
+   <a href="mailnews_security.xhtml">Signing &amp; Encrypting
+   Messages</a>.</p>
+ 
+ <p>If you are not already viewing the Security settings for your mail account,
+@@ -1097,17 +1097,17 @@
+   Compose window, click the arrow below the Security icon near the top of the
+   window and choose the encryption setting you want. For details, see <a
+   href="mailnews_security.xhtml#signing_and_encrypting_a_new_message">Signing
+   &amp; Encrypting a New Message.</a></p>
+ 
+ <p>[<a href="#mail_and_newsgroups_account_settings">Return to beginning of
+   section</a>]</p>
+ 
+-<h2 id="local_folders">Mail &amp; Newsgroups Account Settings - Local
++<h2 id="local_folders">Mail &amp; Newsgroups Account Settings – Local
+   Folders</h2>
+ 
+ <p>Local Folders is the account where &brandShortName; Mail &amp; Newsgroups
+   saves any messages that you send while working offline. Messages you send
+   while working offline are saved in the Unsent Messages folder under Local
+   Folders. Any folders you create under the Local Folders account reside on
+   your hard disk, so Local Folders is a good place to save messages that you
+   want to keep.</p>
+@@ -1126,17 +1126,17 @@
+     account.</li>
+   <li><strong>Local directory</strong>: The location on your hard disk where
+     mail for this account is stored.</li>
+ </ul>
+ 
+ <p>[<a href="#mail_and_newsgroups_account_settings">Return to beginning
+   of section</a>]</p>
+ 
+-<h2 id="outgoing_server">Mail &amp; Newsgroups Account Settings - Outgoing
++<h2 id="outgoing_server">Mail &amp; Newsgroups Account Settings – Outgoing
+   Server (SMTP)</h2>
+ 
+ <p>The outgoing server will transport your outgoing mail to the intended
+   recipients.</p>
+ 
+ <p>If you are not already viewing the Outgoing Server (SMTP) settings, begin
+   from the Mail window:</p>
+ 

+ 753 - 0
comm-central/patches/1794276-jsheaders-mailnews-25315.patch

@@ -0,0 +1,753 @@
+# HG changeset patch
+# User Frank-Rainer Grahl <frgrahl@gmx.net>
+# Date 1664201045 -7200
+# Parent  0603b7198fc802995c6b837c471c108a9efc2001
+Bug 1794276 - Fix headers in js files. suite/mailnews part. r=IanN
+
+diff --git a/suite/mailnews/components/addrbook/content/abCardOverlay.js b/suite/mailnews/components/addrbook/content/abCardOverlay.js
+--- a/suite/mailnews/components/addrbook/content/abCardOverlay.js
++++ b/suite/mailnews/components/addrbook/content/abCardOverlay.js
+@@ -1,9 +1,9 @@
+-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ const kNonVcardFields =
+         ["NickNameContainer", "SecondaryEmailContainer", "ScreenNameContainer",
+          "customFields", "preferDisplayName"];
+ 
+diff --git a/suite/mailnews/components/addrbook/content/abCardViewOverlay.js b/suite/mailnews/components/addrbook/content/abCardViewOverlay.js
+--- a/suite/mailnews/components/addrbook/content/abCardViewOverlay.js
++++ b/suite/mailnews/components/addrbook/content/abCardViewOverlay.js
+@@ -1,10 +1,10 @@
+-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+- * This Source Code Form is subject to the terms of the Mozilla Public
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
++/* 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/. */
+ 
+ //NOTE: gAddressBookBundle must be defined and set or this Overlay won't work
+ 
+ var gMapItURLFormat;
+ 
+ var gPhotoDisplayHandlers = {};
+diff --git a/suite/mailnews/components/addrbook/content/abCommon.js b/suite/mailnews/components/addrbook/content/abCommon.js
+--- a/suite/mailnews/components/addrbook/content/abCommon.js
++++ b/suite/mailnews/components/addrbook/content/abCommon.js
+@@ -1,13 +1,13 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+-
+ const { IOUtils } = ChromeUtils.import("resource:///modules/IOUtils.js");
+ const { MailServices } =
+   ChromeUtils.import("resource:///modules/MailServices.jsm");
+ const { FileUtils } =
+   ChromeUtils.import("resource://gre/modules/FileUtils.jsm");
+ const { PrivateBrowsingUtils } =
+   ChromeUtils.import("resource://gre/modules/PrivateBrowsingUtils.jsm");
+ const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+diff --git a/suite/mailnews/components/addrbook/content/abSelectAddressesDialog.js b/suite/mailnews/components/addrbook/content/abSelectAddressesDialog.js
+--- a/suite/mailnews/components/addrbook/content/abSelectAddressesDialog.js
++++ b/suite/mailnews/components/addrbook/content/abSelectAddressesDialog.js
+@@ -1,10 +1,10 @@
+-/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+- * This Source Code Form is subject to the terms of the Mozilla Public
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
++/* 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/. */
+ 
+ const {encodeABTermValue, getModelQuery} = ChromeUtils.import("resource:///modules/ABQueryUtils.jsm");
+ 
+ var addressbook = 0;
+ var composeWindow = 0;
+ var msgCompFields = 0;
+diff --git a/suite/mailnews/components/addrbook/content/abTrees.js b/suite/mailnews/components/addrbook/content/abTrees.js
+--- a/suite/mailnews/components/addrbook/content/abTrees.js
++++ b/suite/mailnews/components/addrbook/content/abTrees.js
+@@ -1,8 +1,9 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ /**
+  * This file contains our implementation for various addressbook trees.  It
+  * depends on jsTreeView.js being loaded before this script is loaded.
+  */
+diff --git a/suite/mailnews/components/addrbook/content/addressbook-panel.js b/suite/mailnews/components/addrbook/content/addressbook-panel.js
+--- a/suite/mailnews/components/addrbook/content/addressbook-panel.js
++++ b/suite/mailnews/components/addrbook/content/addressbook-panel.js
+@@ -1,8 +1,9 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ var gIsMsgCompose = false;
+ 
+ function GetAbViewListener()
+ {
+diff --git a/suite/mailnews/components/addrbook/content/addressbook.js b/suite/mailnews/components/addrbook/content/addressbook.js
+--- a/suite/mailnews/components/addrbook/content/addressbook.js
++++ b/suite/mailnews/components/addrbook/content/addressbook.js
+@@ -1,8 +1,9 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ const {encodeABTermValue, getModelQuery} = ChromeUtils.import("resource:///modules/ABQueryUtils.jsm");
+ const {MailServices} = ChromeUtils.import("resource:///modules/MailServices.jsm");
+ const {PluralForm} = ChromeUtils.import("resource://gre/modules/PluralForm.jsm");
+ var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
+diff --git a/suite/mailnews/components/addrbook/content/prefs/pref-addressing.js b/suite/mailnews/components/addrbook/content/prefs/pref-addressing.js
+--- a/suite/mailnews/components/addrbook/content/prefs/pref-addressing.js
++++ b/suite/mailnews/components/addrbook/content/prefs/pref-addressing.js
+@@ -1,9 +1,9 @@
+-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ function Startup()
+ {
+   enableAutocomplete();
+ }
+diff --git a/suite/mailnews/components/calendar/content/suite-overlay-sidebar.js b/suite/mailnews/components/calendar/content/suite-overlay-sidebar.js
+--- a/suite/mailnews/components/calendar/content/suite-overlay-sidebar.js
++++ b/suite/mailnews/components/calendar/content/suite-overlay-sidebar.js
+@@ -1,11 +1,12 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
++ * 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/. */
+ 
+ /* import-globals-from ../../../suite/base/content/utilityOverlay.js */
+ 
+ var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+ 
+ var ltnSuiteUtils = {
+   addStartupObserver: function() {
+     Services.obs.addObserver(this.startupObserver, "lightning-startup-done");
+diff --git a/suite/mailnews/components/compose/content/MsgComposeCommands.js b/suite/mailnews/components/compose/content/MsgComposeCommands.js
+--- a/suite/mailnews/components/compose/content/MsgComposeCommands.js
++++ b/suite/mailnews/components/compose/content/MsgComposeCommands.js
+@@ -1,10 +1,10 @@
+-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+- * This Source Code Form is subject to the terms of the Mozilla Public
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
++/* 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/. */
+ 
+ var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
+ var {AppConstants} = ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
+ const {PluralForm} = ChromeUtils.import("resource://gre/modules/PluralForm.jsm");
+ ChromeUtils.import("resource://gre/modules/InlineSpellChecker.jsm");
+ const {FolderUtils} = ChromeUtils.import("resource:///modules/FolderUtils.jsm");
+diff --git a/suite/mailnews/components/compose/content/addressingWidgetOverlay.js b/suite/mailnews/components/compose/content/addressingWidgetOverlay.js
+--- a/suite/mailnews/components/compose/content/addressingWidgetOverlay.js
++++ b/suite/mailnews/components/compose/content/addressingWidgetOverlay.js
+@@ -1,8 +1,9 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ const {MailServices} = ChromeUtils.import("resource:///modules/MailServices.jsm");
+ 
+ top.MAX_RECIPIENTS = 1; /* for the initial listitem created in the XUL */
+ 
+diff --git a/suite/mailnews/components/compose/content/prefs/pref-composing_messages.js b/suite/mailnews/components/compose/content/prefs/pref-composing_messages.js
+--- a/suite/mailnews/components/compose/content/prefs/pref-composing_messages.js
++++ b/suite/mailnews/components/compose/content/prefs/pref-composing_messages.js
+@@ -1,8 +1,9 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ function Startup() {
+   let value = document.getElementById("mail.compose.autosave").value;
+   EnableElementById("autoSaveInterval", value, false);
+ }
+diff --git a/suite/mailnews/components/compose/content/prefs/pref-formatting.js b/suite/mailnews/components/compose/content/prefs/pref-formatting.js
+--- a/suite/mailnews/components/compose/content/prefs/pref-formatting.js
++++ b/suite/mailnews/components/compose/content/prefs/pref-formatting.js
+@@ -1,10 +1,10 @@
+-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+- * This Source Code Form is subject to the terms of the Mozilla Public
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
++/* 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/. */
+ 
+ var gListbox;
+ var gPref;
+ var gError;
+ 
+ function Startup()
+diff --git a/suite/mailnews/components/prefs/content/pref-junk.js b/suite/mailnews/components/prefs/content/pref-junk.js
+--- a/suite/mailnews/components/prefs/content/pref-junk.js
++++ b/suite/mailnews/components/prefs/content/pref-junk.js
+@@ -1,8 +1,9 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ var { MailServices } = ChromeUtils.import(
+   "resource:///modules/MailServices.jsm"
+ );
+ 
+diff --git a/suite/mailnews/components/prefs/content/pref-mailnews.js b/suite/mailnews/components/prefs/content/pref-mailnews.js
+--- a/suite/mailnews/components/prefs/content/pref-mailnews.js
++++ b/suite/mailnews/components/prefs/content/pref-mailnews.js
+@@ -1,9 +1,9 @@
+-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ function Startup()
+ {
+   startPageCheck();
+ }
+diff --git a/suite/mailnews/components/prefs/content/pref-notifications.js b/suite/mailnews/components/prefs/content/pref-notifications.js
+--- a/suite/mailnews/components/prefs/content/pref-notifications.js
++++ b/suite/mailnews/components/prefs/content/pref-notifications.js
+@@ -1,8 +1,9 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ // The contents of this file will be loaded into the scope of the object
+ // <prefpane id="notifications_pane">!
+ 
+ var {AppConstants} = ChromeUtils.import(
+diff --git a/suite/mailnews/components/prefs/content/pref-offline.js b/suite/mailnews/components/prefs/content/pref-offline.js
+--- a/suite/mailnews/components/prefs/content/pref-offline.js
++++ b/suite/mailnews/components/prefs/content/pref-offline.js
+@@ -1,8 +1,9 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ // The contents of this file will be loaded into the scope of the object
+ // <prefpane id="offline_pane">!
+ 
+ function Startup()
+diff --git a/suite/mailnews/components/prefs/content/pref-receipts.js b/suite/mailnews/components/prefs/content/pref-receipts.js
+--- a/suite/mailnews/components/prefs/content/pref-receipts.js
++++ b/suite/mailnews/components/prefs/content/pref-receipts.js
+@@ -1,8 +1,9 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ var gNotInToCcLabel;
+ var gOutsideDomainLabel;
+ var gOtherCasesLabel;
+ 
+diff --git a/suite/mailnews/components/prefs/content/pref-tags.js b/suite/mailnews/components/prefs/content/pref-tags.js
+--- a/suite/mailnews/components/prefs/content/pref-tags.js
++++ b/suite/mailnews/components/prefs/content/pref-tags.js
+@@ -1,8 +1,9 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ var { MailServices } = ChromeUtils.import(
+   "resource:///modules/MailServices.jsm"
+ );
+ 
+diff --git a/suite/mailnews/components/prefs/content/pref-viewing_messages.js b/suite/mailnews/components/prefs/content/pref-viewing_messages.js
+--- a/suite/mailnews/components/prefs/content/pref-viewing_messages.js
++++ b/suite/mailnews/components/prefs/content/pref-viewing_messages.js
+@@ -1,9 +1,9 @@
+-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ // The contents of this file will be loaded into the scope of the object
+ // <prefpane id="viewing_messages_pane">!
+ 
+ function Startup()
+diff --git a/suite/mailnews/components/smime/content/msgCompSMIMEOverlay.js b/suite/mailnews/components/smime/content/msgCompSMIMEOverlay.js
+--- a/suite/mailnews/components/smime/content/msgCompSMIMEOverlay.js
++++ b/suite/mailnews/components/smime/content/msgCompSMIMEOverlay.js
+@@ -1,10 +1,10 @@
+-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+- * This Source Code Form is subject to the terms of the Mozilla Public
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
++/* 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/. */
+ 
+ var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
+ 
+ // Account encryption policy values:
+ // const kEncryptionPolicy_Never = 0;
+ // 'IfPossible' was used by ns4.
+diff --git a/suite/mailnews/components/smime/content/msgHdrViewSMIMEOverlay.js b/suite/mailnews/components/smime/content/msgHdrViewSMIMEOverlay.js
+--- a/suite/mailnews/components/smime/content/msgHdrViewSMIMEOverlay.js
++++ b/suite/mailnews/components/smime/content/msgHdrViewSMIMEOverlay.js
+@@ -1,10 +1,10 @@
+-/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+- * This Source Code Form is subject to the terms of the Mozilla Public
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
++/* 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/. */
+ 
+ var gSignedUINode = null;
+ var gEncryptedUINode = null;
+ var gSMIMEContainer = null;
+ var gStatusBar = null;
+ var gSignedStatusPanel = null;
+diff --git a/suite/mailnews/content/ABSearchDialog.js b/suite/mailnews/content/ABSearchDialog.js
+--- a/suite/mailnews/content/ABSearchDialog.js
++++ b/suite/mailnews/content/ABSearchDialog.js
+@@ -1,8 +1,9 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ const {encodeABTermValue} = ChromeUtils.import("resource:///modules/ABQueryUtils.jsm");
+ const {MailServices} = ChromeUtils.import("resource:///modules/MailServices.jsm");
+ const {PluralForm} = ChromeUtils.import("resource://gre/modules/PluralForm.jsm");
+ 
+diff --git a/suite/mailnews/content/FilterListDialog.js b/suite/mailnews/content/FilterListDialog.js
+--- a/suite/mailnews/content/FilterListDialog.js
++++ b/suite/mailnews/content/FilterListDialog.js
+@@ -1,10 +1,10 @@
+-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+- * This Source Code Form is subject to the terms of the Mozilla Public
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
++/* 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/. */
+ 
+ const { PluralForm } = ChromeUtils.import("resource://gre/modules/PluralForm.jsm");
+ var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
+ const {MailServices} = ChromeUtils.import("resource:///modules/MailServices.jsm");
+ 
+ var gEditButton;
+diff --git a/suite/mailnews/content/SearchDialog.js b/suite/mailnews/content/SearchDialog.js
+--- a/suite/mailnews/content/SearchDialog.js
++++ b/suite/mailnews/content/SearchDialog.js
+@@ -1,9 +1,9 @@
+-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ const { MailUtils } = ChromeUtils.import("resource:///modules/MailUtils.js");
+ const {PluralForm} = ChromeUtils.import("resource://gre/modules/PluralForm.jsm");
+ 
+ var searchSessionContractID = "@mozilla.org/messenger/searchSession;1";
+diff --git a/suite/mailnews/content/browserRequest.js b/suite/mailnews/content/browserRequest.js
+--- a/suite/mailnews/content/browserRequest.js
++++ b/suite/mailnews/content/browserRequest.js
+@@ -1,11 +1,12 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
++ * 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/. */
+ 
+ const wpl = Ci.nsIWebProgressListener;
+ 
+ var reporterListener = {
+   _isBusy: false,
+   get securityButton() {
+     delete this.securityButton;
+     return this.securityButton = document.getElementById("security-button");
+diff --git a/suite/mailnews/content/commandglue.js b/suite/mailnews/content/commandglue.js
+--- a/suite/mailnews/content/commandglue.js
++++ b/suite/mailnews/content/commandglue.js
+@@ -1,14 +1,13 @@
+-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+-
+ /*
+  * Command-specific code. This stuff should be called by the widgets
+  */
+  
+ var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+ const { MailUtils } = ChromeUtils.import("resource:///modules/MailUtils.js");
+ var { MailServices } = ChromeUtils.import(
+   "resource:///modules/MailServices.jsm"
+diff --git a/suite/mailnews/content/folderDisplay.js b/suite/mailnews/content/folderDisplay.js
+--- a/suite/mailnews/content/folderDisplay.js
++++ b/suite/mailnews/content/folderDisplay.js
+@@ -1,8 +1,9 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ var gFolderDisplay =
+ {
+   get selectedCount()
+   {
+diff --git a/suite/mailnews/content/folderPane.js b/suite/mailnews/content/folderPane.js
+--- a/suite/mailnews/content/folderPane.js
++++ b/suite/mailnews/content/folderPane.js
+@@ -1,8 +1,9 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ // Implements a tree of folders. It shows icons depending on folder type
+ // and other fancy styling.
+ // This is used in the main folder pane, but also some dialogs that need
+ // to show a nice list of folders.
+diff --git a/suite/mailnews/content/mail-offline.js b/suite/mailnews/content/mail-offline.js
+--- a/suite/mailnews/content/mail-offline.js
++++ b/suite/mailnews/content/mail-offline.js
+@@ -1,10 +1,10 @@
+-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+- * This Source Code Form is subject to the terms of the Mozilla Public
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
++/* 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/. */
+ 
+ var gOfflinePromptsBundle;
+ var gOfflineManager;
+ 
+ function MailOfflineStateChanged(goingOffline)
+ {
+diff --git a/suite/mailnews/content/mail3PaneWindowCommands.js b/suite/mailnews/content/mail3PaneWindowCommands.js
+--- a/suite/mailnews/content/mail3PaneWindowCommands.js
++++ b/suite/mailnews/content/mail3PaneWindowCommands.js
+@@ -1,9 +1,9 @@
+-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ /**
+  * Functionality for the main application window (aka the 3pane) usually
+  * consisting of folder pane, thread pane and message pane.
+  */
+diff --git a/suite/mailnews/content/mailCommands.js b/suite/mailnews/content/mailCommands.js
+--- a/suite/mailnews/content/mailCommands.js
++++ b/suite/mailnews/content/mailCommands.js
+@@ -1,10 +1,10 @@
+-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+- * This Source Code Form is subject to the terms of the Mozilla Public
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
++/* 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/. */
+ 
+ var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
+ const { MailUtils } = ChromeUtils.import("resource:///modules/MailUtils.js");
+ 
+ /**
+  * Get the identity that most likely is the best one to use, given the hint.
+diff --git a/suite/mailnews/content/mailContextMenus.js b/suite/mailnews/content/mailContextMenus.js
+--- a/suite/mailnews/content/mailContextMenus.js
++++ b/suite/mailnews/content/mailContextMenus.js
+@@ -1,9 +1,9 @@
+-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ const {MailServices} = ChromeUtils.import("resource:///modules/MailServices.jsm");
+ const {PluralForm} = ChromeUtils.import("resource://gre/modules/PluralForm.jsm");
+ const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
+ 
+diff --git a/suite/mailnews/content/mailOverlay.js b/suite/mailnews/content/mailOverlay.js
+--- a/suite/mailnews/content/mailOverlay.js
++++ b/suite/mailnews/content/mailOverlay.js
+@@ -1,8 +1,9 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ function openNewCardDialog()
+ {
+   window.openDialog("chrome://messenger/content/addressbook/abNewCardDialog.xul",
+                     "", "chrome,modal,resizable=no,centerscreen");
+diff --git a/suite/mailnews/content/mailTasksOverlay.js b/suite/mailnews/content/mailTasksOverlay.js
+--- a/suite/mailnews/content/mailTasksOverlay.js
++++ b/suite/mailnews/content/mailTasksOverlay.js
+@@ -1,8 +1,9 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ var { MailServices } = ChromeUtils.import(
+   "resource:///modules/MailServices.jsm"
+ );
+ 
+diff --git a/suite/mailnews/content/mailViewList.js b/suite/mailnews/content/mailViewList.js
+--- a/suite/mailnews/content/mailViewList.js
++++ b/suite/mailnews/content/mailViewList.js
+@@ -1,14 +1,13 @@
+-/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+- * This Source Code Form is subject to the terms of the Mozilla Public
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
++/* 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/. */
+ 
+-
+ var gMailListView;
+ var gListBox;
+ var gEditButton;
+ var gDeleteButton;
+ var gMailViewListController =
+ {
+   supportsCommand: function(aCommand)
+   {
+diff --git a/suite/mailnews/content/mailViewSetup.js b/suite/mailnews/content/mailViewSetup.js
+--- a/suite/mailnews/content/mailViewSetup.js
++++ b/suite/mailnews/content/mailViewSetup.js
+@@ -1,10 +1,10 @@
+-/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+- * This Source Code Form is subject to the terms of the Mozilla Public
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
++/* 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/. */
+ 
+ var nsMsgSearchScope = Ci.nsMsgSearchScope;
+ var gMailView = null;
+ 
+ var dialog;
+ 
+diff --git a/suite/mailnews/content/mailWindow.js b/suite/mailnews/content/mailWindow.js
+--- a/suite/mailnews/content/mailWindow.js
++++ b/suite/mailnews/content/mailWindow.js
+@@ -1,9 +1,9 @@
+-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+  //This file stores variables common to mail windows
+ 
+ var messenger;
+ var statusFeedback;
+diff --git a/suite/mailnews/content/mailWindowOverlay.js b/suite/mailnews/content/mailWindowOverlay.js
+--- a/suite/mailnews/content/mailWindowOverlay.js
++++ b/suite/mailnews/content/mailWindowOverlay.js
+@@ -1,10 +1,9 @@
+-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+-/* vim: set ts=2 sw=2 sts=2 et :*/
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
+ var {PluralForm} = ChromeUtils.import("resource://gre/modules/PluralForm.jsm");
+ var {FeedUtils} = ChromeUtils.import("resource:///modules/FeedUtils.jsm");
+ var { FolderUtils } = ChromeUtils.import("resource:///modules/FolderUtils.jsm");
+diff --git a/suite/mailnews/content/messageWindow.js b/suite/mailnews/content/messageWindow.js
+--- a/suite/mailnews/content/messageWindow.js
++++ b/suite/mailnews/content/messageWindow.js
+@@ -1,10 +1,10 @@
+-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+- * This Source Code Form is subject to the terms of the Mozilla Public
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
++/* 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/. */
+ 
+ const { MailUtils } = ChromeUtils.import("resource:///modules/MailUtils.js");
+ 
+ /* This is where functions related to the standalone message window are kept */
+ 
+ // from MailNewsTypes.h
+diff --git a/suite/mailnews/content/msgFolderPickerOverlay.js b/suite/mailnews/content/msgFolderPickerOverlay.js
+--- a/suite/mailnews/content/msgFolderPickerOverlay.js
++++ b/suite/mailnews/content/msgFolderPickerOverlay.js
+@@ -1,9 +1,9 @@
+-/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ var { MailUtils } = ChromeUtils.import("resource:///modules/MailUtils.jsm");
+ 
+ var gMessengerBundle;
+ 
+diff --git a/suite/mailnews/content/msgHdrViewOverlay.js b/suite/mailnews/content/msgHdrViewOverlay.js
+--- a/suite/mailnews/content/msgHdrViewOverlay.js
++++ b/suite/mailnews/content/msgHdrViewOverlay.js
+@@ -1,9 +1,9 @@
+-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ var {XPCOMUtils} = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+ var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
+ const {GlodaUtils} = ChromeUtils.import("resource:///modules/gloda/utils.js");
+ 
+diff --git a/suite/mailnews/content/msgMail3PaneWindow.js b/suite/mailnews/content/msgMail3PaneWindow.js
+--- a/suite/mailnews/content/msgMail3PaneWindow.js
++++ b/suite/mailnews/content/msgMail3PaneWindow.js
+@@ -1,9 +1,9 @@
+-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ /* This is where functions related to the 3 pane window are kept */
+ const { MailUtils } = ChromeUtils.import("resource:///modules/MailUtils.js");
+ const {msgDBCacheManager} = ChromeUtils.import("resource:///modules/msgDBCacheManager.js");
+ const {PeriodicFilterManager} = ChromeUtils.import("resource:///modules/PeriodicFilterManager.jsm");
+diff --git a/suite/mailnews/content/msgViewNavigation.js b/suite/mailnews/content/msgViewNavigation.js
+--- a/suite/mailnews/content/msgViewNavigation.js
++++ b/suite/mailnews/content/msgViewNavigation.js
+@@ -1,9 +1,9 @@
+-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ /*  This file contains the js functions necessary to implement view navigation within the 3 pane. */
+ 
+ const {FolderUtils} = ChromeUtils.import("resource:///modules/FolderUtils.jsm");
+ 
+diff --git a/suite/mailnews/content/msgViewPickerOverlay.js b/suite/mailnews/content/msgViewPickerOverlay.js
+--- a/suite/mailnews/content/msgViewPickerOverlay.js
++++ b/suite/mailnews/content/msgViewPickerOverlay.js
+@@ -1,9 +1,9 @@
+-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ // menuitem value constants
+ // tag views have kViewTagMarker + their key as value
+ const kViewItemAll         = 0;
+ const kViewItemUnread      = 1;
+diff --git a/suite/mailnews/content/nsDragAndDrop.js b/suite/mailnews/content/nsDragAndDrop.js
+--- a/suite/mailnews/content/nsDragAndDrop.js
++++ b/suite/mailnews/content/nsDragAndDrop.js
+@@ -1,10 +1,9 @@
+-// -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
+-
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ ////////////////////////////////////////////////////////////////////////
+ //
+ // USE OF THIS API FOR DRAG AND DROP IS DEPRECATED!
+ // Do not use this file for new code.
+diff --git a/suite/mailnews/content/phishingDetector.js b/suite/mailnews/content/phishingDetector.js
+--- a/suite/mailnews/content/phishingDetector.js
++++ b/suite/mailnews/content/phishingDetector.js
+@@ -1,10 +1,10 @@
+-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+- * This Source Code Form is subject to the terms of the Mozilla Public
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
++/* 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/. */
+ 
+ // Dependencies:
+ // gBrandBundle, gMessengerBundle should already be defined
+ // gatherTextUnder from utilityOverlay.js
+ 
+ ChromeUtils.import("resource:///modules/hostnameUtils.jsm");
+diff --git a/suite/mailnews/content/searchBar.js b/suite/mailnews/content/searchBar.js
+--- a/suite/mailnews/content/searchBar.js
++++ b/suite/mailnews/content/searchBar.js
+@@ -1,9 +1,9 @@
+-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ const {PluralForm} = ChromeUtils.import("resource://gre/modules/PluralForm.jsm");
+ 
+ var gSearchSession = null;
+ var gPreQuickSearchView = null;
+diff --git a/suite/mailnews/content/tabmail.js b/suite/mailnews/content/tabmail.js
+--- a/suite/mailnews/content/tabmail.js
++++ b/suite/mailnews/content/tabmail.js
+@@ -1,9 +1,9 @@
+-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ // Traditionally, mailnews tabs come in two flavours: "folder" and
+ // "message" tabs. But these modes are just mere default settings on tab
+ // creation, defining layout, URI to load, etc.
+ // The user can turn a "message" tab into a "folder" tab just by unhiding
+diff --git a/suite/mailnews/content/threadPane.js b/suite/mailnews/content/threadPane.js
+--- a/suite/mailnews/content/threadPane.js
++++ b/suite/mailnews/content/threadPane.js
+@@ -1,9 +1,9 @@
+-/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ var { AppConstants } =
+   ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
+ 
+ var gLastMessageUriToLoad = null;
+diff --git a/suite/mailnews/modules/MailUtils.js b/suite/mailnews/modules/MailUtils.js
+--- a/suite/mailnews/modules/MailUtils.js
++++ b/suite/mailnews/modules/MailUtils.js
+@@ -1,8 +1,9 @@
++/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* 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/. */
+ 
+ var EXPORTED_SYMBOLS = ["MailUtils"];
+ 
+ var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+ var { MailServices } = ChromeUtils.import(

+ 7 - 7
comm-central/patches/TOP-1611010-DOMEventListener-cc.patch

@@ -1,13 +1,13 @@
 # HG changeset patch
 # User Ian Neal <iann_cvs@blueyonder.co.uk>
 # Date 1579738200 -3600
-# Parent  3e95b3f0d9b249d0df2418a5a007adc82060fae9
+# Parent  78ac78f1907631ad3b0c32e746f3001513c308ba
 Bug 1611010 - Port |Bug 1453345 part 5 - Remove pointless JS implementaions of QI to nsIDOMEventListener| and |Bug 1453487 part 2 - Remove useless implements="nsIDOMEventListener" from XBL bindings| to SeaMonkey. r=frg
 
 diff --git a/suite/base/content/viewZoomOverlay.js b/suite/base/content/viewZoomOverlay.js
 --- a/suite/base/content/viewZoomOverlay.js
 +++ b/suite/base/content/viewZoomOverlay.js
-@@ -32,18 +32,17 @@ var FullZoom = FullZoom || {
+@@ -29,18 +29,17 @@ var FullZoom = FullZoom || {
    get siteSpecific() {
      return this._siteSpecificPref;
    },
@@ -27,8 +27,8 @@ diff --git a/suite/base/content/viewZoomOverlay.js b/suite/base/content/viewZoom
    // Initialization & Destruction
  
    init: function FullZoom_init() {
-@@ -70,17 +69,17 @@ var FullZoom = FullZoom || {
-     this.contentPrefs.removeObserverForName(this.name, this);
+@@ -67,17 +66,17 @@ var FullZoom = FullZoom || {
+     Services.contentPrefs2.removeObserverForName(this.name, this);
      window.removeEventListener("wheel", this, true);
    },
  
@@ -509,7 +509,7 @@ diff --git a/suite/mailnews/content/tabmail.xml b/suite/mailnews/content/tabmail
 diff --git a/suite/modules/WindowsPreviewPerTab.jsm b/suite/modules/WindowsPreviewPerTab.jsm
 --- a/suite/modules/WindowsPreviewPerTab.jsm
 +++ b/suite/modules/WindowsPreviewPerTab.jsm
-@@ -136,18 +136,17 @@ function PreviewController(win, tab) {
+@@ -155,18 +155,17 @@ function PreviewController(win, tab) {
    XPCOMUtils.defineLazyGetter(this, "canvasPreview", function () {
      let canvas = PageThumbs.createCanvas();
      canvas.mozOpaque = true;
@@ -529,7 +529,7 @@ diff --git a/suite/modules/WindowsPreviewPerTab.jsm b/suite/modules/WindowsPrevi
      this.tab.removeEventListener("TabAttrModified", this);
  
      // Break cycles, otherwise we end up leaking the window with everything
-@@ -314,17 +313,17 @@ PreviewController.prototype = {
+@@ -333,17 +332,17 @@ PreviewController.prototype = {
    onActivate: function () {
      this.win.tabbrowser.selectedTab = this.tab;
  
@@ -548,7 +548,7 @@ diff --git a/suite/modules/WindowsPreviewPerTab.jsm b/suite/modules/WindowsPrevi
      }
    }
  };
-@@ -479,17 +478,17 @@ TabWindow.prototype = {
+@@ -498,17 +497,17 @@ TabWindow.prototype = {
      // on it the sorting order of our local array.  To do so we must walk
      // the local array backwards, otherwise we would send move requests in the
      // wrong order. See bug 522610 for details.

+ 11 - 11
comm-central/patches/TOP-1614671-port1456035-4-and-5-61a1-cc.patch

@@ -1,13 +1,13 @@
 # HG changeset patch
 # User Ian Neal <iann_cvs@blueyonder.co.uk>
 # Date 1581435120 -3600
-# Parent  47a6153e0a0156ccc44df2e5f28ae751fa48edb5
+# Parent  e58e9d460c00174ae51748bd1acda363cd3de56c
 Bug 1614671 - Port |Bug 1456035 Part 4 - Convert callers of XPCOMUtils.generateQI to ChromeUtils.generateQI|, |Bug 1456035 Part 5 - Convert manual QueryInterface to ChromeUtils.generateQI| and |Bug 1460092 - Add ESLint rule to enforce use of ChromeUtils.generateQI| to SeaMonkey. r=frg
 
 diff --git a/suite/base/content/viewZoomOverlay.js b/suite/base/content/viewZoomOverlay.js
 --- a/suite/base/content/viewZoomOverlay.js
 +++ b/suite/base/content/viewZoomOverlay.js
-@@ -32,20 +32,20 @@ var FullZoom = FullZoom || {
+@@ -29,20 +29,20 @@ var FullZoom = FullZoom || {
    get siteSpecific() {
      return this._siteSpecificPref;
    },
@@ -777,7 +777,7 @@ diff --git a/suite/components/nsGopherProtocolStubHandler.js b/suite/components/
 diff --git a/suite/components/nsSuiteGlue.js b/suite/components/nsSuiteGlue.js
 --- a/suite/components/nsSuiteGlue.js
 +++ b/suite/components/nsSuiteGlue.js
-@@ -1534,20 +1534,20 @@ SuiteGlue.prototype = {
+@@ -1559,20 +1559,20 @@ SuiteGlue.prototype = {
      } catch (e) {
        Cu.reportError("Error displaying tab received by Sync: " + e);
      }
@@ -802,7 +802,7 @@ diff --git a/suite/components/nsSuiteGlue.js b/suite/components/nsSuiteGlue.js
   * simple permission prompts when content requests additional
   * capabilities.
   *
-@@ -1594,17 +1594,17 @@ var ContentPermissionIntegration = {
+@@ -1619,17 +1619,17 @@ var ContentPermissionIntegration = {
    },
  };
  
@@ -1656,7 +1656,7 @@ diff --git a/suite/mailnews/components/compose/content/MsgComposeCommands.js b/s
    {
      switch (command)
      {
-@@ -2912,25 +2905,18 @@ function OpenSelectedAttachment()
+@@ -2920,25 +2913,18 @@ function OpenSelectedAttachment()
  }
  
  function nsAttachmentOpener()
@@ -1687,7 +1687,7 @@ diff --git a/suite/mailnews/components/compose/content/MsgComposeCommands.js b/s
 diff --git a/suite/mailnews/components/compose/content/addressingWidgetOverlay.js b/suite/mailnews/components/compose/content/addressingWidgetOverlay.js
 --- a/suite/mailnews/components/compose/content/addressingWidgetOverlay.js
 +++ b/suite/mailnews/components/compose/content/addressingWidgetOverlay.js
-@@ -1151,16 +1151,10 @@ AutomatedAutoCompleteHandler.prototype =
+@@ -1152,16 +1152,10 @@ AutomatedAutoCompleteHandler.prototype =
  
      // that will automatically set the focus on a new available row, and make sure it is visible
      awAddRecipient(this.recipientType ? this.recipientType : "addr_to", addressToAdd);
@@ -1737,7 +1737,7 @@ diff --git a/suite/mailnews/content/SearchDialog.js b/suite/mailnews/content/Sea
 diff --git a/suite/mailnews/content/browserRequest.js b/suite/mailnews/content/browserRequest.js
 --- a/suite/mailnews/content/browserRequest.js
 +++ b/suite/mailnews/content/browserRequest.js
-@@ -6,23 +6,18 @@ const wpl = Ci.nsIWebProgressListener;
+@@ -7,23 +7,18 @@ const wpl = Ci.nsIWebProgressListener;
  
  var reporterListener = {
    _isBusy: false,
@@ -1766,7 +1766,7 @@ diff --git a/suite/mailnews/content/browserRequest.js b/suite/mailnews/content/b
 diff --git a/suite/mailnews/content/mailTasksOverlay.js b/suite/mailnews/content/mailTasksOverlay.js
 --- a/suite/mailnews/content/mailTasksOverlay.js
 +++ b/suite/mailnews/content/mailTasksOverlay.js
-@@ -222,23 +222,18 @@ nsMsgBadCertHandler.prototype = {
+@@ -223,23 +223,18 @@ nsMsgBadCertHandler.prototype = {
    },
  
    // nsIInterfaceRequestor
@@ -1852,7 +1852,7 @@ diff --git a/suite/mailnews/content/mailWindow.js b/suite/mailnews/content/mailW
 diff --git a/suite/mailnews/content/mailWindowOverlay.js b/suite/mailnews/content/mailWindowOverlay.js
 --- a/suite/mailnews/content/mailWindowOverlay.js
 +++ b/suite/mailnews/content/mailWindowOverlay.js
-@@ -1199,25 +1199,20 @@ BatchMessageMover.prototype =
+@@ -1198,25 +1198,20 @@ BatchMessageMover.prototype =
      if (aFolder.parent == this._dstFolderParent &&
          aFolder.name == this._dstFolderName) {
        this._dstFolderParent = null;
@@ -1984,7 +1984,7 @@ diff --git a/suite/mailnews/content/threadPane.js b/suite/mailnews/content/threa
 diff --git a/suite/modules/WindowsPreviewPerTab.jsm b/suite/modules/WindowsPreviewPerTab.jsm
 --- a/suite/modules/WindowsPreviewPerTab.jsm
 +++ b/suite/modules/WindowsPreviewPerTab.jsm
-@@ -136,17 +136,17 @@ function PreviewController(win, tab) {
+@@ -155,17 +155,17 @@ function PreviewController(win, tab) {
    XPCOMUtils.defineLazyGetter(this, "canvasPreview", function () {
      let canvas = PageThumbs.createCanvas();
      canvas.mozOpaque = true;
@@ -2003,7 +2003,7 @@ diff --git a/suite/modules/WindowsPreviewPerTab.jsm b/suite/modules/WindowsPrevi
      this.tab.removeEventListener("TabAttrModified", this);
  
      // Break cycles, otherwise we end up leaking the window with everything
-@@ -831,19 +831,19 @@ var AeroPeek = {
+@@ -850,19 +850,19 @@ var AeroPeek = {
            if (tab.getAttribute("image") == newValue) {
              win.onLinkIconAvailable(tab.linkedBrowser, newValue);
            }

+ 0 - 54
comm-central/patches/TOP-1684772-l10n-toml-cc.patch

@@ -1,54 +0,0 @@
-# HG changeset patch
-# User Ian Neal <iann_cvs@blueyonder.co.uk>
-# Date 1609700583 0
-# Parent  422afe48b5960cf2e2b06e9f0973fc2a2993a0b4
-Bug 1684772 - Move editor/ui into suite/editor - l10n.toml changes for older branches. r=frg
-
-diff --git a/mail/locales/l10n.toml b/mail/locales/l10n.toml
---- a/mail/locales/l10n.toml
-+++ b/mail/locales/l10n.toml
-@@ -83,20 +83,16 @@ locales = [
-     reference = "mail/locales/en-US/**"
-     l10n = "{l}mail/**"
- 
- [[paths]]
-     reference = "chat/locales/en-US/**"
-     l10n = "{l}chat/**"
- 
- [[paths]]
--    reference = "editor/ui/locales/en-US/**"
--    l10n = "{l}editor/ui/**"
--
--[[paths]]
-     reference = "other-licenses/branding/thunderbird/locales/en-US/**"
-     l10n = "{l}other-licenses/branding/thunderbird/**"
- 
- [[paths]]
-     reference = "mail/branding/thunderbird/locales/en-US/**"
-     l10n = "{l}mail/branding/thunderbird/**"
- 
- [[includes]]
-diff --git a/suite/locales/l10n.toml b/suite/locales/l10n.toml
---- a/suite/locales/l10n.toml
-+++ b/suite/locales/l10n.toml
-@@ -40,20 +40,16 @@ locales = [
-     l = "{l10n_base}/{locale}/"
-     mozilla = ".."
- 
- [[paths]]
-     reference = "suite/locales/en-US/**"
-     l10n = "{l}suite/**"
- 
- [[paths]]
--    reference = "editor/ui/locales/en-US/**"
--    l10n = "{l}editor/ui/**"
--
--[[paths]]
-     reference = "suite/branding/seamonkey/locales/en-US/**"
-     l10n = "{l}suite/branding/seamonkey/**"
- 
- [[paths]]
-     reference = "{mozilla}/services/sync/locales/en-US/**"
-     l10n = "{l}services/sync/**"
- 
- [[includes]]

+ 8 - 1
comm-central/patches/series

@@ -1,10 +1,17 @@
+1790695-decodeimageasync-25315.patch
+1392929-cc-contentprefs2-1_1-25315.patch
+1441016-port1414390-25315.patch
+1069787-spellchecker-subject-1_1-25315.patch
+1794276-jsheaders-mailnews-25315.patch
+1793291-help-25315.patch
+1792578-flushmemory-25315.patch
 9999999-port1787097-suite-bustage.patch
 9999999-port1788233-suite-bustage.patch
 9999999-windowsshell-suite-bustage.patch
+1684772-l10n-toml-suite.patch
 TOP-1642188-remove-nsDOMIEvent-cc.patch
 TOP-1611010-DOMEventListener-cc.patch
 TOP-1614671-port1456035-4-and-5-61a1-cc.patch
-TOP-1684772-l10n-toml-cc.patch
 TOP-1611647-1-rename-xul-suite.patch
 TOP-1611647-2-fix-xul-references-suite.patch
 TOP-9999999-port1646560-suite-91a1.patch