Расширение Chrome: правильное добавление пункта контекстного меню с непостоянной фоновой страницей

Я работаю над простым расширением для обмена ссылками (пробковая доска, удобочитаемость, вкусность и т. Д.), И у меня есть вопрос о том, как правильно работать с элементом контекстного меню. На моей непостоянной фоновой странице я звоню chrome.contextMenus.create а также chrome.contextMenus.onClicked.addListener настроить / ответить на контекстное меню.

Пункт контекстного меню работает как положено. Но на фоновой странице отображается следующая ошибка (сразу после ее запуска и до того, как я использовал запись):

contextMenus.create: Cannot create item with duplicate id id_share_link at chrome-extension://.../share.js:52:30 lastError:29 set  

Это заставило меня понять, что я ни в коем случае не убираю предмет или слушателя. Зная немного о javascript и расширениях, я задаюсь вопросом, правильно ли я все делаю. Я предполагаю, что этот код верхнего уровня будет повторяться каждый раз, когда вызывается фоновая страница. Так что будут созданы избыточные вызовы для создания и addListener (и, следовательно, ошибка, которую я вижу, регистрируясь).

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

Должен ли я обращаться с вещами по-другому?

3 ответа

Решение

Вы можете справиться с этим одним из двух способов:

  1. Вы можете добавить контекстное меню и слушателей при установке, используя:

    chrome.runtime.onInstalled.addListener(function() {
      /* Add context menu and listener */
    });
    
  2. Вы можете удалить контекстное меню и прослушиватель, а затем повторно добавлять его при каждом вызове файла.

Если вы хотите использовать страницу события, то есть непостоянную фоновую страницу, как вы ее называете, вы должны зарегистрировать контекстное меню через contextMenus.create в обработчике событий runtime.onInstalled, поскольку эти регистрации контекстного меню "сохраняются" в любом случае.

Вы должны добавить функцию слушателя для contextMenus.onClicked событие каждый раз, когда страница события перезагружается, хотя, поскольку регистрация вашего желания прослушать это событие сохраняется, в то время как сам обратный вызов обработчика этого не делает. Так вообще не звони contextMenus.onClicked.addListener от runtime.onInstalled, но с верхнего уровня или другого кода, который гарантированно будет выполняться при каждой загрузке страницы события.[ 1]

[решение больше не может иметь место, прочитайте комментарий]

runtime.onInstalled не сработает, если вы отключите / включите расширение.
Мое решение - всегда добавлять пункты меню и глотать ошибки:

'use strict';

{

  let seqId = 0;

  const createMenuLinkEntry = (title, tab2url) => {

    const id = (++seqId).toString();

    chrome.contextMenus.create({
      id: id,
      title: title,
      contexts: ['browser_action'],
    }, () => {

      const err = chrome.runtime.lastError;
      if(err) {
        console.warn('Context menu error ignored:', err);
      }

    });

  };

  createMenuLinkEntry('Go to Google', (tab) => 'https://google.com');
  createMenuLinkEntry('Go to GitHub', (tab) => 'https://github.com');

} // namespace
Другие вопросы по тегам