Расширение onUpdateAvailable путаница

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

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

chrome.runtime.onUpdateAvailable.addListener((details) => {
  var response = window.confirm(`${details.version} is now available`);
  if (response) {
    chrome.runtime.reload();
  }
});

Моя путаница

От: https://developer.chrome.com/docs/extensions/reference/runtime/#event-onUpdateAvailable

onUpdateAvailable

chrome.runtime.onUpdateAvailable.addListener(listener: function)

Fired when an update is available, but isn't installed immediately because the app is currently running. 
If you do nothing, the update will be installed the next time the background page gets unloaded, if you want it to be installed sooner you can explicitly call chrome.runtime.reload().
If your extension is using a persistent background page, the background page of course never gets unloaded, so unless you call chrome.runtime.reload() manually in response to this event the update will not get installed until the next time chrome itself restarts.
If no handlers are listening for this event, and your extension has a persistent background page, it behaves as if chrome.runtime.reload() is called in response to this event.

Я не понимаю последнюю фразу:

Если обработчики этого события не ожидают, а ваше расширение имеет постоянную фоновую страницу, оно ведет себя так, как будто в ответ на это событие вызывается chrome.runtime.reload(). .

Вопросы

  1. Как это возможно, если нет обработчиков события?
  2. Моя функция правильная?
  3. Как я могу проверить это?

Проблема

Я попытался установить версию 1.0.0 (текущая последняя версия намного выше) и загрузить ее как разрабатываемое расширение, но приглашение не появилось.


person lbragile    schedule 15.12.2020    source источник


Ответы (1)


Ваша функция верна, хотя я бы использовал chrome.windows.create с type из popup, чтобы показать неблокирующий диалог в html, отчасти потому, что подтверждение/предупреждение/подсказка не работают в Firefox при вызове в фоновом сценарии.

Как я могу проверить это?

https://stackoverflow.com/a/26276485

я не понимаю последнюю фразу

В документации по расширению довольно много плохо сформулированных фрагментов, поэтому мы прочитаем исходный код:

if (extensions::BackgroundInfo::HasPersistentBackgroundPage(old)) {
  const char kOnUpdateAvailableEvent[] = "runtime.onUpdateAvailable";
  return extensions::EventRouter::Get(profile_)->ExtensionHasEventListener(
             extension->id(), kOnUpdateAvailableEvent)
             ? DELAY
             : INSTALL;
}

Таким образом, документацию можно было бы улучшить следующим образом:

Если никакие обработчики не прослушивают это событие в расширении с постоянной фоновой страницей, Chrome сразу же обновляет расширение, вызывая chrome.runtime.reload() внутри.

person wOxxOm    schedule 15.12.2020
comment
Если я правильно понимаю, в моем случае (постоянный фон) этот прослушиватель событий на самом деле не нужен, так как расширение будет обновляться, как только будет выполнена проверка и доступно обновление? Но если мой фон не был постоянным, он обновлялся, когда фон выгружался. Итак, возникает вопрос, какова цель этого прослушивателя событий? - person lbragile; 15.12.2020
comment
Цель состоит в том, чтобы выполнить обновление в выбранное вами время и/или уведомить об этом и так далее. - person wOxxOm; 15.12.2020
comment
О, хорошо, я думаю, теперь я вижу. В основном для непостоянного фона он выгружается во время работы расширения, но этот прослушиватель событий может предупредить о событии обновления до того, как оно будет выгружено. Спасибо! - person lbragile; 15.12.2020