2017-01-04 2 views
0

Вопрос: В Firefox WebExtensions, из произвольного происхождения фона, как я могу открыть произвольную страницу на вкладке, уникально?Firefox WebExtensions: Как открыть фоновую страницу как уникальную вкладку?

Требование:

1) Произвольный фон происхождение. Мой начальный вариант использования - из контекста browser_actionMenus. Тем не менее, этот метод должен работать из всплывающих окон, опций или любого настраиваемого сценария фона. На данный момент не касается страниц контента. Хотя, если техника работает и для них тоже, отлично.

2) Откройте произвольную страницу на вкладке. Мое начальное использование для страницы параметров, но техника должна работать для произвольных фоновых страниц (параметры, всплывающие окна или настраиваемые страницы).

3) Открыть однозначно. Если это первый раз, откройте новую вкладку. Если вкладка была открыта ранее, сфокусируйтесь на существующей вкладке, не создавайте дубликаты вкладок.

4) Если я закрою вкладку, мне нужно убедиться, что я удалю ссылку на ранее открытый идентификатор вкладки.

Я ответил на свой вопрос одним возможным решением.

Если решение может быть улучшено, сообщите мне. Спасибо.

Если вопрос является дубликатом, я удалю и отправлю решение в другом месте, если это необходимо.

+0

Вы задаете несколько вопросов: 1) Передайте параметр на вкладку, которую вы открываете (есть способ сделать это, что, на мой взгляд, проще, чем то, что вы описали, и можете работать для обеих страниц в фоновом режиме контекст и контент-скрипты); 2) Определите, открыта ли вкладка, содержащая нужный URL, если это фокус, если нет, откройте ее; и 3) [Обычно отправлять сообщения между страницами в фоновом контексте] (http://stackoverflow.com/a/41420772/3773011). Эти три вещи являются отдельными Вопросами. Разделите их на [разные вопросы] (http://stackoverflow.com/questions/ask). – Makyen

+0

Когда я написал этот вопрос, полагаю, я просто собирал свои мысли, и, как я думал, один вопрос превратился в несколько. Будет редактировать и создавать другие вопросы. – user314159

+0

Нет проблем, я знаю, как это может произойти. Официально я должен был проголосовать, чтобы закрыть этот вопрос как слишком широкий (по одному вопросу на вопрос). Я считаю, что это может быть хорошим вопросом (вопросами), если он более сфокусирован. У меня есть идеи о том, как сделать 1 и 2. Для 1 у меня есть представление о том, как я это сделаю. Ваш описанный метод также должен работать и может быть наиболее уместным, в зависимости от того, что вы делаете. Для 2 у меня есть частичный код, который я использовал для других вещей. Для 3, очевидно, я уже предоставил связанный ответ. Пожалуйста, напишите мне, когда вы обновите вопрос и/или напишите дополнительные. – Makyen

ответ

0

Это попытка ответить на мой вопрос, добавив комментарии.

Этот простой пример предполагает, что все пейджеры живут в каталоге верхнего уровня, но это произвольно и легко изменено.

По существу, он состоит из четырех частей:

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, но кажется, что гораздо сложнее с мало или нет выгода.

+0

Что делать, если пользователь добавил закладку в закладки и ранее открыл ее независимо от 'tabCreate()'? – Makyen

+0

Хмм, я не рассматривал эту возможность, поскольку мой прецедент был ограничен внутренней страницей моего дополнения, в частности, чтобы открыть страницы из контекстного меню. Я мог бы настроить ответ, чтобы соответствовать решению. Хм, не знаю, как я буду обрабатывать случаи открытых страниц или закладки для добавления. Если никакие идентификаторы tabID не совпадают, тогда, возможно, посмотрите на tab.url, возможно, разверните мой глобальный объект, чтобы отслеживать краткое имя tab.id, tab.url. Хм, о, или обрабатывайте записи в обработчике tab.onCreated, но я не хочу отслеживать вкладки других, только мои собственные расширения.^_^ – user314159

+0

Вам не нужно отслеживать любые вкладки. Вы можете напрямую получить список объектов окна для страниц (вкладки, панели, фоновая страница, страницы параметров и т. Д.), Которые в настоящее время открыты в фоновом контексте вашего расширения из ['extension.getViews()'] (https : //developer.mozilla.org/en-US/Add-ons/WebExtensions/API/extension/getViews). Из объекта Window вы можете определить, к какому URL страница открыта. – Makyen

Смежные вопросы