summaryrefslogtreecommitdiffstats
path: root/comm/tools
diff options
context:
space:
mode:
Diffstat (limited to 'comm/tools')
-rw-r--r--comm/tools/esmify/mach_commands.py705
-rw-r--r--comm/tools/esmify/map.json482
-rw-r--r--comm/tools/lint/Generated.txt3
-rw-r--r--comm/tools/lint/ThirdPartyPaths.txt18
-rw-r--r--comm/tools/lint/black.yml16
-rw-r--r--comm/tools/lint/codespell.yml47
-rw-r--r--comm/tools/lint/commlint/__init__.py111
-rw-r--r--comm/tools/lint/commlint/l10n_lint.py16
-rw-r--r--comm/tools/lint/eslint.yml18
-rw-r--r--comm/tools/lint/file-perm.yml55
-rw-r--r--comm/tools/lint/file-whitespace.yml27
-rw-r--r--comm/tools/lint/fluent-lint.yml18
-rw-r--r--comm/tools/lint/fluent-lint/exclusions.yml82
-rw-r--r--comm/tools/lint/l10n.yml41
-rw-r--r--comm/tools/lint/license.yml51
-rw-r--r--comm/tools/lint/lintpref.yml20
-rw-r--r--comm/tools/lint/mach_commands.py24
-rw-r--r--comm/tools/lint/mingw-capitalization.yml10
-rw-r--r--comm/tools/lint/rejected-words.yml32
-rw-r--r--comm/tools/lint/ruff.yml17
-rw-r--r--comm/tools/lint/shellcheck.yml14
-rw-r--r--comm/tools/lint/spell/exclude-list.txt28
-rw-r--r--comm/tools/lint/stylelint.yml17
-rw-r--r--comm/tools/lint/trojan-source.yml17
-rw-r--r--comm/tools/lint/yaml.yml12
25 files changed, 1881 insertions, 0 deletions
diff --git a/comm/tools/esmify/mach_commands.py b/comm/tools/esmify/mach_commands.py
new file mode 100644
index 0000000000..fb02f4982e
--- /dev/null
+++ b/comm/tools/esmify/mach_commands.py
@@ -0,0 +1,705 @@
+# 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/.
+
+import logging
+import os
+import pathlib
+import re
+import subprocess
+import sys
+
+from mach.decorators import Command, CommandArgument
+
+
+def path_sep_to_native(path_str):
+ """Make separators in the path OS native."""
+ return pathlib.os.sep.join(path_str.split("/"))
+
+
+def path_sep_from_native(path):
+ """Make separators in the path OS native."""
+ return "/".join(str(path).split(pathlib.os.sep))
+
+
+excluded_from_convert_prefix = list(
+ map(
+ path_sep_to_native,
+ [
+ # Don't modify suite/ code"
+ "suite/",
+ ],
+ )
+)
+
+
+def is_excluded_from_convert(path):
+ """Returns true if the JSM file shouldn't be converted to ESM."""
+ path_str = str(path)
+ for prefix in excluded_from_convert_prefix:
+ if path_str.startswith(prefix):
+ return True
+
+ return False
+
+
+excluded_from_imports_prefix = list(
+ map(
+ path_sep_to_native,
+ [
+ # Vendored or auto-generated files.
+ "chat/protocols/matrix/lib/",
+ "chat/protocols/xmpp/lib/",
+ # Files has macro.
+ "calendar/base/calendar.js",
+ "chat/chat-prefs.js",
+ "mail/app/profile/all-thunderbird.js",
+ "mail/branding/thunderbird/pref/thunderbird-branding.js",
+ "mail/components/compose/composer.js",
+ "mail/components/enterprisepolicies/schemas/schema.sys.mjs",
+ "mail/locales/en-US/all-l10n.js",
+ "mail/extensions/am-e2e/prefs/e2e-prefs.js",
+ "mailnews/extensions/mdn/mdn.js",
+ "mailnews/mailnews.js",
+ ],
+ )
+)
+
+EXCLUSION_FILES = [
+ os.path.join("tools", "lint", "ThirdPartyPaths.txt"),
+]
+
+MAP_JSON = os.path.abspath(os.path.join("tools", "esmify", "map.json"))
+
+
+def load_exclusion_files():
+ for path in EXCLUSION_FILES:
+ with open(path, "r") as f:
+ for line in f:
+ p = path_sep_to_native(re.sub("\*$", "", line.strip()))
+ excluded_from_imports_prefix.append(p)
+
+
+def is_excluded_from_imports(path):
+ """Returns true if the JS file content shouldn't be handled by
+ jscodeshift.
+
+ This filter is necessary because jscodeshift cannot handle some
+ syntax edge cases and results in unexpected rewrite."""
+ path_str = str(path)
+ for prefix in excluded_from_imports_prefix:
+ if path_str.startswith(prefix):
+ return True
+
+ return False
+
+
+# Wrapper for hg/git operations
+class VCSUtils:
+ def run(self, cmd):
+ # Do not pass check=True because the pattern can match no file.
+ lines = subprocess.run(cmd, stdout=subprocess.PIPE).stdout.decode()
+ return filter(lambda x: x != "", lines.split("\n"))
+
+
+class HgUtils(VCSUtils):
+ def is_available():
+ return pathlib.Path(".hg").exists()
+
+ def rename(self, before, after):
+ cmd = ["hg", "rename", before, after]
+ subprocess.run(cmd, check=True)
+
+ def find_jsms(self, path):
+ jsms = []
+
+ cmd = ["hg", "files", f"set:glob:{path}/**/*.jsm"]
+ for line in self.run(cmd):
+ jsm = pathlib.Path(line)
+ if is_excluded_from_convert(jsm):
+ continue
+ jsms.append(jsm)
+
+ cmd = [
+ "hg",
+ "files",
+ f"set:grep('EXPORTED_SYMBOLS = \[') and glob:{path}/**/*.js",
+ ]
+ for line in self.run(cmd):
+ jsm = pathlib.Path(line)
+ if is_excluded_from_convert(jsm):
+ continue
+ jsms.append(jsm)
+
+ return jsms
+
+ def find_all_jss(self, path):
+ jss = []
+
+ cmd = ["hg", "files", f"set:glob:{path}/**/*.jsm"]
+ for line in self.run(cmd):
+ js = pathlib.Path(line)
+ if is_excluded_from_imports(js) or is_excluded_from_convert(js):
+ continue
+ jss.append(js)
+
+ cmd = ["hg", "files", f"set:glob:{path}/**/*.js"]
+ for line in self.run(cmd):
+ js = pathlib.Path(line)
+ if is_excluded_from_imports(js) or is_excluded_from_convert(js):
+ continue
+ jss.append(js)
+
+ cmd = ["hg", "files", f"set:glob:{path}/**/*.mjs"]
+ for line in self.run(cmd):
+ js = pathlib.Path(line)
+ if is_excluded_from_imports(js) or is_excluded_from_convert(js):
+ continue
+ jss.append(js)
+
+ return jss
+
+
+class Summary:
+ def __init__(self):
+ self.convert_errors = []
+ self.import_errors = []
+ self.rename_errors = []
+ self.no_refs = []
+
+
+@Command(
+ "tb-esmify",
+ category="thunderbird",
+ description="ESMify JSM files (comm-central variant)",
+)
+@CommandArgument(
+ "path",
+ nargs=1,
+ help="Path to the JSM file to ESMify, or the directory that contains "
+ "JSM files and/or JS files that imports ESM-ified JSM. This path is relative"
+ "to your current directory, $topsrcdir/comm",
+)
+@CommandArgument(
+ "--convert",
+ action="store_true",
+ help="Only perform the step 1 = convert part",
+)
+@CommandArgument(
+ "--imports",
+ action="store_true",
+ help="Only perform the step 2 = import calls part",
+)
+@CommandArgument(
+ "--upstream-imports",
+ action="store_true",
+ help="Perform step 2, import calls, but for converted JSMs in mozilla-central",
+)
+@CommandArgument(
+ "--prefix",
+ default="",
+ help="Restrict the target of import in the step 2 to ESM-ified JSM, by the "
+ "prefix match for the JSM file's path. This path is relative to $topsrcdir, "
+ "not your current directory. e.g. --prefix=comm/mail/ or --prefix=toolkit/",
+)
+def tb_esmify(
+ command_context,
+ path=None,
+ convert=False,
+ imports=False,
+ upstream_imports=False,
+ prefix="",
+):
+ """
+ This command does the following 2 steps:
+ 1. Convert the JSM file specified by `path` to ESM file, or the JSM files
+ inside the directory specified by `path` to ESM files, and also
+ fix references in build files and test definitions
+ 2. Convert import calls inside file(s) specified by `path` for ESM-ified
+ files to use new APIs
+
+ Note: When performing import rewrites, when using --imports for comm-central
+ modules, you will see "Unknown module" WARNING messages referring to modules
+ from mozilla-central.
+ When using --upstream-imports for migrated modules from mozilla-central,
+ you will see "Unknown module" WARNINGs referring to modules from
+ comm-central. This is expected, and not a problem.
+
+ Example 1:
+ # Convert all JSM files inside `mail/components/customizableui` directory,
+ # and replace all references for ESM-ified files in the entire tree to use
+ # new APIs
+
+ $ ../mach tb-esmify --convert mail/components/customizableui
+ $ ../mach tb-esmify --imports . --prefix=comm/mail/components/customizableui
+
+ Example 2:
+ # Convert all JSM files inside `mail` directory, and replace all
+ # references for the JSM files inside `mail` directory to use
+ # new APIs
+
+ $ ../mach tb-esmify mail
+
+ Example 3:
+ # Replace references for ESM-ified files from toolkit/ in calendar/
+
+ $ ../mach tb-esmify --upstream-imports --prefix=toolkit/ calendar/
+ """
+
+ def error(text):
+ command_context.log(logging.ERROR, "tb-esmify", {}, f"[ERROR] {text}")
+
+ def warn(text):
+ command_context.log(logging.WARN, "tb-esmify", {}, f"[WARN] {text}")
+
+ def info(text):
+ command_context.log(logging.INFO, "tb-esmify", {}, f"[INFO] {text}")
+
+ if upstream_imports:
+ imports = True
+ assert not convert, "Cannot use --convert with --upstream-imports"
+
+ # If no options is specified, perform both.
+ if not convert and not imports:
+ convert = True
+ imports = True
+
+ path = pathlib.Path(path[0])
+
+ if not verify_path(command_context, path):
+ return 1
+
+ if HgUtils.is_available():
+ vcs_utils = HgUtils()
+ else:
+ error(
+ "This script needs to be run inside mozilla-central + comm-central "
+ "checkout of mercurial. "
+ )
+ return 1
+
+ load_exclusion_files()
+
+ info("Setting up jscodeshift...")
+ setup_jscodeshift()
+
+ is_single_file = path.is_file()
+
+ modified_files = []
+ summary = Summary()
+
+ if convert:
+ info("Searching files to convert to ESM...")
+ if is_single_file:
+ jsms = [path]
+ else:
+ jsms = vcs_utils.find_jsms(path)
+
+ info(f"Found {len(jsms)} file(s) to convert to ESM.")
+
+ info("Converting to ESM...")
+ jsms = convert_module(jsms, summary)
+ if jsms is None:
+ error("Failed to rewrite exports.")
+ return 1
+
+ info("Renaming...")
+ esms = rename_jsms(command_context, vcs_utils, jsms, summary)
+
+ modified_files += esms
+
+ if imports:
+ info("Searching files to rewrite imports...")
+
+ if is_single_file:
+ if convert:
+ # Already converted above
+ jss = esms
+ else:
+ jss = [path]
+ else:
+ jss = vcs_utils.find_all_jss(path)
+
+ info(f"Found {len(jss)} file(s). Rewriting imports...")
+
+ result = rewrite_imports(jss, prefix, summary, upstream_imports)
+ if result is None:
+ return 1
+
+ info(f"Rewritten {len(result)} file(s).")
+
+ # Only modified files needs eslint fix
+ modified_files += result
+
+ modified_files = list(set(modified_files))
+
+ info(f"Applying eslint --fix for {len(modified_files)} file(s)...")
+ eslint_fix(command_context, modified_files)
+
+ def print_files(f, errors):
+ for [path, message] in errors:
+ f(f" * {path}")
+ if message:
+ f(f" {message}")
+
+ if len(summary.convert_errors):
+ error("========")
+ error("Following files are not converted into ESM due to error:")
+ print_files(error, summary.convert_errors)
+
+ if len(summary.import_errors):
+ warn("========")
+ warn("Following files are not rewritten to import ESMs due to error:")
+ warn(
+ "(NOTE: Errors related to 'private names' are mostly due to "
+ " preprocessor macros in the file):"
+ )
+ print_files(warn, summary.import_errors)
+
+ if len(summary.rename_errors):
+ error("========")
+ error("Following files are not renamed due to error:")
+ print_files(error, summary.rename_errors)
+
+ if len(summary.no_refs):
+ warn("========")
+ warn("Following files are not found in any build files.")
+ warn("Please update references to those files manually:")
+ print_files(warn, summary.rename_errors)
+
+ return 0
+
+
+def verify_path(command_context, path):
+ """Check if the path passed to the command is valid relative path."""
+
+ def error(text):
+ command_context.log(logging.ERROR, "tb-esmify", {}, f"[ERROR] {text}")
+
+ if not path.exists():
+ error(f"{path} does not exist.")
+ return False
+
+ if path.is_absolute():
+ error("Path must be a relative path from comm-central checkout.")
+ return False
+
+ return True
+
+
+def find_file(path, target):
+ """Find `target` file in ancestor of path."""
+ target_path = path.parent / target
+ if not target_path.exists():
+ if path.parent == path:
+ return None
+
+ return find_file(path.parent, target)
+
+ return target_path
+
+
+def try_rename_in(command_context, path, target, jsm_name, esm_name, jsm_path):
+ """Replace the occurrences of `jsm_name` with `esm_name` in `target`
+ file."""
+
+ def info(text):
+ command_context.log(logging.INFO, "tb-esmify", {}, f"[INFO] {text}")
+
+ target_path = find_file(path, target)
+ if not target_path:
+ return False
+
+ # Single moz.build or jar.mn can contain multiple files with same name.
+ # Check the relative path.
+
+ jsm_relative_path = jsm_path.relative_to(target_path.parent)
+ jsm_relative_str = path_sep_from_native(str(jsm_relative_path))
+
+ jsm_name_re = re.compile(r"\b" + jsm_name.replace(".", r"\.") + r"\b")
+ jsm_relative_re = re.compile(r"\b" + jsm_relative_str.replace(".", r"\.") + r"\b")
+
+ modified = False
+ content = ""
+ with open(target_path, "r") as f:
+ for line in f:
+ if jsm_relative_re.search(line):
+ modified = True
+ line = jsm_name_re.sub(esm_name, line)
+
+ content += line
+
+ if modified:
+ info(f" {str(target_path)}")
+ info(f" {jsm_name} => {esm_name}")
+ with open(target_path, "w", newline="\n") as f:
+ f.write(content)
+
+ return True
+
+
+def try_rename_components_conf(command_context, path, jsm_name, esm_name):
+ """Replace the occurrences of `jsm_name` with `esm_name` in components.conf
+ file."""
+
+ def info(text):
+ command_context.log(logging.INFO, "tb-esmify", {}, f"[INFO] {text}")
+
+ target_path = find_file(path, "components.conf")
+ if not target_path:
+ return False
+
+ # Unlike try_rename_in, components.conf contains the URL instead of
+ # relative path, and also there are no known files with same name.
+ # Simply replace the filename.
+
+ with open(target_path, "r") as f:
+ content = f.read()
+
+ prop_re = re.compile("[\"']jsm[\"']:(.*)" + r"\b" + jsm_name.replace(".", r"\.") + r"\b")
+
+ if not prop_re.search(content):
+ return False
+
+ info(f" {str(target_path)}")
+ info(f" {jsm_name} => {esm_name}")
+
+ content = prop_re.sub(r"'esModule':\1" + esm_name, content)
+ with open(target_path, "w", newline="\n") as f:
+ f.write(content)
+
+ return True
+
+
+def esmify_name(name):
+ return re.sub(r"\.(jsm|js|jsm\.js)$", ".sys.mjs", name)
+
+
+def esmify_path(jsm_path):
+ jsm_name = jsm_path.name
+ esm_name = re.sub(r"\.(jsm|js|jsm\.js)$", ".sys.mjs", jsm_name)
+ esm_path = jsm_path.parent / esm_name
+ return esm_path
+
+
+def rename_single_file(command_context, vcs_utils, jsm_path, summary):
+ """Rename `jsm_path` to .sys.mjs, and fix references to the file in build and
+ test definitions."""
+
+ def info(text):
+ command_context.log(logging.INFO, "tb-esmify", {}, f"[INFO] {text}")
+
+ esm_path = esmify_path(jsm_path)
+
+ jsm_name = jsm_path.name
+ esm_name = esm_path.name
+
+ target_files = [
+ "moz.build",
+ "jar.mn",
+ "browser.ini",
+ "browser-drawBelowTitlebar.ini",
+ "browser-detachedWindows.ini",
+ "browser-drawInTitlebar.ini",
+ "browser-clear.ini",
+ "browser_rotated.ini",
+ "xpcshell.ini",
+ "xpcshell_cardDAV.ini",
+ "xpcshell-cpp.ini",
+ "xpcshell-imap.ini",
+ "xpcshell-local.ini",
+ "xpcshell_maildir-cpp.ini",
+ "xpcshell_maildir.ini",
+ "xpcshell-nntp.ini",
+ "xpcshell-shared.ini",
+ ]
+
+ info(f"{jsm_path} => {esm_path}")
+
+ renamed = False
+ for target in target_files:
+ if try_rename_in(command_context, jsm_path, target, jsm_name, esm_name, jsm_path):
+ renamed = True
+
+ if try_rename_components_conf(command_context, jsm_path, jsm_name, esm_name):
+ renamed = True
+
+ if not renamed:
+ summary.no_refs.append([jsm_path, None])
+
+ if not esm_path.exists():
+ vcs_utils.rename(jsm_path, esm_path)
+ else:
+ summary.rename_errors.append([jsm_path, f"{esm_path} already exists"])
+
+ return esm_path
+
+
+def rename_jsms(command_context, vcs_utils, jsms, summary):
+ esms = []
+ for jsm in jsms:
+ esm = rename_single_file(command_context, vcs_utils, jsm, summary)
+ esms.append(esm)
+
+ return esms
+
+
+npm_prefix = pathlib.Path("..") / "tools" / "esmify"
+path_from_npm_prefix = pathlib.Path("..") / ".." / "comm"
+
+
+def setup_jscodeshift():
+ """Install jscodeshift."""
+ cmd = [
+ sys.executable,
+ "../mach",
+ "npm",
+ "install",
+ "jscodeshift",
+ "--save-dev",
+ "--prefix",
+ str(npm_prefix),
+ ]
+ subprocess.run(cmd, check=True)
+
+
+def run_npm_command(args, env, stdin):
+ cmd = [
+ sys.executable,
+ "../mach",
+ "npm",
+ "run",
+ ] + args
+ p = subprocess.Popen(cmd, env=env, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
+ p.stdin.write(stdin)
+ p.stdin.close()
+
+ ok_files = []
+ errors = []
+ while True:
+ line = p.stdout.readline()
+ if not line:
+ break
+ line = line.rstrip().decode()
+
+ if line.startswith(" NOC "):
+ continue
+
+ print(line)
+
+ m = re.search(r"^ (OKK|ERR) ([^ ]+)(?: (.+))?", line)
+ if not m:
+ continue
+
+ result = m.group(1)
+ # NOTE: path is written from `tools/esmify`.
+ path = pathlib.Path(m.group(2)).relative_to(path_from_npm_prefix)
+ error = m.group(3)
+
+ if result == "OKK":
+ ok_files.append(path)
+
+ if result == "ERR":
+ errors.append([path, error])
+
+ if p.wait() != 0:
+ return [None, None]
+
+ return ok_files, errors
+
+
+def convert_module(jsms, summary):
+ """Replace EXPORTED_SYMBOLS with export declarations, and replace
+ ChromeUtils.importESModule with static import as much as possible,
+ and return the list of successfully rewritten files."""
+
+ if len(jsms) == 0:
+ return []
+
+ env = os.environ.copy()
+ env["ESMIFY_MAP_JSON"] = MAP_JSON
+
+ stdin = "\n".join(map(str, paths_from_npm_prefix(jsms))).encode()
+
+ ok_files, errors = run_npm_command(
+ [
+ "convert_module",
+ "--prefix",
+ str(npm_prefix),
+ ],
+ env=env,
+ stdin=stdin,
+ )
+
+ if ok_files is None and errors is None:
+ return None
+
+ summary.convert_errors.extend(errors)
+
+ return ok_files
+
+
+def rewrite_imports(jss, prefix, summary, upstream_imports=False):
+ """Replace import calls for JSM with import calls for ESM or static import
+ for ESM."""
+
+ if len(jss) == 0:
+ return []
+
+ env = os.environ.copy()
+ if not upstream_imports:
+ env["ESMIFY_MAP_JSON"] = MAP_JSON
+ env["ESMIFY_TARGET_PREFIX"] = prefix
+
+ stdin = "\n".join(map(str, paths_from_npm_prefix(jss))).encode()
+
+ ok_files, errors = run_npm_command(
+ [
+ "rewrite_imports",
+ "--prefix",
+ str(npm_prefix),
+ ],
+ env=env,
+ stdin=stdin,
+ )
+
+ if ok_files is None and errors is None:
+ return None
+
+ summary.import_errors.extend(errors)
+
+ return ok_files
+
+
+def paths_from_npm_prefix(paths):
+ """Convert relative path from mozilla-central to relative path from
+ tools/esmify."""
+ return list(map(lambda path: path_from_npm_prefix / path, paths))
+
+
+def eslint_fix(command_context, files):
+ """Auto format files."""
+
+ def info(text):
+ command_context.log(logging.INFO, "tb-esmify", {}, f"[INFO] {text}")
+
+ if len(files) == 0:
+ return
+
+ remaining = files[0:]
+
+ # There can be too many files for single command line, perform by chunk.
+ max_files = 16
+ while len(remaining) > max_files:
+ info(f"{len(remaining)} files remaining")
+
+ chunk = remaining[0:max_files]
+ remaining = remaining[max_files:]
+
+ cmd = [sys.executable, "../mach", "eslint", "--fix"] + chunk
+ subprocess.run(cmd, check=True)
+
+ info(f"{len(remaining)} files remaining")
+ chunk = remaining
+ cmd = [sys.executable, "../mach", "eslint", "--fix"] + chunk
+ subprocess.run(cmd, check=True)
diff --git a/comm/tools/esmify/map.json b/comm/tools/esmify/map.json
new file mode 100644
index 0000000000..820ad29b12
--- /dev/null
+++ b/comm/tools/esmify/map.json
@@ -0,0 +1,482 @@
+{
+ "chrome://openpgp/content/BondOpenPGP.jsm": "comm/mail/extensions/openpgp/content/BondOpenPGP.jsm",
+ "chrome://openpgp/content/modules/CollectedKeysDB.jsm": "comm/mail/extensions/openpgp/content/modules/CollectedKeysDB.jsm",
+ "chrome://openpgp/content/modules/GPGME.jsm": "comm/mail/extensions/openpgp/content/modules/GPGME.jsm",
+ "chrome://openpgp/content/modules/GPGMELib.jsm": "comm/mail/extensions/openpgp/content/modules/GPGMELib.jsm",
+ "chrome://openpgp/content/modules/OpenPGPAlias.jsm": "comm/mail/extensions/openpgp/content/modules/OpenPGPAlias.jsm",
+ "chrome://openpgp/content/modules/RNP.jsm": "comm/mail/extensions/openpgp/content/modules/RNP.jsm",
+ "chrome://openpgp/content/modules/RNPLib.jsm": "comm/mail/extensions/openpgp/content/modules/RNPLib.jsm",
+ "chrome://openpgp/content/modules/armor.jsm": "comm/mail/extensions/openpgp/content/modules/armor.jsm",
+ "chrome://openpgp/content/modules/autocrypt.jsm": "comm/mail/extensions/openpgp/content/modules/autocrypt.jsm",
+ "chrome://openpgp/content/modules/constants.jsm": "comm/mail/extensions/openpgp/content/modules/constants.jsm",
+ "chrome://openpgp/content/modules/core.jsm": "comm/mail/extensions/openpgp/content/modules/core.jsm",
+ "chrome://openpgp/content/modules/cryptoAPI.jsm": "comm/mail/extensions/openpgp/content/modules/cryptoAPI.jsm",
+ "chrome://openpgp/content/modules/cryptoAPI/GnuPGCryptoAPI.jsm": "comm/mail/extensions/openpgp/content/modules/cryptoAPI/GnuPGCryptoAPI.jsm",
+ "chrome://openpgp/content/modules/cryptoAPI/RNPCryptoAPI.jsm": "comm/mail/extensions/openpgp/content/modules/cryptoAPI/RNPCryptoAPI.jsm",
+ "chrome://openpgp/content/modules/data.jsm": "comm/mail/extensions/openpgp/content/modules/data.jsm",
+ "chrome://openpgp/content/modules/decryption.jsm": "comm/mail/extensions/openpgp/content/modules/decryption.jsm",
+ "chrome://openpgp/content/modules/dialog.jsm": "comm/mail/extensions/openpgp/content/modules/dialog.jsm",
+ "chrome://openpgp/content/modules/encryption.jsm": "comm/mail/extensions/openpgp/content/modules/encryption.jsm",
+ "chrome://openpgp/content/modules/filters.jsm": "comm/mail/extensions/openpgp/content/modules/filters.jsm",
+ "chrome://openpgp/content/modules/fixExchangeMsg.jsm": "comm/mail/extensions/openpgp/content/modules/fixExchangeMsg.jsm",
+ "chrome://openpgp/content/modules/funcs.jsm": "comm/mail/extensions/openpgp/content/modules/funcs.jsm",
+ "chrome://openpgp/content/modules/key.jsm": "comm/mail/extensions/openpgp/content/modules/key.jsm",
+ "chrome://openpgp/content/modules/keyLookupHelper.jsm": "comm/mail/extensions/openpgp/content/modules/keyLookupHelper.jsm",
+ "chrome://openpgp/content/modules/keyObj.jsm": "comm/mail/extensions/openpgp/content/modules/keyObj.jsm",
+ "chrome://openpgp/content/modules/keyRing.jsm": "comm/mail/extensions/openpgp/content/modules/keyRing.jsm",
+ "chrome://openpgp/content/modules/keyserver.jsm": "comm/mail/extensions/openpgp/content/modules/keyserver.jsm",
+ "chrome://openpgp/content/modules/keyserverUris.jsm": "comm/mail/extensions/openpgp/content/modules/keyserverUris.jsm",
+ "chrome://openpgp/content/modules/log.jsm": "comm/mail/extensions/openpgp/content/modules/log.jsm",
+ "chrome://openpgp/content/modules/masterpass.jsm": "comm/mail/extensions/openpgp/content/modules/masterpass.jsm",
+ "chrome://openpgp/content/modules/mime.jsm": "comm/mail/extensions/openpgp/content/modules/mime.jsm",
+ "chrome://openpgp/content/modules/mimeDecrypt.jsm": "comm/mail/extensions/openpgp/content/modules/mimeDecrypt.jsm",
+ "chrome://openpgp/content/modules/mimeEncrypt.jsm": "comm/mail/extensions/openpgp/content/modules/mimeEncrypt.jsm",
+ "chrome://openpgp/content/modules/mimeVerify.jsm": "comm/mail/extensions/openpgp/content/modules/mimeVerify.jsm",
+ "chrome://openpgp/content/modules/msgRead.jsm": "comm/mail/extensions/openpgp/content/modules/msgRead.jsm",
+ "chrome://openpgp/content/modules/persistentCrypto.jsm": "comm/mail/extensions/openpgp/content/modules/persistentCrypto.jsm",
+ "chrome://openpgp/content/modules/pgpmimeHandler.jsm": "comm/mail/extensions/openpgp/content/modules/pgpmimeHandler.jsm",
+ "chrome://openpgp/content/modules/singletons.jsm": "comm/mail/extensions/openpgp/content/modules/singletons.jsm",
+ "chrome://openpgp/content/modules/sqliteDb.jsm": "comm/mail/extensions/openpgp/content/modules/sqliteDb.jsm",
+ "chrome://openpgp/content/modules/streams.jsm": "comm/mail/extensions/openpgp/content/modules/streams.jsm",
+ "chrome://openpgp/content/modules/trust.jsm": "comm/mail/extensions/openpgp/content/modules/trust.jsm",
+ "chrome://openpgp/content/modules/uris.jsm": "comm/mail/extensions/openpgp/content/modules/uris.jsm",
+ "chrome://openpgp/content/modules/webKey.jsm": "comm/mail/extensions/openpgp/content/modules/webKey.jsm",
+ "chrome://openpgp/content/modules/windows.jsm": "comm/mail/extensions/openpgp/content/modules/windows.jsm",
+ "chrome://openpgp/content/modules/wkdLookup.jsm": "comm/mail/extensions/openpgp/content/modules/wkdLookup.jsm",
+ "chrome://openpgp/content/modules/wksMimeHandler.jsm": "comm/mail/extensions/openpgp/content/modules/wksMimeHandler.jsm",
+ "chrome://openpgp/content/modules/zbase32.jsm": "comm/mail/extensions/openpgp/content/modules/zbase32.jsm",
+ "resource:///actors/ChatActionChild.jsm": "comm/mail/actors/ChatActionChild.jsm",
+ "resource:///actors/ChatActionParent.jsm": "comm/mail/actors/ChatActionParent.jsm",
+ "resource:///actors/ContextMenuParent.jsm": "comm/mail/actors/ContextMenuParent.jsm",
+ "resource:///actors/LinkClickHandlerChild.jsm": "comm/mail/actors/LinkClickHandlerChild.jsm",
+ "resource:///actors/LinkClickHandlerParent.jsm": "comm/mail/actors/LinkClickHandlerParent.jsm",
+ "resource:///actors/LinkHandlerParent.jsm": "comm/mail/actors/LinkHandlerParent.jsm",
+ "resource:///actors/MailLinkChild.jsm": "comm/mail/actors/MailLinkChild.jsm",
+ "resource:///actors/MailLinkParent.jsm": "comm/mail/actors/MailLinkParent.jsm",
+ "resource:///actors/PromptParent.jsm": "comm/mail/actors/PromptParent.jsm",
+ "resource:///actors/VCardChild.jsm": "comm/mail/actors/VCardChild.jsm",
+ "resource:///actors/VCardParent.jsm": "comm/mail/actors/VCardParent.jsm",
+ "resource:///modules/ABQueryUtils.jsm": "comm/mailnews/base/src/ABQueryUtils.jsm",
+ "resource:///modules/AME2E.jsm": "comm/mail/extensions/am-e2e/AME2E.jsm",
+ "resource:///modules/AbAutoCompleteMyDomain.jsm": "comm/mailnews/addrbook/src/AbAutoCompleteMyDomain.jsm",
+ "resource:///modules/AbAutoCompleteSearch.jsm": "comm/mailnews/addrbook/src/AbAutoCompleteSearch.jsm",
+ "resource:///modules/AbLDAPAttributeMap.jsm": "comm/mailnews/addrbook/src/AbLDAPAttributeMap.jsm",
+ "resource:///modules/AbLDAPAutoCompleteSearch.jsm": "comm/mailnews/addrbook/src/AbLDAPAutoCompleteSearch.jsm",
+ "resource:///modules/AboutRedirector.jsm": "comm/mail/components/AboutRedirector.jsm",
+ "resource:///modules/AboutSupportMac.jsm": "comm/mail/components/about-support/AboutSupportMac.jsm",
+ "resource:///modules/AboutSupportUnix.jsm": "comm/mail/components/about-support/AboutSupportUnix.jsm",
+ "resource:///modules/AboutSupportWin32.jsm": "comm/mail/components/about-support/AboutSupportWin32.jsm",
+ "resource:///modules/Activity.jsm": "comm/mail/components/activity/Activity.jsm",
+ "resource:///modules/ActivityManager.jsm": "comm/mail/components/activity/ActivityManager.jsm",
+ "resource:///modules/ActivityManagerUI.jsm": "comm/mail/components/activity/ActivityManagerUI.jsm",
+ "resource:///modules/AddrBookCard.jsm": "comm/mailnews/addrbook/modules/AddrBookCard.jsm",
+ "resource:///modules/AddrBookDirectory.jsm": "comm/mailnews/addrbook/modules/AddrBookDirectory.jsm",
+ "resource:///modules/AddrBookFileImporter.jsm": "comm/mailnews/import/modules/AddrBookFileImporter.jsm",
+ "resource:///modules/AddrBookMailingList.jsm": "comm/mailnews/addrbook/modules/AddrBookMailingList.jsm",
+ "resource:///modules/AddrBookManager.jsm": "comm/mailnews/addrbook/modules/AddrBookManager.jsm",
+ "resource:///modules/AddrBookUtils.jsm": "comm/mailnews/addrbook/modules/AddrBookUtils.jsm",
+ "resource:///modules/AppIdleManager.jsm": "comm/mail/components/AppIdleManager.jsm",
+ "resource:///modules/AppleMailProfileImporter.jsm": "comm/mailnews/import/modules/AppleMailProfileImporter.jsm",
+ "resource:///modules/AppUpdateUI.jsm": "comm/mail/modules/AppUpdateUI.jsm",
+ "resource:///modules/AttachmentChecker.jsm": "comm/mail/modules/AttachmentChecker.jsm",
+ "resource:///modules/BaseProfileImporter.jsm": "comm/mailnews/import/modules/BaseProfileImporter.jsm",
+ "resource:///modules/BeckyProfileImporter.jsm": "comm/mailnews/import/modules/BeckyProfileImporter.jsm",
+ "resource:///modules/BrowserWindowTracker.jsm": "comm/mail/modules/BrowserWindowTracker.jsm",
+ "resource:///modules/BuiltInThemes.jsm": "comm/mail/themes/BuiltInThemes.jsm",
+ "resource:///modules/CLib.jsm": "comm/chat/modules/CLib.jsm",
+ "resource:///modules/CalAlarm.jsm": "comm/calendar/base/src/CalAlarm.jsm",
+ "resource:///modules/CalAlarmMonitor.jsm": "comm/calendar/base/src/CalAlarmMonitor.jsm",
+ "resource:///modules/CalAlarmService.jsm": "comm/calendar/base/src/CalAlarmService.jsm",
+ "resource:///modules/CalAttachment.jsm": "comm/calendar/base/src/CalAttachment.jsm",
+ "resource:///modules/CalAttendee.jsm": "comm/calendar/base/src/CalAttendee.jsm",
+ "resource:///modules/CalCalendarManager.jsm": "comm/calendar/base/src/CalCalendarManager.jsm",
+ "resource:///modules/CalCompositeCalendar.jsm": "comm/calendar/providers/composite/CalCompositeCalendar.jsm",
+ "resource:///modules/CalDateTime.jsm": "comm/calendar/base/src/CalDateTime.jsm",
+ "resource:///modules/CalDavCalendar.jsm": "comm/calendar/providers/caldav/CalDavCalendar.jsm",
+ "resource:///modules/CalDavProvider.jsm": "comm/calendar/providers/caldav/CalDavProvider.jsm",
+ "resource:///modules/CalDefaultACLManager.jsm": "comm/calendar/base/src/CalDefaultACLManager.jsm",
+ "resource:///modules/CalDeletedItems.jsm": "comm/calendar/base/src/CalDeletedItems.jsm",
+ "resource:///modules/CalDuration.jsm": "comm/calendar/base/src/CalDuration.jsm",
+ "resource:///modules/CalEvent.jsm": "comm/calendar/base/src/CalEvent.jsm",
+ "resource:///modules/CalFreeBusyService.jsm": "comm/calendar/base/src/CalFreeBusyService.jsm",
+ "resource:///modules/CalHtmlExport.jsm": "comm/calendar/import-export/CalHtmlExport.jsm",
+ "resource:///modules/CalICSProvider.jsm": "comm/calendar/providers/ics/CalICSProvider.jsm",
+ "resource:///modules/CalICSService.jsm": "comm/calendar/base/src/CalICSService.jsm",
+ "resource:///modules/CalIcsImportExport.jsm": "comm/calendar/import-export/CalIcsImportExport.jsm",
+ "resource:///modules/CalIcsParser.jsm": "comm/calendar/base/src/CalIcsParser.jsm",
+ "resource:///modules/CalIcsSerializer.jsm": "comm/calendar/base/src/CalIcsSerializer.jsm",
+ "resource:///modules/CalItipEmailTransport.jsm": "comm/calendar/itip/CalItipEmailTransport.jsm",
+ "resource:///modules/CalItipItem.jsm": "comm/calendar/base/src/CalItipItem.jsm",
+ "resource:///modules/CalItipMessageSender.jsm": "comm/calendar/itip/CalItipMessageSender.jsm",
+ "resource:///modules/CalItipOutgoingMessage.jsm": "comm/calendar/itip/CalItipOutgoingMessage.jsm",
+ "resource:///modules/CalItipProtocolHandler.jsm": "comm/calendar/itip/CalItipProtocolHandler.jsm",
+ "resource:///modules/CalMemoryCalendar.jsm": "comm/calendar/providers/memory/CalMemoryCalendar.jsm",
+ "resource:///modules/CalMetronome.jsm": "comm/calendar/base/src/CalMetronome.jsm",
+ "resource:///modules/CalMimeConverter.jsm": "comm/calendar/base/src/CalMimeConverter.jsm",
+ "resource:///modules/CalPeriod.jsm": "comm/calendar/base/src/CalPeriod.jsm",
+ "resource:///modules/CalProtocolHandler.jsm": "comm/calendar/base/src/CalProtocolHandler.jsm",
+ "resource:///modules/CalReadableStreamFactory.jsm": "comm/calendar/base/src/CalReadableStreamFactory.jsm",
+ "resource:///modules/CalRecurrenceDate.jsm": "comm/calendar/base/src/CalRecurrenceDate.jsm",
+ "resource:///modules/CalRecurrenceInfo.jsm": "comm/calendar/base/src/CalRecurrenceInfo.jsm",
+ "resource:///modules/CalRecurrenceRule.jsm": "comm/calendar/base/src/CalRecurrenceRule.jsm",
+ "resource:///modules/CalRelation.jsm": "comm/calendar/base/src/CalRelation.jsm",
+ "resource:///modules/CalStartupService.jsm": "comm/calendar/base/src/CalStartupService.jsm",
+ "resource:///modules/CalStorageCalendar.jsm": "comm/calendar/providers/storage/CalStorageCalendar.jsm",
+ "resource:///modules/CalTimezone.jsm": "comm/calendar/base/src/CalTimezone.jsm",
+ "resource:///modules/CalTimezoneService.jsm": "comm/calendar/base/src/CalTimezoneService.jsm",
+ "resource:///modules/CalTodo.jsm": "comm/calendar/base/src/CalTodo.jsm",
+ "resource:///modules/CalTransactionManager.jsm": "comm/calendar/base/src/CalTransactionManager.jsm",
+ "resource:///modules/CalWeekInfoService.jsm": "comm/calendar/base/src/CalWeekInfoService.jsm",
+ "resource:///modules/CalendarFileImporter.jsm": "comm/mailnews/import/modules/CalendarFileImporter.jsm",
+ "resource:///modules/CardDAVDirectory.jsm": "comm/mailnews/addrbook/modules/CardDAVDirectory.jsm",
+ "resource:///modules/CardDAVUtils.jsm": "comm/mailnews/addrbook/modules/CardDAVUtils.jsm",
+ "resource:///modules/ChatEncryption.jsm": "comm/mail/components/im/modules/ChatEncryption.jsm",
+ "resource:///modules/ConversationOpener.jsm": "comm/mail/modules/ConversationOpener.jsm",
+ "resource:///modules/CustomizableUI.jsm": "comm/mail/components/customizableui/CustomizableUI.jsm",
+ "resource:///modules/CustomizableWidgets.jsm": "comm/mail/components/customizableui/CustomizableWidgets.jsm",
+ "resource:///modules/DBViewWrapper.jsm": "comm/mail/modules/DBViewWrapper.jsm",
+ "resource:///modules/DNS.jsm": "comm/mail/modules/DNS.jsm",
+ "resource:///modules/DisplayNameUtils.jsm": "comm/mail/modules/DisplayNameUtils.jsm",
+ "resource:///modules/ExtensionBrowsingData.jsm": "comm/mail/components/extensions/ExtensionBrowsingData.jsm",
+ "resource:///modules/ExtensionPopups.jsm": "comm/mail/components/extensions/ExtensionPopups.jsm",
+ "resource:///modules/ExtensionSupport.jsm": "comm/mail/modules/ExtensionSupport.jsm",
+ "resource:///modules/ExtensionToolbarButtons.jsm": "comm/mail/components/extensions/ExtensionToolbarButtons.jsm",
+ "resource:///modules/ExtensionsUI.jsm": "comm/mail/modules/ExtensionsUI.jsm",
+ "resource:///modules/Feed.jsm": "comm/mailnews/extensions/newsblog/Feed.jsm",
+ "resource:///modules/FeedItem.jsm": "comm/mailnews/extensions/newsblog/FeedItem.jsm",
+ "resource:///modules/FeedParser.jsm": "comm/mailnews/extensions/newsblog/FeedParser.jsm",
+ "resource:///modules/FeedUtils.jsm": "comm/mailnews/extensions/newsblog/FeedUtils.jsm",
+ "resource:///modules/FolderLookupService.jsm": "comm/mailnews/base/src/FolderLookupService.jsm",
+ "resource:///modules/FolderUtils.jsm": "comm/mailnews/base/src/FolderUtils.jsm",
+ "resource:///modules/GlobalPopupNotifications.jsm": "comm/mail/modules/GlobalPopupNotifications.jsm",
+ "resource:///modules/GlodaAutoComplete.jsm": "comm/mailnews/db/gloda/components/GlodaAutoComplete.jsm",
+ "resource:///modules/GlodaIMSearcher.jsm": "comm/mail/components/im/modules/GlodaIMSearcher.jsm",
+ "resource:///modules/IMIncomingServer.jsm": "comm/mail/components/im/IMIncomingServer.jsm",
+ "resource:///modules/IMProtocolInfo.jsm": "comm/mail/components/im/IMProtocolInfo.jsm",
+ "resource:///modules/IMServices.jsm": "comm/chat/modules/IMServices.jsm",
+ "resource:///modules/ImapChannel.jsm": "comm/mailnews/imap/src/ImapChannel.jsm",
+ "resource:///modules/ImapClient.jsm": "comm/mailnews/imap/src/ImapClient.jsm",
+ "resource:///modules/ImapIncomingServer.jsm": "comm/mailnews/imap/src/ImapIncomingServer.jsm",
+ "resource:///modules/ImapMessageService.jsm": "comm/mailnews/imap/src/ImapMessageService.jsm",
+ "resource:///modules/ImapModuleLoader.jsm": "comm/mailnews/imap/src/ImapModuleLoader.jsm",
+ "resource:///modules/ImapProtocolHandler.jsm": "comm/mailnews/imap/src/ImapProtocolHandler.jsm",
+ "resource:///modules/ImapProtocolInfo.jsm": "comm/mailnews/imap/src/ImapProtocolInfo.jsm",
+ "resource:///modules/ImapResponse.jsm": "comm/mailnews/imap/src/ImapResponse.jsm",
+ "resource:///modules/ImapService.jsm": "comm/mailnews/imap/src/ImapService.jsm",
+ "resource:///modules/ImapUtils.jsm": "comm/mailnews/imap/src/ImapUtils.jsm",
+ "resource:///modules/InteractiveBrowser.jsm": "comm/chat/modules/InteractiveBrowser.jsm",
+ "resource:///modules/JXON.jsm": "comm/mailnews/base/src/JXON.jsm",
+ "resource:///modules/LDAPClient.jsm": "comm/mailnews/addrbook/modules/LDAPClient.jsm",
+ "resource:///modules/LDAPConnection.jsm": "comm/mailnews/addrbook/modules/LDAPConnection.jsm",
+ "resource:///modules/LDAPDirectory.jsm": "comm/mailnews/addrbook/modules/LDAPDirectory.jsm",
+ "resource:///modules/LDAPDirectoryQuery.jsm": "comm/mailnews/addrbook/modules/LDAPDirectoryQuery.jsm",
+ "resource:///modules/LDAPListenerBase.jsm": "comm/mailnews/addrbook/modules/LDAPListenerBase.jsm",
+ "resource:///modules/LDAPMessage.jsm": "comm/mailnews/addrbook/modules/LDAPMessage.jsm",
+ "resource:///modules/LDAPOperation.jsm": "comm/mailnews/addrbook/modules/LDAPOperation.jsm",
+ "resource:///modules/LDAPProtocolHandler.jsm": "comm/mailnews/addrbook/modules/LDAPProtocolHandler.jsm",
+ "resource:///modules/LDAPReplicationService.jsm": "comm/mailnews/addrbook/modules/LDAPReplicationService.jsm",
+ "resource:///modules/LDAPService.jsm": "comm/mailnews/addrbook/modules/LDAPService.jsm",
+ "resource:///modules/LDAPSyncQuery.jsm": "comm/mailnews/addrbook/modules/LDAPSyncQuery.jsm",
+ "resource:///modules/LDAPURLParser.jsm": "comm/mailnews/addrbook/modules/LDAPURLParser.jsm",
+ "resource:///modules/LineReader.jsm": "comm/mailnews/base/src/LineReader.jsm",
+ "resource:///modules/MDNService.jsm": "comm/mailnews/extensions/mdn/MDNService.jsm",
+ "resource:///modules/MailAuthenticator.jsm": "comm/mailnews/base/src/MailAuthenticator.jsm",
+ "resource:///modules/MailConsts.jsm": "comm/mail/modules/MailConsts.jsm",
+ "resource:///modules/MailCryptoUtils.jsm": "comm/mailnews/base/src/MailCryptoUtils.jsm",
+ "resource:///modules/MailE10SUtils.jsm": "comm/mail/modules/MailE10SUtils.jsm",
+ "resource:///modules/MailExtensionShortcuts.jsm": "comm/mail/components/extensions/MailExtensionShortcuts.jsm",
+ "resource:///modules/MailGlue.jsm": "comm/mail/components/MailGlue.jsm",
+ "resource:///modules/MailMigrator.jsm": "comm/mail/modules/MailMigrator.jsm",
+ "resource:///modules/MailNotificationManager.jsm": "comm/mailnews/base/src/MailNotificationManager.jsm",
+ "resource:///modules/MailNotificationService.jsm": "comm/mailnews/base/src/MailNotificationService.jsm",
+ "resource:///modules/MailServices.jsm": "comm/mailnews/base/src/MailServices.jsm",
+ "resource:///modules/MailStringUtils.jsm": "comm/mailnews/base/src/MailStringUtils.jsm",
+ "resource:///modules/MailUsageTelemetry.jsm": "comm/mail/modules/MailUsageTelemetry.jsm",
+ "resource:///modules/MailUtils.jsm": "comm/mail/modules/MailUtils.jsm",
+ "resource:///modules/MailViewManager.jsm": "comm/mail/modules/MailViewManager.jsm",
+ "resource:///modules/MailnewsMigrator.jsm": "comm/mailnews/base/src/MailnewsMigrator.jsm",
+ "resource:///modules/MailtoProtocolHandler.jsm": "comm/mailnews/compose/src/MailtoProtocolHandler.jsm",
+ "resource:///modules/MessageArchiver.jsm": "comm/mail/modules/MessageArchiver.jsm",
+ "resource:///modules/MessageSend.jsm": "comm/mailnews/compose/src/MessageSend.jsm",
+ "resource:///modules/MessengerContentHandler.jsm": "comm/mail/components/MessengerContentHandler.jsm",
+ "resource:///modules/MimeEncoder.jsm": "comm/mailnews/compose/src/MimeEncoder.jsm",
+ "resource:///modules/MimeJSComponents.jsm": "comm/mailnews/mime/src/MimeJSComponents.jsm",
+ "resource:///modules/MimeMessage.jsm": "comm/mailnews/compose/src/MimeMessage.jsm",
+ "resource:///modules/MimeMessageEmitter.jsm": "comm/mailnews/db/gloda/components/MimeMessageEmitter.jsm",
+ "resource:///modules/MimeMessageUtils.jsm": "comm/mailnews/compose/src/MimeMessageUtils.jsm",
+ "resource:///modules/MimePart.jsm": "comm/mailnews/compose/src/MimePart.jsm",
+ "resource:///modules/MsgAsyncPrompter.jsm": "comm/mailnews/base/src/MsgAsyncPrompter.jsm",
+ "resource:///modules/MsgDBCacheManager.jsm": "comm/mailnews/base/src/MsgDBCacheManager.jsm",
+ "resource:///modules/MsgHdrSyntheticView.jsm": "comm/mail/modules/MsgHdrSyntheticView.jsm",
+ "resource:///modules/MsgIncomingServer.jsm": "comm/mailnews/base/src/MsgIncomingServer.jsm",
+ "resource:///modules/MsgKeySet.jsm": "comm/mailnews/base/src/MsgKeySet.jsm",
+ "resource:///modules/MsgTraitService.jsm": "comm/mailnews/search/src/MsgTraitService.jsm",
+ "resource:///modules/NewsAutoCompleteSearch.jsm": "comm/mailnews/news/src/NewsAutoCompleteSearch.jsm",
+ "resource:///modules/NewsBlog.jsm": "comm/mailnews/extensions/newsblog/NewsBlog.jsm",
+ "resource:///modules/NntpChannel.jsm": "comm/mailnews/news/src/NntpChannel.jsm",
+ "resource:///modules/NntpClient.jsm": "comm/mailnews/news/src/NntpClient.jsm",
+ "resource:///modules/NntpIncomingServer.jsm": "comm/mailnews/news/src/NntpIncomingServer.jsm",
+ "resource:///modules/NntpMessageService.jsm": "comm/mailnews/news/src/NntpMessageService.jsm",
+ "resource:///modules/NntpNewsGroup.jsm": "comm/mailnews/news/src/NntpNewsGroup.jsm",
+ "resource:///modules/NntpProtocolHandler.jsm": "comm/mailnews/news/src/NntpProtocolHandler.jsm",
+ "resource:///modules/NntpProtocolInfo.jsm": "comm/mailnews/news/src/NntpProtocolInfo.jsm",
+ "resource:///modules/NntpService.jsm": "comm/mailnews/news/src/NntpService.jsm",
+ "resource:///modules/NntpUtils.jsm": "comm/mailnews/news/src/NntpUtils.jsm",
+ "resource:///modules/NormalizedMap.jsm": "comm/chat/modules/NormalizedMap.jsm",
+ "resource:///modules/OAuth2.jsm": "comm/mailnews/base/src/OAuth2.jsm",
+ "resource:///modules/OAuth2Module.jsm": "comm/mailnews/base/src/OAuth2Module.jsm",
+ "resource:///modules/OAuth2Providers.jsm": "comm/mailnews/base/src/OAuth2Providers.jsm",
+ "resource:///modules/OutlookProfileImporter.jsm": "comm/mailnews/import/modules/OutlookProfileImporter.jsm",
+ "resource:///modules/OTR.jsm": "comm/chat/modules/OTR.jsm",
+ "resource:///modules/OTRLib.jsm": "comm/chat/modules/OTRLib.jsm",
+ "resource:///modules/OTRUI.jsm": "comm/chat/modules/OTRUI.jsm",
+ "resource:///modules/OfflineStartup.jsm": "comm/mailnews/extensions/offline-startup/OfflineStartup.jsm",
+ "resource:///modules/PanelMultiView.jsm": "comm/mail/components/customizableui/PanelMultiView.jsm",
+ "resource:///modules/PeriodicFilterManager.jsm": "comm/mailnews/search/src/PeriodicFilterManager.jsm",
+ "resource:///modules/PhishingDetector.jsm": "comm/mail/modules/PhishingDetector.jsm",
+ "resource:///modules/Pop3Channel.jsm": "comm/mailnews/local/src/Pop3Channel.jsm",
+ "resource:///modules/Pop3Client.jsm": "comm/mailnews/local/src/Pop3Client.jsm",
+ "resource:///modules/Pop3IncomingServer.jsm": "comm/mailnews/local/src/Pop3IncomingServer.jsm",
+ "resource:///modules/Pop3ProtocolHandler.jsm": "comm/mailnews/local/src/Pop3ProtocolHandler.jsm",
+ "resource:///modules/Pop3ProtocolInfo.jsm": "comm/mailnews/local/src/Pop3ProtocolInfo.jsm",
+ "resource:///modules/Pop3Service.jsm": "comm/mailnews/local/src/Pop3Service.jsm",
+ "resource:///modules/ProfileExporter.jsm": "comm/mailnews/export/modules/ProfileExporter.jsm",
+ "resource:///modules/PromptCollection.jsm": "comm/mail/components/prompts/PromptCollection.jsm",
+ "resource:///modules/QueryStringToExpression.jsm": "comm/mailnews/addrbook/modules/QueryStringToExpression.jsm",
+ "resource:///modules/QuickFilterManager.jsm": "comm/mail/modules/QuickFilterManager.jsm",
+ "resource:///modules/SMTPProtocolHandler.jsm": "comm/mailnews/compose/src/SMTPProtocolHandler.jsm",
+ "resource:///modules/SQLiteDirectory.jsm": "comm/mailnews/addrbook/modules/SQLiteDirectory.jsm",
+ "resource:///modules/Sanitizer.jsm": "comm/mail/components/accountcreation/Sanitizer.jsm",
+ "resource:///modules/SeamonkeyImport.jsm": "comm/mailnews/import/src/SeamonkeyImport.jsm",
+ "resource:///modules/SearchIntegration.jsm": "comm/mail/components/search/SearchIntegration.jsm",
+ "resource:///modules/SearchSpec.jsm": "comm/mail/modules/SearchSpec.jsm",
+ "resource:///modules/SearchWidgetTracker.jsm": "comm/mail/components/customizableui/SearchWidgetTracker.jsm",
+ "resource:///modules/SelectionWidgetController.jsm": "comm/mail/modules/SelectionWidgetController.jsm",
+ "resource:///modules/SessionStore.jsm": "comm/mail/modules/SessionStore.jsm",
+ "resource:///modules/SessionStoreManager.jsm": "comm/mail/modules/SessionStoreManager.jsm",
+ "resource:///modules/ShortcutsManager.jsm": "comm/mail/modules/ShortcutsManager.jsm",
+ "resource:///modules/SmtpClient.jsm": "comm/mailnews/compose/src/SmtpClient.jsm",
+ "resource:///modules/SmtpServer.jsm": "comm/mailnews/compose/src/SmtpServer.jsm",
+ "resource:///modules/SmtpService.jsm": "comm/mailnews/compose/src/SmtpService.jsm",
+ "resource:///modules/StartupRecorder.jsm": "comm/mail/components/StartupRecorder.jsm",
+ "resource:///modules/SummaryFrameManager.jsm": "comm/mail/modules/SummaryFrameManager.jsm",
+ "resource:///modules/TBDistCustomizer.jsm": "comm/mail/modules/TBDistCustomizer.jsm",
+ "resource:///modules/TabStateFlusher.jsm": "comm/mail/modules/TabStateFlusher.jsm",
+ "resource:///modules/TagUtils.jsm": "comm/mail/modules/TagUtils.jsm",
+ "resource:///modules/TemplateUtils.jsm": "comm/mailnews/base/src/TemplateUtils.jsm",
+ "resource:///modules/ThemeVariableMap.jsm": "comm/mail/themes/ThemeVariableMap.jsm",
+ "resource:///modules/ThunderbirdImport.jsm": "comm/mailnews/import/src/ThunderbirdImport.jsm",
+ "resource:///modules/ThunderbirdProfileImporter.jsm": "comm/mailnews/import/modules/ThunderbirdProfileImporter.jsm",
+ "resource:///modules/ThunderbirdProfileMigrator.jsm": "comm/mail/components/migration/src/ThunderbirdProfileMigrator.jsm",
+ "resource:///modules/ToLocaleFormat.jsm": "comm/chat/modules/ToLocaleFormat.jsm",
+ "resource:///modules/UIDensity.jsm": "comm/mail/modules/UIDensity.jsm",
+ "resource:///modules/UIFontSize.jsm": "comm/mail/modules/UIFontSize.jsm",
+ "resource:///modules/VCardUtils.jsm": "comm/mailnews/addrbook/modules/VCardUtils.jsm",
+ "resource:///modules/VirtualFolderWrapper.jsm": "comm/mailnews/base/src/VirtualFolderWrapper.jsm",
+ "resource:///modules/WinUnreadBadge.jsm": "comm/mailnews/base/src/WinUnreadBadge.jsm",
+ "resource:///modules/Windows8WindowFrameColor.jsm": "comm/mail/themes/Windows8WindowFrameColor.jsm",
+ "resource:///modules/WindowsJumpLists.jsm": "comm/mail/modules/WindowsJumpLists.jsm",
+ "resource:///modules/accountcreation/AccountConfig.jsm": "comm/mail/components/accountcreation/AccountConfig.jsm",
+ "resource:///modules/accountcreation/AccountCreationUtils.jsm": "comm/mail/components/accountcreation/AccountCreationUtils.jsm",
+ "resource:///modules/accountcreation/ConfigVerifier.jsm": "comm/mail/components/accountcreation/ConfigVerifier.jsm",
+ "resource:///modules/accountcreation/CreateInBackend.jsm": "comm/mail/components/accountcreation/CreateInBackend.jsm",
+ "resource:///modules/accountcreation/ExchangeAutoDiscover.jsm": "comm/mail/components/accountcreation/ExchangeAutoDiscover.jsm",
+ "resource:///modules/accountcreation/FetchConfig.jsm": "comm/mail/components/accountcreation/FetchConfig.jsm",
+ "resource:///modules/accountcreation/FetchHTTP.jsm": "comm/mail/components/accountcreation/FetchHTTP.jsm",
+ "resource:///modules/accountcreation/GuessConfig.jsm": "comm/mail/components/accountcreation/GuessConfig.jsm",
+ "resource:///modules/accountcreation/readFromXML.jsm": "comm/mail/components/accountcreation/readFromXML.jsm",
+ "resource:///modules/activity/activityModules.jsm": "comm/mail/components/activity/modules/activityModules.jsm",
+ "resource:///modules/activity/alertHook.jsm": "comm/mail/components/activity/modules/alertHook.jsm",
+ "resource:///modules/activity/autosync.jsm": "comm/mail/components/activity/modules/autosync.jsm",
+ "resource:///modules/activity/glodaIndexer.jsm": "comm/mail/components/activity/modules/glodaIndexer.jsm",
+ "resource:///modules/activity/moveCopy.jsm": "comm/mail/components/activity/modules/moveCopy.jsm",
+ "resource:///modules/activity/pop3Download.jsm": "comm/mail/components/activity/modules/pop3Download.jsm",
+ "resource:///modules/activity/sendLater.jsm": "comm/mail/components/activity/modules/sendLater.jsm",
+ "resource:///modules/caldav/CalDavRequest.jsm": "comm/calendar/providers/caldav/modules/CalDavRequest.jsm",
+ "resource:///modules/caldav/CalDavRequestHandlers.jsm": "comm/calendar/providers/caldav/modules/CalDavRequestHandlers.jsm",
+ "resource:///modules/caldav/CalDavSession.jsm": "comm/calendar/providers/caldav/modules/CalDavSession.jsm",
+ "resource:///modules/caldav/CalDavUtils.jsm": "comm/calendar/providers/caldav/modules/CalDavUtils.jsm",
+ "resource:///modules/calendar/CalStorageCachedItemModel.jsm": "comm/calendar/providers/storage/CalStorageCachedItemModel.jsm",
+ "resource:///modules/calendar/CalStorageDatabase.jsm": "comm/calendar/providers/storage/CalStorageDatabase.jsm",
+ "resource:///modules/calendar/CalStorageItemModel.jsm": "comm/calendar/providers/storage/CalStorageItemModel.jsm",
+ "resource:///modules/calendar/CalStorageMetaDataModel.jsm": "comm/calendar/providers/storage/CalStorageMetaDataModel.jsm",
+ "resource:///modules/calendar/CalStorageModelBase.jsm": "comm/calendar/providers/storage/CalStorageModelBase.jsm",
+ "resource:///modules/calendar/CalStorageModelFactory.jsm": "comm/calendar/providers/storage/CalStorageModelFactory.jsm",
+ "resource:///modules/calendar/CalStorageOfflineModel.jsm": "comm/calendar/providers/storage/CalStorageOfflineModel.jsm",
+ "resource:///modules/calendar/CalStorageStatements.jsm": "comm/calendar/providers/storage/CalStorageStatements.jsm",
+ "resource:///modules/calendar/Ical.jsm": "comm/calendar/base/modules/Ical.jsm",
+ "resource:///modules/calendar/calCalendarDeactivator.jsm": "comm/calendar/base/modules/calCalendarDeactivator.jsm",
+ "resource:///modules/calendar/calExtract.jsm": "comm/calendar/base/modules/calExtract.jsm",
+ "resource:///modules/calendar/calHashedArray.jsm": "comm/calendar/base/modules/calHashedArray.jsm",
+ "resource:///modules/calendar/calRecurrenceUtils.jsm": "comm/calendar/base/modules/calRecurrenceUtils.jsm",
+ "resource:///modules/calendar/calStorageHelpers.jsm": "comm/calendar/providers/storage/calStorageHelpers.jsm",
+ "resource:///modules/calendar/calStorageUpgrade.jsm": "comm/calendar/providers/storage/calStorageUpgrade.jsm",
+ "resource:///modules/calendar/calUtils.jsm": "comm/calendar/base/modules/calUtils.jsm",
+ "resource:///modules/calendar/extract/CalExtractParser.jsm": "comm/calendar/extract/CalExtractParser.jsm",
+ "resource:///modules/calendar/extract/CalExtractParserService.jsm": "comm/calendar/extract/CalExtractParserService.jsm",
+ "resource:///modules/calendar/utils/calACLUtils.jsm": "comm/calendar/base/modules/utils/calACLUtils.jsm",
+ "resource:///modules/calendar/utils/calAlarmUtils.jsm": "comm/calendar/base/modules/utils/calAlarmUtils.jsm",
+ "resource:///modules/calendar/utils/calAuthUtils.jsm": "comm/calendar/base/modules/utils/calAuthUtils.jsm",
+ "resource:///modules/calendar/utils/calCategoryUtils.jsm": "comm/calendar/base/modules/utils/calCategoryUtils.jsm",
+ "resource:///modules/calendar/utils/calDataUtils.jsm": "comm/calendar/base/modules/utils/calDataUtils.jsm",
+ "resource:///modules/calendar/utils/calDateTimeFormatter.jsm": "comm/calendar/base/modules/utils/calDateTimeFormatter.jsm",
+ "resource:///modules/calendar/utils/calDateTimeUtils.jsm": "comm/calendar/base/modules/utils/calDateTimeUtils.jsm",
+ "resource:///modules/calendar/utils/calEmailUtils.jsm": "comm/calendar/base/modules/utils/calEmailUtils.jsm",
+ "resource:///modules/calendar/utils/calInvitationUtils.jsm": "comm/calendar/base/modules/utils/calInvitationUtils.jsm",
+ "resource:///modules/calendar/utils/calItemUtils.jsm": "comm/calendar/base/modules/utils/calItemUtils.jsm",
+ "resource:///modules/calendar/utils/calIteratorUtils.jsm": "comm/calendar/base/modules/utils/calIteratorUtils.jsm",
+ "resource:///modules/calendar/utils/calItipUtils.jsm": "comm/calendar/base/modules/utils/calItipUtils.jsm",
+ "resource:///modules/calendar/utils/calL10NUtils.jsm": "comm/calendar/base/modules/utils/calL10NUtils.jsm",
+ "resource:///modules/calendar/utils/calPrintUtils.jsm": "comm/calendar/base/modules/utils/calPrintUtils.jsm",
+ "resource:///modules/calendar/utils/calProviderDetectionUtils.jsm": "comm/calendar/base/modules/utils/calProviderDetectionUtils.jsm",
+ "resource:///modules/calendar/utils/calProviderUtils.jsm": "comm/calendar/base/modules/utils/calProviderUtils.jsm",
+ "resource:///modules/calendar/utils/calUnifinderUtils.jsm": "comm/calendar/base/modules/utils/calUnifinderUtils.jsm",
+ "resource:///modules/calendar/utils/calViewUtils.jsm": "comm/calendar/base/modules/utils/calViewUtils.jsm",
+ "resource:///modules/calendar/utils/calWindowUtils.jsm": "comm/calendar/base/modules/utils/calWindowUtils.jsm",
+ "resource:///modules/calendar/utils/calXMLUtils.jsm": "comm/calendar/base/modules/utils/calXMLUtils.jsm",
+ "resource:///modules/chatHandler.jsm": "comm/mail/components/im/modules/chatHandler.jsm",
+ "resource:///modules/chatIcons.jsm": "comm/mail/components/im/modules/chatIcons.jsm",
+ "resource:///modules/chatNotifications.jsm": "comm/mail/components/im/modules/chatNotifications.jsm",
+ "resource:///modules/cloudFileAccounts.jsm": "comm/mail/components/cloudfile/cloudFileAccounts.jsm",
+ "resource:///modules/devtools-loader.jsm": "comm/mail/components/devtools/devtools-loader.jsm",
+ "resource:///modules/extraMimeParsers.jsm": "comm/mailnews/mime/src/extraMimeParsers.jsm",
+ "resource:///modules/facebook.jsm": "comm/chat/protocols/facebook/facebook.jsm",
+ "resource:///modules/gloda/Collection.jsm": "comm/mailnews/db/gloda/modules/Collection.jsm",
+ "resource:///modules/gloda/Everybody.jsm": "comm/mailnews/db/gloda/modules/Everybody.jsm",
+ "resource:///modules/gloda/Facet.jsm": "comm/mailnews/db/gloda/modules/Facet.jsm",
+ "resource:///modules/gloda/Gloda.jsm": "comm/mailnews/db/gloda/modules/Gloda.jsm",
+ "resource:///modules/gloda/GlodaConstants.jsm": "comm/mailnews/db/gloda/modules/GlodaConstants.jsm",
+ "resource:///modules/gloda/GlodaContent.jsm": "comm/mailnews/db/gloda/modules/GlodaContent.jsm",
+ "resource:///modules/gloda/GlodaDataModel.jsm": "comm/mailnews/db/gloda/modules/GlodaDataModel.jsm",
+ "resource:///modules/gloda/GlodaDatabind.jsm": "comm/mailnews/db/gloda/modules/GlodaDatabind.jsm",
+ "resource:///modules/gloda/GlodaDatastore.jsm": "comm/mailnews/db/gloda/modules/GlodaDatastore.jsm",
+ "resource:///modules/gloda/GlodaExplicitAttr.jsm": "comm/mailnews/db/gloda/modules/GlodaExplicitAttr.jsm",
+ "resource:///modules/gloda/GlodaFundAttr.jsm": "comm/mailnews/db/gloda/modules/GlodaFundAttr.jsm",
+ "resource:///modules/gloda/GlodaIndexer.jsm": "comm/mailnews/db/gloda/modules/GlodaIndexer.jsm",
+ "resource:///modules/gloda/GlodaMsgIndexer.jsm": "comm/mailnews/db/gloda/modules/GlodaMsgIndexer.jsm",
+ "resource:///modules/gloda/GlodaMsgSearcher.jsm": "comm/mailnews/db/gloda/modules/GlodaMsgSearcher.jsm",
+ "resource:///modules/gloda/GlodaPublic.jsm": "comm/mailnews/db/gloda/modules/GlodaPublic.jsm",
+ "resource:///modules/gloda/GlodaQueryClassFactory.jsm": "comm/mailnews/db/gloda/modules/GlodaQueryClassFactory.jsm",
+ "resource:///modules/gloda/GlodaSyntheticView.jsm": "comm/mailnews/db/gloda/modules/GlodaSyntheticView.jsm",
+ "resource:///modules/gloda/GlodaUtils.jsm": "comm/mailnews/db/gloda/modules/GlodaUtils.jsm",
+ "resource:///modules/gloda/IndexMsg.jsm": "comm/mailnews/db/gloda/modules/IndexMsg.jsm",
+ "resource:///modules/gloda/MimeMessage.jsm": "comm/mailnews/db/gloda/modules/MimeMessage.jsm",
+ "resource:///modules/gloda/NounFreetag.jsm": "comm/mailnews/db/gloda/modules/NounFreetag.jsm",
+ "resource:///modules/gloda/NounMimetype.jsm": "comm/mailnews/db/gloda/modules/NounMimetype.jsm",
+ "resource:///modules/gloda/NounTag.jsm": "comm/mailnews/db/gloda/modules/NounTag.jsm",
+ "resource:///modules/gloda/SuffixTree.jsm": "comm/mailnews/db/gloda/modules/SuffixTree.jsm",
+ "resource:///modules/gtalk.jsm": "comm/chat/protocols/gtalk/gtalk.jsm",
+ "resource:///modules/hostnameUtils.jsm": "comm/mailnews/base/src/hostnameUtils.jsm",
+ "resource:///modules/imAccounts.jsm": "comm/chat/components/src/imAccounts.jsm",
+ "resource:///modules/imCommands.jsm": "comm/chat/components/src/imCommands.jsm",
+ "resource:///modules/imContacts.jsm": "comm/chat/components/src/imContacts.jsm",
+ "resource:///modules/imContentSink.jsm": "comm/chat/modules/imContentSink.jsm",
+ "resource:///modules/imConversations.jsm": "comm/chat/components/src/imConversations.jsm",
+ "resource:///modules/imCore.jsm": "comm/chat/components/src/imCore.jsm",
+ "resource:///modules/imSmileys.jsm": "comm/chat/modules/imSmileys.jsm",
+ "resource:///modules/imStatusUtils.jsm": "comm/chat/modules/imStatusUtils.jsm",
+ "resource:///modules/imTextboxUtils.jsm": "comm/chat/modules/imTextboxUtils.jsm",
+ "resource:///modules/imThemes.jsm": "comm/chat/modules/imThemes.jsm",
+ "resource:///modules/imXPCOMUtils.jsm": "comm/chat/modules/imXPCOMUtils.jsm",
+ "resource:///modules/index_im.jsm": "comm/mail/components/im/modules/index_im.jsm",
+ "resource:///modules/irc.jsm": "comm/chat/protocols/irc/irc.jsm",
+ "resource:///modules/ircAccount.jsm": "comm/chat/protocols/irc/ircAccount.jsm",
+ "resource:///modules/ircBase.jsm": "comm/chat/protocols/irc/ircBase.jsm",
+ "resource:///modules/ircCAP.jsm": "comm/chat/protocols/irc/ircCAP.jsm",
+ "resource:///modules/ircCTCP.jsm": "comm/chat/protocols/irc/ircCTCP.jsm",
+ "resource:///modules/ircCommands.jsm": "comm/chat/protocols/irc/ircCommands.jsm",
+ "resource:///modules/ircDCC.jsm": "comm/chat/protocols/irc/ircDCC.jsm",
+ "resource:///modules/ircEchoMessage.jsm": "comm/chat/protocols/irc/ircEchoMessage.jsm",
+ "resource:///modules/ircHandlerPriorities.jsm": "comm/chat/protocols/irc/ircHandlerPriorities.jsm",
+ "resource:///modules/ircHandlers.jsm": "comm/chat/protocols/irc/ircHandlers.jsm",
+ "resource:///modules/ircISUPPORT.jsm": "comm/chat/protocols/irc/ircISUPPORT.jsm",
+ "resource:///modules/ircMultiPrefix.jsm": "comm/chat/protocols/irc/ircMultiPrefix.jsm",
+ "resource:///modules/ircNonStandard.jsm": "comm/chat/protocols/irc/ircNonStandard.jsm",
+ "resource:///modules/ircSASL.jsm": "comm/chat/protocols/irc/ircSASL.jsm",
+ "resource:///modules/ircServerTime.jsm": "comm/chat/protocols/irc/ircServerTime.jsm",
+ "resource:///modules/ircServices.jsm": "comm/chat/protocols/irc/ircServices.jsm",
+ "resource:///modules/ircUtils.jsm": "comm/chat/protocols/irc/ircUtils.jsm",
+ "resource:///modules/ircWatchMonitor.jsm": "comm/chat/protocols/irc/ircWatchMonitor.jsm",
+ "resource:///modules/jsProtoHelper.jsm": "comm/chat/modules/jsProtoHelper.jsm",
+ "resource:///modules/jsTestProtocol.jsm": "comm/chat/protocols/jsTest/jsTestProtocol.jsm",
+ "resource:///modules/jsaccount/JSAccountUtils.jsm": "comm/mailnews/jsaccount/modules/JSAccountUtils.jsm",
+ "resource:///modules/jsaccount/JaBaseUrl.jsm": "comm/mailnews/jsaccount/modules/JaBaseUrl.jsm",
+ "resource:///modules/jsaccount/TestJaMsgProtocolInfoComponent.jsm": "comm/mailnews/jsaccount/test/unit/resources/TestJaMsgProtocolInfoComponent.jsm",
+ "resource:///modules/jsmime.jsm": "comm/mailnews/mime/src/jsmime.jsm",
+ "resource:///modules/logger.jsm": "comm/chat/components/src/logger.jsm",
+ "resource:///modules/mailstoreConverter.jsm": "comm/mailnews/base/src/mailstoreConverter.jsm",
+ "resource:///modules/matrix-sdk.jsm": "comm/chat/protocols/matrix/matrix-sdk.jsm",
+ "resource:///modules/matrix.jsm": "comm/chat/protocols/matrix/matrix.jsm",
+ "resource:///modules/matrixAccount.jsm": "comm/chat/protocols/matrix/matrixAccount.jsm",
+ "resource:///modules/matrixCommands.jsm": "comm/chat/protocols/matrix/matrixCommands.jsm",
+ "resource:///modules/matrixMessageContent.jsm": "comm/chat/protocols/matrix/matrixMessageContent.jsm",
+ "resource:///modules/matrixPowerLevels.jsm": "comm/chat/protocols/matrix/matrixPowerLevels.jsm",
+ "resource:///modules/matrixTextForEvent.jsm": "comm/chat/protocols/matrix/matrixTextForEvent.jsm",
+ "resource:///modules/mimeParser.jsm": "comm/mailnews/mime/src/mimeParser.jsm",
+ "resource:///modules/odnoklassniki.jsm": "comm/chat/protocols/odnoklassniki/odnoklassniki.jsm",
+ "resource:///modules/sax.jsm": "comm/chat/protocols/xmpp/sax.jsm",
+ "resource:///modules/socket.jsm": "comm/chat/modules/socket.jsm",
+ "resource:///modules/twitter.jsm": "comm/chat/protocols/twitter/twitter.jsm",
+ "resource:///modules/xmpp-authmechs.jsm": "comm/chat/protocols/xmpp/xmpp-authmechs.jsm",
+ "resource:///modules/xmpp-base.jsm": "comm/chat/protocols/xmpp/xmpp-base.jsm",
+ "resource:///modules/xmpp-commands.jsm": "comm/chat/protocols/xmpp/xmpp-commands.jsm",
+ "resource:///modules/xmpp-session.jsm": "comm/chat/protocols/xmpp/xmpp-session.jsm",
+ "resource:///modules/xmpp-xml.jsm": "comm/chat/protocols/xmpp/xmpp-xml.jsm",
+ "resource:///modules/xmpp.jsm": "comm/chat/protocols/xmpp/xmpp.jsm",
+ "resource:///modules/yahoo.jsm": "comm/chat/protocols/yahoo/yahoo.jsm",
+ "resource://testing-common/CardDAVServer.jsm": "comm/mailnews/addrbook/test/CardDAVServer.jsm",
+ "resource://testing-common/LDAPServer.jsm": "comm/mailnews/addrbook/test/LDAPServer.jsm",
+ "resource://testing-common/PromiseTestUtils.jsm": "comm/mailnews/test/resources/PromiseTestUtils.jsm",
+ "resource://testing-common/TestProtocol.jsm": "comm/mail/components/im/test/TestProtocol.jsm",
+ "resource://testing-common/calendar/CalDAVServer.jsm": "comm/calendar/test/CalDAVServer.jsm",
+ "resource://testing-common/calendar/CalendarTestUtils.jsm": "comm/calendar/test/CalendarTestUtils.jsm",
+ "resource://testing-common/calendar/CalendarUtils.jsm": "comm/calendar/test/CalendarUtils.jsm",
+ "resource://testing-common/calendar/ICSServer.jsm": "comm/calendar/test/ICSServer.jsm",
+ "resource://testing-common/calendar/ItemEditingHelpers.jsm": "comm/calendar/test/ItemEditingHelpers.jsm",
+ "resource://testing-common/gloda/GlodaQueryHelper.jsm": "comm/mailnews/db/gloda/test/unit/resources/GlodaQueryHelper.jsm",
+ "resource://testing-common/gloda/GlodaTestHelper.jsm": "comm/mailnews/db/gloda/test/unit/resources/GlodaTestHelper.jsm",
+ "resource://testing-common/gloda/GlodaTestHelperFunctions.jsm": "comm/mailnews/db/gloda/test/unit/resources/GlodaTestHelperFunctions.jsm",
+ "resource://testing-common/mailnews/Auth.jsm": "comm/mailnews/test/fakeserver/Auth.jsm",
+ "resource://testing-common/mailnews/Binaryd.jsm": "comm/mailnews/test/fakeserver/Binaryd.jsm",
+ "resource://testing-common/mailnews/IMAPpump.jsm": "comm/mailnews/test/resources/IMAPpump.jsm",
+ "resource://testing-common/mailnews/Imapd.jsm": "comm/mailnews/test/fakeserver/Imapd.jsm",
+ "resource://testing-common/mailnews/Ldapd.jsm": "comm/mailnews/test/fakeserver/Ldapd.jsm",
+ "resource://testing-common/mailnews/LocalAccountUtils.jsm": "comm/mailnews/test/resources/LocalAccountUtils.jsm",
+ "resource://testing-common/mailnews/MailTestUtils.jsm": "comm/mailnews/test/resources/MailTestUtils.jsm",
+ "resource://testing-common/mailnews/Maild.jsm": "comm/mailnews/test/fakeserver/Maild.jsm",
+ "resource://testing-common/mailnews/MessageGenerator.jsm": "comm/mailnews/test/resources/MessageGenerator.jsm",
+ "resource://testing-common/mailnews/MessageInjection.jsm": "comm/mailnews/test/resources/MessageInjection.jsm",
+ "resource://testing-common/mailnews/NetworkTestUtils.jsm": "comm/mailnews/test/resources/NetworkTestUtils.jsm",
+ "resource://testing-common/mailnews/Nntpd.jsm": "comm/mailnews/test/fakeserver/Nntpd.jsm",
+ "resource://testing-common/mailnews/Pop3d.jsm": "comm/mailnews/test/fakeserver/Pop3d.jsm",
+ "resource://testing-common/mailnews/Smtpd.jsm": "comm/mailnews/test/fakeserver/Smtpd.jsm",
+ "resource://testing-common/mailnews/smimeUtils.jsm": "comm/mailnews/test/resources/smimeUtils.jsm",
+ "resource://testing-common/mailnews/testJaBaseIncomingServer.jsm": "comm/mailnews/jsaccount/test/unit/resources/testJaBaseIncomingServer.jsm",
+ "resource://testing-common/mailnews/testJaBaseMsgFolder.jsm": "comm/mailnews/jsaccount/test/unit/resources/testJaBaseMsgFolder.jsm",
+ "resource://testing-common/mozmill/AccountManagerHelpers.jsm": "comm/mail/test/browser/shared-modules/AccountManagerHelpers.jsm",
+ "resource://testing-common/mozmill/AddressBookHelpers.jsm": "comm/mail/test/browser/shared-modules/AddressBookHelpers.jsm",
+ "resource://testing-common/mozmill/AttachmentHelpers.jsm": "comm/mail/test/browser/shared-modules/AttachmentHelpers.jsm",
+ "resource://testing-common/mozmill/CloudfileHelpers.jsm": "comm/mail/test/browser/shared-modules/CloudfileHelpers.jsm",
+ "resource://testing-common/mozmill/ComposeHelpers.jsm": "comm/mail/test/browser/shared-modules/ComposeHelpers.jsm",
+ "resource://testing-common/mozmill/ContentTabHelpers.jsm": "comm/mail/test/browser/shared-modules/ContentTabHelpers.jsm",
+ "resource://testing-common/mozmill/CustomizationHelpers.jsm": "comm/mail/test/browser/shared-modules/CustomizationHelpers.jsm",
+ "resource://testing-common/mozmill/DOMHelpers.jsm": "comm/mail/test/browser/shared-modules/DOMHelpers.jsm",
+ "resource://testing-common/mozmill/EventUtils.jsm": "comm/mail/test/browser/shared-modules/EventUtils.jsm",
+ "resource://testing-common/mozmill/FolderDisplayHelpers.jsm": "comm/mail/test/browser/shared-modules/FolderDisplayHelpers.jsm",
+ "resource://testing-common/mozmill/JunkHelpers.jsm": "comm/mail/test/browser/shared-modules/JunkHelpers.jsm",
+ "resource://testing-common/mozmill/KeyboardHelpers.jsm": "comm/mail/test/browser/shared-modules/KeyboardHelpers.jsm",
+ "resource://testing-common/mozmill/MockObjectHelpers.jsm": "comm/mail/test/browser/shared-modules/MockObjectHelpers.jsm",
+ "resource://testing-common/mozmill/MouseEventHelpers.jsm": "comm/mail/test/browser/shared-modules/MouseEventHelpers.jsm",
+ "resource://testing-common/mozmill/NNTPHelpers.jsm": "comm/mail/test/browser/shared-modules/NNTPHelpers.jsm",
+ "resource://testing-common/mozmill/NewMailAccountHelpers.jsm": "comm/mail/test/browser/shared-modules/NewMailAccountHelpers.jsm",
+ "resource://testing-common/mozmill/NotificationBoxHelpers.jsm": "comm/mail/test/browser/shared-modules/NotificationBoxHelpers.jsm",
+ "resource://testing-common/mozmill/OpenPGPTestUtils.jsm": "comm/mail/test/browser/shared-modules/OpenPGPTestUtils.jsm",
+ "resource://testing-common/mozmill/PrefTabHelpers.jsm": "comm/mail/test/browser/shared-modules/PrefTabHelpers.jsm",
+ "resource://testing-common/mozmill/PromptHelpers.jsm": "comm/mail/test/browser/shared-modules/PromptHelpers.jsm",
+ "resource://testing-common/mozmill/QuickFilterBarHelpers.jsm": "comm/mail/test/browser/shared-modules/QuickFilterBarHelpers.jsm",
+ "resource://testing-common/mozmill/SearchWindowHelpers.jsm": "comm/mail/test/browser/shared-modules/SearchWindowHelpers.jsm",
+ "resource://testing-common/mozmill/SubscribeWindowHelpers.jsm": "comm/mail/test/browser/shared-modules/SubscribeWindowHelpers.jsm",
+ "resource://testing-common/mozmill/WindowHelpers.jsm": "comm/mail/test/browser/shared-modules/WindowHelpers.jsm",
+ "resource://testing-common/mozmill/controller.jsm": "comm/mail/test/browser/shared-modules/controller.jsm",
+ "resource://testing-common/mozmill/utils.jsm": "comm/mail/test/browser/shared-modules/utils.jsm"
+}
diff --git a/comm/tools/lint/Generated.txt b/comm/tools/lint/Generated.txt
new file mode 100644
index 0000000000..c3d6090373
--- /dev/null
+++ b/comm/tools/lint/Generated.txt
@@ -0,0 +1,3 @@
+comm/mailnews/extensions/newsblog/test/unit/resources/feeds-missing-timestamp/feeds.json
+comm/mailnews/extensions/newsblog/test/unit/resources/feeds-simple/feeditems.json
+comm/mailnews/extensions/newsblog/test/unit/resources/feeds-simple/feeds.json
diff --git a/comm/tools/lint/ThirdPartyPaths.txt b/comm/tools/lint/ThirdPartyPaths.txt
new file mode 100644
index 0000000000..4b2922e585
--- /dev/null
+++ b/comm/tools/lint/ThirdPartyPaths.txt
@@ -0,0 +1,18 @@
+comm/calendar/base/modules/Ical.jsm
+comm/chat/protocols/matrix/lib
+comm/chat/protocols/xmpp/lib
+comm/mail/base/content/protovis-r2.6-modded.js
+comm/mail/components/compose/texzilla/TeXZilla.js
+comm/mail/components/storybook/storybook-static
+comm/mailnews/mapi/include
+comm/third_party/asn1js
+comm/third_party/botan
+comm/third_party/bzip2
+comm/third_party/json-c
+comm/third_party/libgcrypt
+comm/third_party/libgpg-error
+comm/third_party/libotr
+comm/third_party/niwcompat
+comm/third_party/python
+comm/third_party/rnp
+comm/third_party/zlib
diff --git a/comm/tools/lint/black.yml b/comm/tools/lint/black.yml
new file mode 100644
index 0000000000..a3850bc7be
--- /dev/null
+++ b/comm/tools/lint/black.yml
@@ -0,0 +1,16 @@
+---
+black:
+ description: Reformat python
+ include:
+ - comm/
+ extensions:
+ - build
+ - configure
+ - mozbuild
+ - py
+ support-files:
+ - 'tools/lint/python/**'
+ type: external
+ payload: commlint:lint_wrapper
+ wraps: commlint:black_lint
+ setup: python.black:setup
diff --git a/comm/tools/lint/codespell.yml b/comm/tools/lint/codespell.yml
new file mode 100644
index 0000000000..08b68aac81
--- /dev/null
+++ b/comm/tools/lint/codespell.yml
@@ -0,0 +1,47 @@
+---
+codespell:
+ description: Check code for common misspellings
+ include:
+ - comm/calendar/locales/en-US/
+ - comm/chat/locales/en-US/
+ - comm/mail/branding/
+ - comm/mail/components/telemetry/
+ - comm/mail/locales/en-US/
+ - comm/mailnews/extensions/fts3/
+ - comm/python/
+ - comm/taskcluster/docs/
+ - comm/third_party/
+ - comm/README.md
+ exclude:
+ # Timezones have oddly spelled words that tend to confuse codespell
+ - comm/calendar/locales/en-US/chrome/calendar/timezones.properties
+ - comm/mailnews/extensions/fts3/fts3_porter.c
+ # List of extensions coming from:
+ # tools/lint/{flake8,eslint}.yml
+ # tools/mach_commands.py (clang-format)
+ # + documentation
+ # + localization files
+ extensions:
+ - js
+ - jsm
+ - jxs
+ - mjs
+ - xml
+ - html
+ - xhtml
+ - cpp
+ - c
+ - h
+ - configure
+ - py
+ - properties
+ - rst
+ - md
+ - ftl
+ support-files:
+ - 'tools/lint/spell/**'
+ - 'comm/tools/lint/spell/**'
+ type: external
+ setup: spell:setup
+ payload: commlint:lint_wrapper
+ wraps: spell:lint
diff --git a/comm/tools/lint/commlint/__init__.py b/comm/tools/lint/commlint/__init__.py
new file mode 100644
index 0000000000..19d887e109
--- /dev/null
+++ b/comm/tools/lint/commlint/__init__.py
@@ -0,0 +1,111 @@
+# 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/.
+
+import os
+from contextlib import contextmanager
+from pathlib import Path
+
+from mozlint.pathutils import expand_exclusions
+from mozlint.types import supported_types
+from mozpack import path as mozpath
+
+COMM_EXCLUSION_FILES = [
+ os.path.join("comm", "tools", "lint", "ThirdPartyPaths.txt"),
+ os.path.join("comm", "tools", "lint", "Generated.txt"),
+]
+
+TASKCLUSTER_EXCLUDE_PATHS = (os.path.join("comm", "suite"),)
+
+
+@contextmanager
+def pushd(dest_path: Path):
+ """
+ Sets the cwd within the context
+ :param Path dest_path: The path to the cwd
+ """
+ origin = Path().absolute()
+ try:
+ os.chdir(dest_path)
+ yield
+ finally:
+ os.chdir(origin)
+
+
+def _apply_global_excludes(root, config):
+ exclude = config.get("exclude", [])
+
+ for path in COMM_EXCLUSION_FILES:
+ with open(os.path.join(root, path), "r") as fh:
+ exclude.extend([mozpath.join(root, f.strip()) for f in fh.readlines()])
+
+ if os.environ.get("MOZLINT_NO_SUITE", None):
+ # Ignore Seamonkey-only paths when run from Taskcluster
+ suite_excludes = [mozpath.join(root, path) for path in TASKCLUSTER_EXCLUDE_PATHS]
+ exclude.extend(suite_excludes)
+
+ config["exclude"] = exclude
+
+
+# This makes support file paths absolute, allowing lintpref to find StaticPrefList.yaml
+def _expand_support_files(root, config):
+ support_files = config.get("support-files", [])
+ absolute_support_files = [mozpath.join(root, f) for f in support_files]
+ config["support-files"] = absolute_support_files
+
+
+def eslint_wrapper(paths, config, **lintargs):
+ comm_root = Path(lintargs["root"]) / "comm"
+ with pushd(comm_root):
+ rv = lint_wrapper(paths, config, **lintargs)
+
+ return rv
+
+
+def stylelint_wrapper(paths, config, **lintargs):
+ comm_root = Path(lintargs["root"]) / "comm"
+
+ ignore_file = str(comm_root / ".stylelintignore")
+ lintargs.setdefault("extra_args", [])
+ lintargs["extra_args"].extend(["--ignore-path", ignore_file])
+
+ with pushd(comm_root):
+ rv = lint_wrapper(paths, config, **lintargs)
+
+ return rv
+
+
+def black_lint(paths, config, fix=None, **lintargs):
+ from python.black import run_black
+
+ files = list(expand_exclusions(paths, config, lintargs["root"]))
+
+ # prepend "--line-length 99" to files, it will be processed as an argument
+ black_args = ["-l", "99"] + files
+
+ return run_black(
+ config,
+ black_args,
+ fix=fix,
+ log=lintargs["log"],
+ virtualenv_bin_path=lintargs.get("virtualenv_bin_path"),
+ )
+
+
+def lint_wrapper(paths, config, **lintargs):
+ _apply_global_excludes(lintargs["root"], config)
+ _expand_support_files(lintargs["root"], config)
+
+ payload = supported_types[config.get("wrappedType", config["type"])]
+ config["payload"] = config["wraps"]
+ del config["wraps"]
+
+ if config.get("wrappedType", ""):
+ config["type"] = config["wrappedType"]
+ del config["wrappedType"]
+
+ if config.get("commroot", False):
+ lintargs["root"] = os.path.join(lintargs["root"], "comm")
+ del config["commroot"]
+
+ return payload(paths, config, **lintargs)
diff --git a/comm/tools/lint/commlint/l10n_lint.py b/comm/tools/lint/commlint/l10n_lint.py
new file mode 100644
index 0000000000..ad880d5cde
--- /dev/null
+++ b/comm/tools/lint/commlint/l10n_lint.py
@@ -0,0 +1,16 @@
+# 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/.
+
+from python.l10n_lint import lint_strings, strings_repo_setup
+
+LOCALE = "comm-strings-quarantine"
+STRINGS_REPO = "https://hg.mozilla.org/projects/comm-strings-quarantine"
+
+
+def comm_strings_setup(**lint_args):
+ return strings_repo_setup(STRINGS_REPO, LOCALE)
+
+
+def lint(paths, lintconfig, **lintargs):
+ return lint_strings(LOCALE, paths, lintconfig, **lintargs)
diff --git a/comm/tools/lint/eslint.yml b/comm/tools/lint/eslint.yml
new file mode 100644
index 0000000000..f7ab22e0e8
--- /dev/null
+++ b/comm/tools/lint/eslint.yml
@@ -0,0 +1,18 @@
+---
+eslint:
+ description: JavaScript linter
+ # ESLint infra handles its own path filtering, so just include cwd
+ include: ['.']
+ exclude: []
+ extensions: ['mjs', 'js', 'jsm', 'json', 'jsx', 'html', 'sjs', 'xhtml']
+ support-files:
+ - 'comm/**/.eslintrc.js'
+ - 'comm/.eslintignore'
+ - 'comm/.prettierignore'
+ - 'tools/lint/eslint/**'
+ # Files that can influence global variables
+ - 'toolkit/modules/Services.jsm'
+ type: external
+ payload: commlint:eslint_wrapper
+ wraps: eslint:lint
+ setup: eslint:setup
diff --git a/comm/tools/lint/file-perm.yml b/comm/tools/lint/file-perm.yml
new file mode 100644
index 0000000000..aa20787d14
--- /dev/null
+++ b/comm/tools/lint/file-perm.yml
@@ -0,0 +1,55 @@
+---
+file-perm:
+ description: File permission check
+ include:
+ - comm/
+ extensions:
+ - .build
+ - .c
+ - .cc
+ - .cpp
+ - .flac
+ - .h
+ - .html
+ - .idl
+ - .js
+ - .jsm
+ - .jsx
+ - .m
+ - .md
+ - .m4s
+ - .mjs
+ - .mm
+ - .mozbuild
+ - .mp4
+ - .png
+ - .rs
+ - .rst
+ - .svg
+ - .ttf
+ - .wasm
+ - .webidl
+ - .xhtml
+ - .xml
+ - .xul
+ - .yml
+ support-files:
+ - 'tools/lint/file-perm/**'
+ type: external
+ payload: commlint:lint_wrapper
+ wraps: file-perm:lint
+
+maybe-shebang-file-perm:
+ description: "File permission check for files that might have `#!` header."
+ include:
+ - .
+ allow-shebang: true
+ extensions:
+ - .js
+ - .py
+ - .sh
+ support-files:
+ - 'tools/lint/file-perm/**'
+ type: external
+ payload: commlint:lint_wrapper
+ wraps: file-perm:lint
diff --git a/comm/tools/lint/file-whitespace.yml b/comm/tools/lint/file-whitespace.yml
new file mode 100644
index 0000000000..cd09b9c736
--- /dev/null
+++ b/comm/tools/lint/file-whitespace.yml
@@ -0,0 +1,27 @@
+---
+file-whitespace:
+ description: File content sanity check
+ include:
+ - comm/.
+ extensions:
+ - .c
+ - .cc
+ - .cpp
+ - .css
+ - .dtd
+ - .idl
+ - .ftl
+ - .h
+ - .html
+ - .md
+ - .properties
+ - .py
+ - .rs
+ - .rst
+ - .webidl
+ - .xhtml
+ support-files:
+ - 'tools/lint/file-whitespace/**'
+ type: external
+ payload: commlint:lint_wrapper
+ wraps: file-whitespace:lint
diff --git a/comm/tools/lint/fluent-lint.yml b/comm/tools/lint/fluent-lint.yml
new file mode 100644
index 0000000000..bb8ec8443a
--- /dev/null
+++ b/comm/tools/lint/fluent-lint.yml
@@ -0,0 +1,18 @@
+---
+fluent-lint:
+ description: Linter for Fluent files
+ include:
+ - .
+ exclude:
+ - dom/l10n/tests/mochitest/document_l10n/non-system-principal/localization/test.ftl
+ extensions: ['ftl']
+ support-files:
+ - 'tools/lint/fluent-lint/*.py'
+ - 'comm/tools/lint/fluent-lint/**'
+ brand-files:
+ - 'comm/mail/branding/thunderbird/locales/en-US/brand.ftl'
+ - 'toolkit/locales/en-US/toolkit/branding/brandings.ftl'
+ type: external
+ payload: commlint:lint_wrapper
+ wraps: fluent-lint:lint
+ commroot: true
diff --git a/comm/tools/lint/fluent-lint/exclusions.yml b/comm/tools/lint/fluent-lint/exclusions.yml
new file mode 100644
index 0000000000..9701e39086
--- /dev/null
+++ b/comm/tools/lint/fluent-lint/exclusions.yml
@@ -0,0 +1,82 @@
+# 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/.
+
+# Warning: Only exclusions for identifiers (ID01) are currently allowed.
+---
+# Only add exceptions to this file if the ID is generated programmatically and
+# can't easily be changed to follow the naming convention.
+# Only lowercase letters and hyphens should be used in Fluent IDs.
+ID01:
+ messages:
+ - accounts-ID
+ - msg-compose-partially-encrypted-inlinePGP
+ - trademarkInfo
+ # aboutDialog.ftl - exclusions same as Firefox
+ - aboutDialog-title
+ - aboutDialog-version
+ - aboutDialog-version-nightly
+ files:
+ # Files listed here must not have a comm/ prefix
+ # policies-descriptions.ftl: These IDs are generated programmatically
+ # from policy names.
+ - mail/locales/en-US/messenger/policies/policies-descriptions.ftl
+ # The webext-perms-description-* IDs are generated programmatically
+ - mail/locales/en-US/messenger/extensionPermissions.ftl
+ID02:
+ messages:
+ # comm/mail/locales/en-US/messenger/accountCentral.ftl
+ - read
+ - compose
+ - search
+ - filter
+ - e2e
+ # comm/mail/locales/en-US/messenger/otr/am-im-otr.ftl
+ - otr-log
+ # comm/mail/locales/en-US/messenger/otr/auth.ftl
+ - otr-auth
+ - auth-yes
+ - auth-no
+ - auth-how
+ # comm/mail/locales/en-US/messenger/otr/otr.ftl
+ - resent
+ # comm/mail/locales/en-US/messenger/preferences/passwordManager.ftl
+ - remove
+ - import
+ # comm/mail/locales/en-US/messenger/preferences/preferences.ftl
+ - ab-label
+ - keep-ask
+ files: []
+# Hard-coded brand names like Firefox or Mozilla should be used only in
+# specific cases, in all other cases the corresponding terms should be used.
+# Check with the localization team for advice.
+CO01:
+ messages:
+ # comm/mail/branding/thunderbird/locales/en-US/brand.ftl
+ - trademarkInfo
+ # comm/mail/locales/en-US/messenger/aboutRights.ftl
+ - rights-intro-point-1
+ - rights-intro-point-2
+ # comm/mail/locales/en-US/messenger/accountcreation/accountSetup.ftl
+ - account-setup-looking-up-db
+ - account-setup-success-settings-db
+ - account-setup-insecure-description
+ # Importers keep "Thunderbird" since that refers to a profile import
+ # of an installed Thunderbird application on the user's machine
+ # aboutImport.ftl
+ - app-name-thunderbird
+ - file-profile-description
+ # importDialog.ftl
+ - thunderbird-import-name
+ - thunderbird-import-description
+ - import-from-thunderbird-zip
+ - import-from-thunderbird-dir
+ # accountCentral.ftl - Donation appeals and descriptions about the Org
+ # rather than the product
+ - about-paragraph
+ - about-paragraph-consider-donation
+ # accountProvisioner.ftl - Refers to agreements made between the Org and
+ # third parties
+ - account-provisioner-mail-account-description
+ - account-provisioner-domain-description
+ files: []
diff --git a/comm/tools/lint/l10n.yml b/comm/tools/lint/l10n.yml
new file mode 100644
index 0000000000..4a01e2b127
--- /dev/null
+++ b/comm/tools/lint/l10n.yml
@@ -0,0 +1,41 @@
+---
+l10n:
+ description: Localization linter
+ # list of include directories of both
+ # comm/mail and comm/calendar l10n.tomls
+ # Paths that are not part of Thunderbird (editor/browser/devtools/etc)
+ # are included to
+ include:
+ - browser/locales/en-US/pdfviewer
+ - comm/calendar/locales/en-US
+ - comm/chat/locales/en-US
+ - comm/mail/branding/thunderbird/locales/en-US
+ - comm/mail/locales/en-US
+ - comm/tools/lint/l10n.yml
+ - devtools/client/locales/en-US
+ - devtools/shared/locales/en-US
+ - devtools/startup/locales/en-US
+ - dom/locales/en-US
+ - netwerk/locales/en-US
+ - security/manager/locales/en-US
+ - toolkit/locales/en-US
+ # files not supported by compare-locales,
+ # and also not relevant to this linter
+ exclude:
+ - comm/mail/locales/en-US/all-l10n.js
+ - comm/mail/extensions/openpgp/test
+ - comm/calendar/locales/en-US/README.txt
+ l10n_configs:
+ - comm/mail/locales/l10n.toml
+ - comm/calendar/locales/l10n.toml
+ type: external
+ payload: commlint:lint_wrapper
+ wraps: commlint.l10n_lint:lint
+ setup: commlint.l10n_lint:comm_strings_setup
+ support-files:
+ - 'comm/calendar/locales/l10n.toml'
+ - 'comm/mail/locales/l10n.toml'
+ - 'comm/tools/lint/l10n.yml'
+ - 'third_party/python/compare-locales/**'
+ - 'third_party/python/fluent/**'
+ - 'tools/lint/python/l10n_lint.py'
diff --git a/comm/tools/lint/license.yml b/comm/tools/lint/license.yml
new file mode 100644
index 0000000000..255d06595a
--- /dev/null
+++ b/comm/tools/lint/license.yml
@@ -0,0 +1,51 @@
+---
+license:
+ description: License Check
+ include:
+ - comm/
+ exclude:
+ # By design
+ - comm/build/macosx/hardenedruntime/developer.entitlements.xml
+ - comm/build/macosx/hardenedruntime/production.entitlements.xml
+ # License not super clear, Firefox excludes its branding
+ - comm/mail/branding/
+ # Mostly empty file
+ - comm/mail/base/content/overrides/app-license-name.html
+ # Need to verify
+ - comm/mail/components/im/messages
+ # Public Domain, but do not match pre-approved strings from Mozilla
+ - comm/mailnews/db/mork/morkDeque.cpp
+ - comm/mailnews/db/mork/morkDeque.h
+ # No license for README files
+ - comm/mailnews/jsaccount/readme.html
+ # License file in directory
+ - comm/mailnews/mime/jsmime
+ extensions:
+ - .c
+ - .cc
+ - .cpp
+ - .css
+ - .dtd
+ - .ftl
+ - .h
+ - .html
+ - .idl
+ - .java
+ - .js
+ - .jsm
+ - .jsx
+ - .m
+ - .mjs
+ - .mm
+ - .properties
+ - .py
+ - .rs
+ - .svg
+ - .xhtml
+ - .xml
+ - .xul
+ support-files:
+ - 'tools/lint/license/**'
+ type: external
+ payload: commlint:lint_wrapper
+ wraps: license:lint
diff --git a/comm/tools/lint/lintpref.yml b/comm/tools/lint/lintpref.yml
new file mode 100644
index 0000000000..2e45627925
--- /dev/null
+++ b/comm/tools/lint/lintpref.yml
@@ -0,0 +1,20 @@
+---
+lintpref:
+ description: Linter for static prefs.
+ include:
+ - 'comm/calendar/base/calendar.js'
+ - 'comm/chat/chat-prefs.js'
+ - 'comm/mail/app/profile/'
+ - 'comm/mail/branding/'
+ - 'comm/mail/components/compose/composer.js'
+ - 'comm/mail/components/im/all-im.js'
+ - 'comm/mail/locales/en-US/all-l10n.js'
+ - 'comm/mailnews/extensions/mdn/mdn.js'
+ - 'comm/mailnews/mailnews.js'
+ exclude: []
+ extensions: ['js']
+ type: external
+ payload: commlint:lint_wrapper
+ wraps: libpref:checkdupes
+ support-files:
+ - 'modules/libpref/init/StaticPrefList.yaml'
diff --git a/comm/tools/lint/mach_commands.py b/comm/tools/lint/mach_commands.py
new file mode 100644
index 0000000000..da503b2016
--- /dev/null
+++ b/comm/tools/lint/mach_commands.py
@@ -0,0 +1,24 @@
+# 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/.
+
+from mach.decorators import Command
+
+
+def setup_argument_parser():
+ from mozlint import cli
+
+ return cli.MozlintParser()
+
+
+@Command(
+ "commlint",
+ category="thunderbird",
+ description="Run linters with Thunderbird configurations.",
+ parser=setup_argument_parser,
+)
+def commlint(command_context, paths, extra_args=[], **kwargs):
+ kwargs["config_paths"].insert(0, "comm/tools/lint")
+ return command_context._mach_context.commands.dispatch(
+ "lint", command_context._mach_context, paths=paths, argv=extra_args, **kwargs
+ )
diff --git a/comm/tools/lint/mingw-capitalization.yml b/comm/tools/lint/mingw-capitalization.yml
new file mode 100644
index 0000000000..e6679988ab
--- /dev/null
+++ b/comm/tools/lint/mingw-capitalization.yml
@@ -0,0 +1,10 @@
+---
+mingw-capitalization:
+ description: >
+ "A Windows include file is not lowercase, and may break the MinGW build"
+ extensions: ['h', 'cpp', 'cc', 'c']
+ include: ['comm/']
+ type: external
+ level: error
+ payload: commlint:lint_wrapper
+ wraps: cpp.mingw-capitalization:lint
diff --git a/comm/tools/lint/rejected-words.yml b/comm/tools/lint/rejected-words.yml
new file mode 100644
index 0000000000..28d958568f
--- /dev/null
+++ b/comm/tools/lint/rejected-words.yml
@@ -0,0 +1,32 @@
+---
+avoid-blacklist-and-whitelist:
+ description: "Use words like 'skip', 'select', 'allow' or 'deny' instead"
+ level: error
+ include: ['comm/']
+ exclude:
+ - comm/tools/lint/rejected-words.yml
+ type: external
+ wrappedType: regex
+ payload: commlint:lint_wrapper
+ wraps: (black|white)[-_]?list
+ ignore-case: true
+ # same as codespell
+ extensions:
+ - c
+ - configure
+ - cpp
+ - ftl
+ - h
+ - html
+ - idl
+ - js
+ - jsm
+ - jxs
+ - md
+ - mjs
+ - properties
+ - py
+ - rst
+ - xhtml
+ - xml
+ - yml
diff --git a/comm/tools/lint/ruff.yml b/comm/tools/lint/ruff.yml
new file mode 100644
index 0000000000..1b7eb8a56b
--- /dev/null
+++ b/comm/tools/lint/ruff.yml
@@ -0,0 +1,17 @@
+---
+ruff:
+ description: An extremely fast Python linter, written in Rust
+ include: ["."]
+ extensions: ["py"]
+ support-files:
+ - "comm/**/.ruff.toml"
+ - "comm/**/ruff.toml"
+ - "comm/**/pyproject.toml"
+ - "tools/lint/python/ruff.py"
+ # Rules that should result in warnings rather than errors.
+ warning-rules: [PLR, PLW]
+ commroot: true
+ type: external
+ payload: commlint:lint_wrapper
+ wraps: python.ruff:lint
+ setup: python.ruff:setup
diff --git a/comm/tools/lint/shellcheck.yml b/comm/tools/lint/shellcheck.yml
new file mode 100644
index 0000000000..a51796c14e
--- /dev/null
+++ b/comm/tools/lint/shellcheck.yml
@@ -0,0 +1,14 @@
+---
+shellcheck:
+ description: Shell script linter
+ include:
+ - comm/
+ # 1090: https://github.com/koalaman/shellcheck/wiki/SC1090
+ # 'Can't follow a non-constant source'
+ extensions: ['sh']
+ support-files:
+ - 'tools/lint/shell/**'
+ excludecodes: ['1090', '1091']
+ type: external
+ payload: commlint:lint_wrapper
+ wraps: shell:lint
diff --git a/comm/tools/lint/spell/exclude-list.txt b/comm/tools/lint/spell/exclude-list.txt
new file mode 100644
index 0000000000..c9c6691027
--- /dev/null
+++ b/comm/tools/lint/spell/exclude-list.txt
@@ -0,0 +1,28 @@
+1nd
+aare
+acount
+aNumber
+aparent
+cas
+complies
+crate
+delink
+dur
+falsy
+files'
+fpr
+incrementall
+keyserver
+keyservers
+msdos
+nd
+Nd
+optin
+referer
+te
+thru
+tring
+ue
+warmup
+wasn
+whats
diff --git a/comm/tools/lint/stylelint.yml b/comm/tools/lint/stylelint.yml
new file mode 100644
index 0000000000..f23297cd26
--- /dev/null
+++ b/comm/tools/lint/stylelint.yml
@@ -0,0 +1,17 @@
+---
+stylelint:
+ description: CSS linter
+ # Stylelint infra handles its own path filtering, so just include cwd
+ include: ['.']
+ exclude: []
+ extensions: ['css']
+ support-files:
+ - 'package.json'
+ - 'comm/**/.stylelintrc.js'
+ - 'comm/.stylelintignore'
+ - 'tools/lint/stylelint/**'
+ type: external
+ stylelint-rc: comm/.stylelintrc.js
+ payload: commlint:stylelint_wrapper
+ wraps: stylelint:lint
+ setup: stylelint:setup
diff --git a/comm/tools/lint/trojan-source.yml b/comm/tools/lint/trojan-source.yml
new file mode 100644
index 0000000000..ba030bff28
--- /dev/null
+++ b/comm/tools/lint/trojan-source.yml
@@ -0,0 +1,17 @@
+---
+trojan-source:
+ description: Trojan Source attack - CVE-2021-42572
+ include:
+ - comm/
+ extensions:
+ - .c
+ - .cc
+ - .cpp
+ - .h
+ - .py
+ - .rs
+ support-files:
+ - 'tools/lint/trojan-source/**'
+ type: external
+ payload: commlint:lint_wrapper
+ wraps: trojan-source:lint
diff --git a/comm/tools/lint/yaml.yml b/comm/tools/lint/yaml.yml
new file mode 100644
index 0000000000..9451d52d3c
--- /dev/null
+++ b/comm/tools/lint/yaml.yml
@@ -0,0 +1,12 @@
+---
+yamllint:
+ description: YAML linter
+ include:
+ - comm/
+ extensions: ['yml', 'yaml']
+ support-files:
+ - '**/.yamllint'
+ - 'tools/lint/yamllint_/**'
+ type: external
+ payload: commlint:lint_wrapper
+ wraps: yamllint_:lint