Chrome Расширение - Узнайте, открыта ли вкладка расширения - PullRequest
2 голосов
/ 23 февраля 2020

Я установил, что когда я нажимаю на иконку extn - открывается моя extn index.html.
Если я нажимаю на иконку второй раз - я не хочу, чтобы она открывала вторую вкладку; Я хочу сфокусировать уже открытую вкладку (если она открыта).

Проблема с if it's open деталью. В идеале я не хотел бы просить разрешения tabs, поскольку это очень навязчиво. Из-за этого ограничения я не могу перебрать все открытые вкладки и проверить их URL.
Я пытался сохранить идентификатор вкладки extn в chrome.local.storage и проверять его, когда нажимаю кнопку extn, но всегда сохраняю актуальный номер вкладки оказалось довольно сложно. Главным препятствием было то, что когда Chrome закрыто - оно не запускает событие любого типа onClose; таким образом, я не могу очистить локальное хранилище устаревшего идентификатора вкладки extn.
Итак, когда я снова открываю Chrome, нажмите кнопку extn - он не откроет новую вкладку, потому что он может видеть старый идентификатор вкладки в хранилище и думает, что вкладка уже открыта.

Есть ли способ достичь результата без разрешения tabs?

1 Ответ

1 голос
/ 23 февраля 2020

Для встроенных параметров, показанных в chrome://extensions пользовательском интерфейсе, вы можете просто использовать chrome .runtime.openOptionsPage () , который позаботится о перефокусировке существующей вкладки.

Чтобы найти автономная вкладка вашего собственного расширения использует chrome .extension.getViews () и chrome .tabs.getCurrent () , вызываемые на JS window другой вкладки для получить собственную "текущую" вкладку:

function getOwnTabs() {
  return Promise.all(
    chrome.extension.getViews({type: 'tab'})
      .map(view =>
        new Promise(resolve =>
          view.chrome.tabs.getCurrent(tab =>
            resolve(Object.assign(tab, {url: view.location.href}))))));
}

async function openOptions(url) {
  const ownTabs = await getOwnTabs();
  const tab = ownTabs.find(tab => tab.url.includes(url));
  if (tab) {
    chrome.tabs.update(tab.id, {active: true});
  } else {
    chrome.tabs.create({url});
  }
}

Использование:

openOptions('index.html')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...