Поток обновления расширений Chrome


Я начинаю с разработки расширения chrome и у меня есть несколько вопросов, касающихся потока установки/обновления расширения и тестирования во время разработки:

  1. что происходит с фоновым скриптом после обновления расширения, выполняет ли chrome перезагрузку фонового скрипта ?
  2. отсоединяются ли скрипты содержимого от фонового скрипта после обновления расширения ?
  3. Если в фоновом скрипте есть onInstalled обработчик событий, что происходит с этим обработчиком событий, когда расширение Chrome updates (отсоединяется ли этот обработчик событий, и когда обновление заканчивается, новый обработчик присоединяется и затем выполняется или выполняется какой-то другой поток) ?
  4. Есть ли способ имитировать процесс обновления во время разработки для отладки событий, которые происходят во время процесса обновления, например для размещения расширения на каком-либо локальном сервере и обновления оттуда ?
  5. где искать документацию по темам, подобным этой и подобным, является ли исходный код chromium правильным местом или хотя бы отправная точка ?

Спасибо!

1 2

1 ответ:

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

Поведение зависит от того, есть ли у вас обработчик, чтобы chrome.runtime.onUpdateAvailable событие зарегистрировано и имеет ли ваше расширение постоянную фоновую страницу или страницу событий.

  • Если у вас есть постоянная фоновая страница:
    • Если вы обработаете это событие и вызовете chrome.runtime.reload(), расширение будет выгружено, а затем обновлено, прежде чем быть снова заряжен.
    • Если вы обработаете это событие и не вызовете chrome.runtime.reload(), то обновление будет применяться только при следующей перезагрузке расширения-вероятно, при следующей полной перезагрузке браузера.
    • Если вы не обработаете это событие вообще, расширение будет немедленно выгружено для обновления.
  • Если у вас есть страница непостоянных событий:
    • Если вы обработаете это событие и вызовете chrome.runtime.reload(), расширение будет обновлено перед повторной загрузкой.
    • Если вы не позвоните chrome.runtime.reload(), или вообще не обрабатывать событие, Chrome обновит расширение, когда страница события будет выгружена.
Нет никакого способа программно предотвратить обновление, как только фоновая страница будет выгружена по какой-либо причине.
  1. отсоединяются ли скрипты содержимого от фонового скрипта после обновления расширения?
Да, и это не очень красиво. Они входят в "осиротевшее" состояние, когда использование Chrome API дает несогласованные ошибки (некоторые ничего не делают, некоторые вызывают исключения), но все еще выполняются - например, любые прослушиватели событий DOM все равно будут срабатывать.

Таким образом, если вы хотите, чтобы скрипты содержимого работали немедленно, ваша задача:

  • программно внедрить скрипты в существующие вкладки, не делая предположения, что он не выполнялся ранее: очистка сначала, если это необходимо.
  • убедитесь, что осиротевшие копии перестали выполняться: либо заметив в старой копии, что она осиротела, или путем трансляции события DOM из новой копии.

Важное замечание о WebExtensions: Firefox, в отличие от Chrome, всегда повторно вставляет скрипты содержимого при загрузке на страницы, соответствующие записям манифеста. Обязательно примите это во внимание.

Есть несколько вопросов, которые охватывают это; например:

  1. Если в фоновом скрипте есть обработчик событий onInstalled, что происходит с этим обработчиком событий, когда chrome обновляет расширение (этот обработчик событий отсоединяется, и когда обновление заканчивается, новый обработчик присоединяется и затем выполняется или выполняется какой-то другой поток упражнялся)?

Поскольку обновление может произойти только во время выгрузки фоновой страницы, нет никакой сложной логики; она просто сработает при первой загрузке расширения после этого с details.reason == "update". Обязательно регистрируйте обработчик синхронно при загрузке скрипта (например, в коде верхнего уровня), иначе вы можете пропустить событие - обычно это касается только страниц событий, но я подозреваю, что это также важно здесь.

  1. есть ли способ имитировать процесс обновления во время разработка для отладки событий, происходящих в процессе обновления, например для размещения расширения на каком-то локальном сервере и обновления оттуда?
К сожалению, насколько мне известно, это больше невозможно, если вы не можете использоватьEnterprise Policy install . Ваш лучший выбор - иметь расширение в CWS, которое опубликовано как частное.

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

  1. Где искать документацию по темам, подобным этой и подобным, является ли исходный код chromium правильным местом или, по крайней мере, отправной точкой?

Хорошо.. Подробные вопросы коде Chromium-это, конечно, авторитетный источник. Вам также следует поискать StackOverflow, так как здесь уже накоплен большой объем знаний. Наконец, официальные документы предоставляют много информация, даже если она не сразу бросается в глаза -chrome.runtime например, API docs .