Hi Juraj,
First of all, I just want to let you know that I am very grateful for your help and advice.
I abandoned the idea of sending a response because I couldn’t get it to work. Instead, I just send a new message from the background script to the options page.
I’ve also modified the background script taking your kind advice into account. Here’s the result: (it does look cleaner!)
/// Handle Incoming Messages
// Functions used to handle incoming messages
function isActive(tab) {
return tab.active;
}
function queryAllTabs() {
return browser.tabs.query({ currentWindow: true });
}
async function handleDoSearch(data) {
const id = data.id;
if (debug) console.log('Search engine id: ' + id);
if (debug) console.log(contextsearch_openSearchResultsInSidebar);
if (contextsearch_openSearchResultsInSidebar) {
searchUsing(id, null);
return;
}
const tabs = await queryAllTabs();
const activeTab = tabs.filter(isActive)[0];
const lastTab = tabs[tabs.length - 1];
let tabPosition = activeTab.index + 1;
if (contextsearch_multiMode === 'multiAfterLastTab') {
tabPosition = lastTab.index + 1;
}
if (id === 'multisearch') {
processMultiTabSearch([], tabPosition);
return;
}
if (contextsearch_openSearchResultsInLastTab) {
tabPosition = lastTab.index + 1;
}
searchUsing(id, tabPosition);
}
async function handleReset() {
const response = await reset();
if (debug) console.log(response);
sendMessageToOptionsPage(response, null);
}
async function handleSaveSearchEngines(data) {
searchEngines = sortByIndex(data);
if (debug) console.log(searchEngines);
await browser.storage.local.clear();
if (debug) console.log('Local storage cleared.');
await saveSearchEnginesToLocalStorage(false);
rebuildContextMenu();
}
async function handleAddNewSearchEngine(data) {
const id = data.id;
let domain;
if (!id.startsWith("separator-")) {
domain = getDomain(data.searchEngine.url);
if (debug) console.log(id, domain);
searchEngines[id] = data.searchEngine;
}
searchEngines = sortByIndex(searchEngines);
await addNewSearchEngine(id, domain);
}
async function handleUpdateSearchOptions(data) {
const options = await getOptions();
options.exactMatch = data.exactMatch;
await setOptions(options, true, false);
}
async function handleUpdateDisplayFavicons(data) {
const options = await getOptions();
options.displayFavicons = data.displayFavicons;
await setOptions(options, true, true);
}
async function handleUpdateDisableAltClick(data) {
const options = await getOptions();
options.disableAltClick = data.disableAltClick;
await setOptions(options, true, false);
}
async function handleUpdateTabMode(data) {
const options = await getOptions();
options.tabMode = data.tabMode;
options.tabActive = data.tabActive;
options.lastTab = data.lastTab;
options.privateMode = data.privateMode;
await setOptions(options, true, false);
}
async function handleUpdateMultiMode(data) {
const options = await getOptions();
options.multiMode = data.multiMode;
await setOptions(options, true, false);
}
async function handleUpdateOptionsMenuLocation(data) {
const options = await getOptions();
options.optionsMenuLocation = data.optionsMenuLocation;
await setOptions(options, true, true);
}
async function handleUpdateSiteSearchSetting(data) {
const options = await getOptions();
options.siteSearch = data.siteSearch;
options.siteSearchUrl = data.siteSearchUrl;
await setOptions(options, true, true);
}
async function handleUpdateResetOptions(data) {
const options = await getOptions();
options.forceSearchEnginesReload = data.resetOptions.forceSearchEnginesReload;
options.resetPreferences = data.resetOptions.resetPreferences;
options.forceFaviconsReload = data.resetOptions.forceFaviconsReload;
await setOptions(options, true, false);
}
async function handleUpdateUseRegex(data) {
const options = await getOptions();
options.useRegex = data.useRegex;
await setOptions(options, true, true);
}
async function handleSaveSearchEnginesToDisk(data) {
await browser.downloads.download({
url: data,
saveAs: true,
filename: 'searchEngines.json',
});
}
// Listen for messages from the content or options script
browser.runtime.onMessage.addListener((message, sender) => {
const action = message.action;
const data = message.data;
switch (action) {
case 'doSearch':
handleDoSearch(data);
break;
case 'notify':
if (notificationsEnabled) notify(data);
break;
case 'setSelection':
if (debug) console.log(`Selected text: ${data}`);
if (data) selection = data;
break;
case 'reset':
handleReset();
break;
case 'setTargetUrl':
if (data) targetUrl = data;
break;
case 'testSearchEngine':
testSearchEngine(data);
break;
case 'saveSearchEngines':
handleSaveSearchEngines(data);
break;
case 'addNewSearchEngine':
handleAddNewSearchEngine(data);
break;
case 'updateSearchOptions':
handleUpdateSearchOptions(data);
break;
case 'updateDisplayFavicons':
handleUpdateDisplayFavicons(data);
break;
case 'updateDisableAltClick':
handleUpdateDisableAltClick(data);
break;
case 'updateTabMode':
handleUpdateTabMode(data);
break;
case 'updateMultiMode':
handleUpdateMultiMode(data);
break;
case 'updateOptionsMenuLocation':
handleUpdateOptionsMenuLocation(data);
break;
case 'updateSiteSearchSetting':
handleUpdateSiteSearchSetting(data);
break;
case 'updateResetOptions':
handleUpdateResetOptions(data);
break;
case 'updateUseRegex':
handleUpdateUseRegex(data);
break;
case 'saveSearchEnginesToDisk':
handleSaveSearchEnginesToDisk(data);
break;
case 'hidePageAction':
browser.pageAction.hide(sender.tab.id);
break;
case 'showPageAction':
browser.pageAction.show(sender.tab.id);
break;
default:
break;
}
});/// Handle Incoming Messages
// Functions used to handle incoming messages
function isActive(tab) {
return tab.active;
}
function queryAllTabs() {
return browser.tabs.query({ currentWindow: true });
}
async function handleDoSearch(data) {
const id = data.id;
if (debug) console.log('Search engine id: ' + id);
if (debug) console.log(contextsearch_openSearchResultsInSidebar);
if (contextsearch_openSearchResultsInSidebar) {
searchUsing(id, null);
return;
}
const tabs = await queryAllTabs();
const activeTab = tabs.filter(isActive)[0];
const lastTab = tabs[tabs.length - 1];
let tabPosition = activeTab.index + 1;
if (contextsearch_multiMode === 'multiAfterLastTab') {
tabPosition = lastTab.index + 1;
}
if (id === 'multisearch') {
processMultiTabSearch([], tabPosition);
return;
}
if (contextsearch_openSearchResultsInLastTab) {
tabPosition = lastTab.index + 1;
}
searchUsing(id, tabPosition);
}
async function handleReset() {
const response = await reset();
if (debug) console.log(response);
sendMessageToOptionsPage(response, null);
}
async function handleSaveSearchEngines(data) {
searchEngines = sortByIndex(data);
if (debug) console.log(searchEngines);
await browser.storage.local.clear();
if (debug) console.log('Local storage cleared.');
await saveSearchEnginesToLocalStorage(false);
rebuildContextMenu();
}
async function handleAddNewSearchEngine(data) {
const id = data.id;
let domain;
if (!id.startsWith("separator-")) {
domain = getDomain(data.searchEngine.url);
if (debug) console.log(id, domain);
searchEngines[id] = data.searchEngine;
}
searchEngines = sortByIndex(searchEngines);
await addNewSearchEngine(id, domain);
}
async function handleUpdateSearchOptions(data) {
const options = await getOptions();
options.exactMatch = data.exactMatch;
await setOptions(options, true, false);
}
async function handleUpdateDisplayFavicons(data) {
const options = await getOptions();
options.displayFavicons = data.displayFavicons;
await setOptions(options, true, true);
}
async function handleUpdateDisableAltClick(data) {
const options = await getOptions();
options.disableAltClick = data.disableAltClick;
await setOptions(options, true, false);
}
async function handleUpdateTabMode(data) {
const options = await getOptions();
options.tabMode = data.tabMode;
options.tabActive = data.tabActive;
options.lastTab = data.lastTab;
options.privateMode = data.privateMode;
await setOptions(options, true, false);
}
async function handleUpdateMultiMode(data) {
const options = await getOptions();
options.multiMode = data.multiMode;
await setOptions(options, true, false);
}
async function handleUpdateOptionsMenuLocation(data) {
const options = await getOptions();
options.optionsMenuLocation = data.optionsMenuLocation;
await setOptions(options, true, true);
}
async function handleUpdateSiteSearchSetting(data) {
const options = await getOptions();
options.siteSearch = data.siteSearch;
options.siteSearchUrl = data.siteSearchUrl;
await setOptions(options, true, true);
}
async function handleUpdateResetOptions(data) {
const options = await getOptions();
options.forceSearchEnginesReload = data.resetOptions.forceSearchEnginesReload;
options.resetPreferences = data.resetOptions.resetPreferences;
options.forceFaviconsReload = data.resetOptions.forceFaviconsReload;
await setOptions(options, true, false);
}
async function handleUpdateUseRegex(data) {
const options = await getOptions();
options.useRegex = data.useRegex;
await setOptions(options, true, true);
}
async function handleSaveSearchEnginesToDisk(data) {
await browser.downloads.download({
url: data,
saveAs: true,
filename: 'searchEngines.json',
});
}
// Listen for messages from the content or options script
browser.runtime.onMessage.addListener((message, sender) => {
const action = message.action;
const data = message.data;
switch (action) {
case 'doSearch':
handleDoSearch(data);
break;
case 'notify':
if (notificationsEnabled) notify(data);
break;
case 'setSelection':
if (debug) console.log(`Selected text: ${data}`);
if (data) selection = data;
break;
case 'reset':
handleReset();
break;
case 'setTargetUrl':
if (data) targetUrl = data;
break;
case 'testSearchEngine':
testSearchEngine(data);
break;
case 'saveSearchEngines':
handleSaveSearchEngines(data);
break;
case 'addNewSearchEngine':
handleAddNewSearchEngine(data);
break;
case 'updateSearchOptions':
handleUpdateSearchOptions(data);
break;
case 'updateDisplayFavicons':
handleUpdateDisplayFavicons(data);
break;
case 'updateDisableAltClick':
handleUpdateDisableAltClick(data);
break;
case 'updateTabMode':
handleUpdateTabMode(data);
break;
case 'updateMultiMode':
handleUpdateMultiMode(data);
break;
case 'updateOptionsMenuLocation':
handleUpdateOptionsMenuLocation(data);
break;
case 'updateSiteSearchSetting':
handleUpdateSiteSearchSetting(data);
break;
case 'updateResetOptions':
handleUpdateResetOptions(data);
break;
case 'updateUseRegex':
handleUpdateUseRegex(data);
break;
case 'saveSearchEnginesToDisk':
handleSaveSearchEnginesToDisk(data);
break;
case 'hidePageAction':
browser.pageAction.hide(sender.tab.id);
break;
case 'showPageAction':
browser.pageAction.show(sender.tab.id);
break;
default:
break;
}
});
I removed the .catch(console.error); because I wasn’t sure where to place it!