Source code

Revision control

Copy as Markdown

Other Tools

/* 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/. */
// Keys use the non-`pane` friendly form ("search", not "paneSearch").
// `resolveLegacyCategory` strips the `pane` prefix before lookup, so
// callers passing either form resolve to the same entry.
// Key names mirror the legacy anchor IDs exactly. There is no enforced
// convention, so they mix camelCase ("dnsOverHttps") and kebab-case
// ("migrate-autoclose"). When adding an entry, use the anchor ID form
// from the legacy caller verbatim.
export const LEGACY_PANE_MAPPINGS = new Map([
["privacy-permissions", { category: "permissionsData" }],
["privacy-sitedata", { category: "privacy", subcategory: "sitedata" }],
["privacy-vpn", { category: "privacy", subcategory: "vpn" }],
[
"privacy-trackingprotection",
{ category: "privacy", subcategory: "etpStatus" },
],
["privacy-doh", { category: "privacy", subcategory: "dnsOverHttps" }],
["search-locationBar", { category: "search", subcategory: "firefoxSuggest" }],
["general", { category: "sync" }],
[
"general-update-box-group",
{ category: "about", subcategory: "update-box-group" },
],
["general-update-state", { category: "about", subcategory: "update-state" }],
["general-cfraddons", { category: "tabsBrowsing", subcategory: "cfraddons" }],
[
"general-cfrfeatures",
{ category: "tabsBrowsing", subcategory: "cfrfeatures" },
],
["general-layout", { category: "tabsBrowsing", subcategory: "layout" }],
[
"general-link-preview",
{ category: "tabsBrowsing", subcategory: "link-preview" },
],
["general-migrate", { category: "sync", subcategory: "migrate" }],
[
"general-migrate-autoclose",
{ category: "sync", subcategory: "migrate-autoclose" },
],
["general-drm", { category: "tabsBrowsing", subcategory: "drm" }],
[
"general-fxtranslations",
{ category: "languages", subcategory: "translations" },
],
[
"general-translations",
{ category: "languages", subcategory: "translations" },
],
["general-netsettings", { category: "privacy", subcategory: "netsettings" }],
// Several home-* keys share the same destination because they all live in
// the same setting-group in the redesigned Home pane. Keys are kept
// distinct so the original anchor ID is preserved for downstream consumers
// that match on the exact subcategory value.
["home-homeOverride", { category: "home", subcategory: "homepage" }],
["home-newtabOverride", { category: "home", subcategory: "homepage" }],
["home-web-search", { category: "home", subcategory: "home" }],
["home-weather", { category: "home", subcategory: "home" }],
["home-topsites", { category: "home", subcategory: "home" }],
["home-support-firefox", { category: "home", subcategory: "home" }],
["home-highlights", { category: "home", subcategory: "home" }],
[
"privacy-permissions-block-popups",
{ category: "permissionsData", subcategory: "permissions-block-popups" },
],
["privacy-reports", { category: "permissionsData", subcategory: "reports" }],
["privacy-privacy-segmentation", { category: "privacy" }],
[
"privacy-payment-methods-autofill",
{
category: "passwordsAutofill",
subcategory: "payment-methods-autofill",
},
],
[
"privacy-credit-card-autofill",
{ category: "passwordsAutofill", subcategory: "credit-card-autofill" },
],
// Both legacy anchor IDs are intentional: the setting-group declares
// data-subcategory="addresses-autofill address-autofill" and
// responds to both. This preserves the original mapping for downstream
// consumers that match on either ID.
[
"privacy-addresses-autofill",
{ category: "passwordsAutofill", subcategory: "addresses-autofill" },
],
[
"privacy-address-autofill",
{ category: "passwordsAutofill", subcategory: "address-autofill" },
],
]);
/**
* Resolves a legacy category/subcategory pair (as produced by the hash split
* in `gotoPref()`) to its destination in the redesigned preferences when
* `browser.settings-redesign.enabled` is true. If no mapping exists, returns
* the input unchanged.
*
* @param {string} category
* The category name. Accepts either the `paneXyz` form or the friendly
* `xyz` form — the `pane` prefix is stripped before lookup.
* @param {string|null|undefined} subcategory
* The subcategory name, or a falsy value if there is no subcategory.
* @returns {{ category: string, subcategory: string|null }}
* The resolved category/subcategory pair. `subcategory` is `null` when
* the destination has no subcategory.
*/
export function resolveLegacyCategory(category, subcategory) {
// Only strip the `paneXxx` -> `xxx` form.
if (/^pane[A-Z]/.test(category)) {
category = category[4].toLowerCase() + category.slice(5);
}
let key = subcategory ? `${category}-${subcategory}` : category;
let dest =
LEGACY_PANE_MAPPINGS.get(key) ?? LEGACY_PANE_MAPPINGS.get(category);
if (!dest) {
return { category, subcategory: subcategory ?? null };
}
return { category: dest.category, subcategory: dest.subcategory ?? null };
}