«Не удалось установить соединение» при открытии всплывающего окна расширения - PullRequest
0 голосов
/ 05 июля 2019

Я разрабатываю свое первое расширение для Firefox и столкнулся с проблемой связи между скриптом содержимого и фоновым скриптом.

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

Error: Could not establish connection. Receiving end does not exist.

Эта ошибка чаще всего возникает, когда сайт завершает загрузку и пытается открыть всплывающее окно. При открытии куклы во время загрузки сайта все работает как положено (browser.tabs.onUpdated.addListener ожидает сайт и инициирует связь). Мне кажется сложным сценарий, в котором всплывающее окно может быть открыто во время загрузки сайта или после его завершения. При открытии во время загрузки сайта он должен ждать перед отправкой сообщения. Если сайт открыт после загрузки, он может начать общение без каких-либо проверок. Дело в том, что всплывающие события browser.tabs.onUpdated.addListener и browser.tabs.onActivated.addListener активны только при открытом всплывающем окне. Я думаю, что мне нужен слушатель, который не зависит от моего всплывающего окна.

site.js


window.addEventListener('load', function() {
  var dataObject = {};
  browser.runtime.onMessage.addListener(request => {

    // dataObject  creation

    return Promise.resolve({ response: dataObject });
  });

  setTimeout(function() {}, 500);
});

popup.js


(function() {
    var responseObj = {};

    function onError(error) {
      console.log(`${error}`);
    }

    function sendMessageToTabs(tabs) {
      for (let tab of tabs) {
        browser.tabs
          .sendMessage(tab.id, { message: 'requestdata' })
          .then(response => {
            responseObj = response.response;

            // responseObj processing here

          })
          .catch(onError);
      }
    }

    function connectToContent() {
      browser.tabs
        .query({
          currentWindow: true,
          active: true,
          status: 'complete'
        })
        .then(sendMessageToTabs)
        .catch(onError);
    }

    browser.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
      if (tab.status == 'complete' && tab.active) {
        connectToContent();
      }
    });

    browser.tabs.onActivated.addListener(connectToContent());

  })();
...