Диспетчеризация действий из фонового скрипта с использованием webext-redux - PullRequest
0 голосов
/ 29 июня 2019

Я работаю над расширением Chrome в React, которое вызывает асинхронную функцию в фоновом скрипте.Для этого пользователь нажимает кнопку в скрипте содержимого, которая запускает эту функцию.Во время выполнения сценария кнопка показывает значок загрузки и должна вернуться к исходному сценарию.Я использую webext-redux для Redux в расширении: https://github.com/tshaddix/webext-redux

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

Сценарий содержимого

componentDidMount() {
   chrome.runtime.onMessage.addListener(
        (request) => {
            if(request.action === "syncComplete") {
                this.props.dispatch(syncing(false))
            }
        });
}

sync() {
  this.props.dispatch(syncing(true));
  chrome.runtime.sendMessage({action: "sync"});
}

render() {
  <a onClick={() => this.sync()}>
    {this.props.syncing ? (<span><Icon type="loading" /> Syncing...</span>) : "Force Sync" }
  </a>
}

Фоновый сценарий

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse){
  if(request.action === "sync") startImport();
  return true
});

async function startImport() {
     ...
  // Large async function
  // On complete or fail do:
  chrome.tabs.query({url: "https://example.com/*"}, (tabs) => {
      for (var i=0; i<tabs.length; ++i) {
          chrome.tabs.sendMessage(tabs[i].id, {action: "syncComplete"});
      }
  });
}

Проблема, с которой я сталкиваюсь, заключается в том, что моя асинхронная функциявыполняется в фоновом сценарии (преднамеренно, чтобы пользователь мог продолжать перемещаться по сайту, на котором включен сценарий содержимого), если пользователь закрывает вкладку сценария содержимого и завершает фоновый сценарий, не выполняется сценарий содержимого для получения сообщения Chrome дляотправить действие синхронизации.Таким образом, все расширение застревает в постоянном состоянии «загрузки» на кнопке.

Кто-нибудь знает, как я могу справиться с этим или можно ли отправить действие из фонового скрипта?

1 Ответ

0 голосов
/ 29 июня 2019

Как только вкладка закрыта, экземпляр сценария содержимого вместе с ним также исчезает, и больше невозможно отправить действие с фоновой страницы в этот сценарий содержимого. (Даже если пользователь нажмет Ctrl-Shift-T для этой вкладки, у него будет новый tabid.)

Вы упоминаете, что ваше расширение застревает в "состоянии загрузки". Один из способов исправить это - сохранить флаг в localStorage фоновой страницы, например localStorage.hasPendingUpdate. В следующий раз, когда вы загрузите вкладку example.com, отправьте сообщение на фоновую страницу с вопросом, есть ли какие-либо ожидающие обновления. Если это так, фоновая страница отправит эту вкладку в ожидании обновления.

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