in src/js/background/context-menu.js [91:209]
init: async (currentWebsite = null) => {
if (!browser.contextMenus) {
throw new Error(`Cannot create browser menus`);
}
// Remove the listener so we don't add the same one multiple times
if (
browser.storage.onChanged.hasListener(
relayContextMenus.listeners.onLocalStorageChange
)
) {
await browser.storage.onChanged.removeListener(
relayContextMenus.listeners.onLocalStorageChange
);
}
const userApiToken = await browser.storage.local.get("apiToken");
const apiKeyInStorage = Object.prototype.hasOwnProperty.call(
userApiToken,
"apiToken"
);
if (!apiKeyInStorage) {
// User is not logged in. Do not do anything.
return;
}
// Reset any previously created menus
await browser.contextMenus.removeAll();
// Generate aliases menu item
// If a user is maxed out/not premium, the generate item will be disabled.
const canUserGenerateAliases =
await relayContextMenus.utils.getUserStatus.canGenerateMoreAliases();
const menuData = canUserGenerateAliases
? staticMenuData.generateAliasEnabled
: staticMenuData.generateAliasDisabled;
relayContextMenus.menus.create(menuData);
// COMPATIBILITY NOTE: Chrome uses the contextMenus API to create menus. Firefox built their own API, menus, based on it. It has additional features that are only available in Firefox. Anything wrapped in a (browser.menus) check is only executed in a browser that supports it.
if (browser.menus) {
const userHasSomeAliasesCreated =
(await relayContextMenus.utils.getUserStatus.getNumberOfAliases()) > 0;
const aliases = await relayContextMenus.utils.getAliases();
const masksWereGeneratedOrUsedOnCurrentWebsite =
await relayContextMenus.utils.checkIfAnyMasksWereGeneratedOrUsedOnCurrentWebsite(
currentWebsite
);
// Create Use Existing Alias submenu
if (
currentWebsite &&
masksWereGeneratedOrUsedOnCurrentWebsite &&
userHasSomeAliasesCreated
) {
await relayContextMenus.menus.create(
staticMenuData.existingAlias,
{
createExistingAliases: true,
parentMenu: staticMenuData.useExistingAliasFromWebsite,
exisitingSite: true,
currentWebsite,
},
aliases
);
}
// Create "Recent Aliases…" menu
if (userHasSomeAliasesCreated) {
await relayContextMenus.menus.create(
staticMenuData.existingAlias,
{
createExistingAliases: true,
parentMenu: staticMenuData.useExistingAlias,
exisitingSite: false,
currentWebsite,
},
aliases
);
}
}
const phoneMask = await relayContextMenus.utils.getPhoneMask();
if (phoneMask) {
await relayContextMenus.menus.create(staticMenuData.insertPhoneMask);
}
// Create "Manage all aliases" link
await relayContextMenus.menus.create(staticMenuData.manageAliases);
// Generate upgrade menu item for non-premium users
const canUserUpgradeToPremium =
await relayContextMenus.utils.getUserStatus.canUpgradeToPremium();
if (canUserUpgradeToPremium) {
// COMPATIBILITY NOTE: The Chrome contextMenus API create() argument params do not support icons
if (browser.menus) {
staticMenuData.upgradeToPremium.icons = { 32: "/icons/icon_32.png" };
}
await relayContextMenus.menus.create(
staticMenuData.upgradeToPremiumSeperator
);
await relayContextMenus.menus.create(staticMenuData.upgradeToPremium);
}
// Set listerners
browser.storage.onChanged.addListener(
relayContextMenus.listeners.onLocalStorageChange
);
// COMPATIBILITY NOTE: Refresh menus (not available on Chrome contextMenus API)
if (browser.menus) {
await browser.menus.refresh();
}
return Promise.resolve(1);
},