Это попытка ответить на мой вопрос, добавив комментарии.
Этот простой пример предполагает, что все пейджеры живут в каталоге верхнего уровня, но это произвольно и легко изменено.
По существу, он состоит из четырех частей:
1) глобальный объект tabIDs
для хранения имен страниц (без '.html'). Вы можете изменить это как полный путь, включая расширение, или сохранить имя страницы как краткое имя и модифицировать технику, чтобы использовать другой вариант, например путь для полного имени пути и т. Д.
2) Функция асинхронного использования (для использования новой функции ожидания) с именем tabCreate
, чтобы определить, открыт ли он и переключиться на него или создать новую вкладку.
3) Обработчик события onRemoved, tabRemove
для обработки очистки tabIDs
после закрытия закладки (если это был интерес).
4) Пример использования из пункта контекстного меню, передающий некоторые параметры page
и panel
, которые не имеют смысла в этом вопросе, но являются частью другого вопроса и здесь только для демонстрационных целей.
background.js:
// tabID contexts
// global var to keep track of different tabs,
// i.e. options.html, popup.html and so on.
var tabIDs = {
'options': null,
'popup': null,
}
// Requires Firefox 52.0+ to use async/await
// opts correspond to contexts above in tabIDs
// of the form { 'page': 'options' } or { 'page': 'popup' }
// note if using Node.js, this may require v7+ and --harmony_async_await
async function tabCreate (opts) {
var tab;
if (tabIDs[ opts.page ] !== null) {
// should probably bring window to front first... oops
// ..
// switch to tab
tab = await browser.tabs.update(tabIDs[ opts.page ], { active: true });
} else {
tab = await browser.tabs.create({
'url': opts.page + '.html'
});
tabIDs[ opts.page ] = tab.id;
}
console.log('**** opts.page = ' + opts.page + ', opts.tab = ' + opts.tab + ', tab.id = ' + tab.id);
}
// When tabs are closed, see if the tabID is in tabIDs,
// and if so, set it to null
function tabRemove (tabID, removeInfo) {
console.log('Closed TAB ' + tabID);
Object.keys(tabIDs).forEach(function(key, index) {
if (tabIDs[ key ] === tabID) {
tabIDs[ key ] = null;
return;
}
});
}
browser.tabs.onRemoved.addListener(tabRemove);
/*
* Context Menus
*/
browser.contextMenus.removeAll();
browser.contextMenus.create({
title: 'My Web Extension',
contexts: [ 'browser_action' ],
});
browser.contextMenus.create({
title: 'Options',
contexts: [ 'browser_action' ],
onclick: myWebExt_Options
});
function myWebExt_Options () {
tabCreate({
'page': 'options',
'panel': 1,
});
}
Другой подход может добавить слушателя событий для каждой страницы, и при закрытии, отправить сообщение обратно background.js, но кажется, что гораздо сложнее с мало или нет выгода.
Вы задаете несколько вопросов: 1) Передайте параметр на вкладку, которую вы открываете (есть способ сделать это, что, на мой взгляд, проще, чем то, что вы описали, и можете работать для обеих страниц в фоновом режиме контекст и контент-скрипты); 2) Определите, открыта ли вкладка, содержащая нужный URL, если это фокус, если нет, откройте ее; и 3) [Обычно отправлять сообщения между страницами в фоновом контексте] (http://stackoverflow.com/a/41420772/3773011). Эти три вещи являются отдельными Вопросами. Разделите их на [разные вопросы] (http://stackoverflow.com/questions/ask). – Makyen
Когда я написал этот вопрос, полагаю, я просто собирал свои мысли, и, как я думал, один вопрос превратился в несколько. Будет редактировать и создавать другие вопросы. – user314159
Нет проблем, я знаю, как это может произойти. Официально я должен был проголосовать, чтобы закрыть этот вопрос как слишком широкий (по одному вопросу на вопрос). Я считаю, что это может быть хорошим вопросом (вопросами), если он более сфокусирован. У меня есть идеи о том, как сделать 1 и 2. Для 1 у меня есть представление о том, как я это сделаю. Ваш описанный метод также должен работать и может быть наиболее уместным, в зависимости от того, что вы делаете. Для 2 у меня есть частичный код, который я использовал для других вещей. Для 3, очевидно, я уже предоставил связанный ответ. Пожалуйста, напишите мне, когда вы обновите вопрос и/или напишите дополнительные. – Makyen