Поток обновления расширений Chrome
Я начинаю с разработки расширения chrome и у меня есть несколько вопросов, касающихся потока установки/обновления расширения и тестирования во время разработки:
- что происходит с фоновым скриптом после обновления расширения, выполняет ли chrome перезагрузку фонового скрипта ?
- отсоединяются ли скрипты содержимого от фонового скрипта после обновления расширения ?
- Если в фоновом скрипте есть onInstalled обработчик событий, что происходит с этим обработчиком событий, когда расширение Chrome updates (отсоединяется ли этот обработчик событий, и когда обновление заканчивается, новый обработчик присоединяется и затем выполняется или выполняется какой-то другой поток) ?
- Есть ли способ имитировать процесс обновления во время разработки для отладки событий, которые происходят во время процесса обновления, например для размещения расширения на каком-либо локальном сервере и обновления оттуда ?
- где искать документацию по темам, подобным этой и подобным, является ли исходный код chromium правильным местом или хотя бы отправная точка ?
Спасибо!
1 ответ:
- что происходит с фоновым скриптом после обновления расширения, выполняет ли Chrome перезагрузку фонового скрипта?
Поведение зависит от того, есть ли у вас обработчик, чтобы
chrome.runtime.onUpdateAvailable
событие зарегистрировано и имеет ли ваше расширение постоянную фоновую страницу или страницу событий.Нет никакого способа программно предотвратить обновление, как только фоновая страница будет выгружена по какой-либо причине.
- Если у вас есть постоянная фоновая страница:
- Если вы обработаете это событие и вызовете
chrome.runtime.reload()
, расширение будет выгружено, а затем обновлено, прежде чем быть снова заряжен.- Если вы обработаете это событие и не вызовете
chrome.runtime.reload()
, то обновление будет применяться только при следующей перезагрузке расширения-вероятно, при следующей полной перезагрузке браузера.- Если вы не обработаете это событие вообще, расширение будет немедленно выгружено для обновления.
- Если у вас есть страница непостоянных событий:
- Если вы обработаете это событие и вызовете
chrome.runtime.reload()
, расширение будет обновлено перед повторной загрузкой.- Если вы не позвоните
chrome.runtime.reload()
, или вообще не обрабатывать событие, Chrome обновит расширение, когда страница события будет выгружена.Да, и это не очень красиво. Они входят в "осиротевшее" состояние, когда использование Chrome API дает несогласованные ошибки (некоторые ничего не делают, некоторые вызывают исключения), но все еще выполняются - например, любые прослушиватели событий DOM все равно будут срабатывать.
- отсоединяются ли скрипты содержимого от фонового скрипта после обновления расширения?
Таким образом, если вы хотите, чтобы скрипты содержимого работали немедленно, ваша задача:
- программно внедрить скрипты в существующие вкладки, не делая предположения, что он не выполнялся ранее: очистка сначала, если это необходимо.
- убедитесь, что осиротевшие копии перестали выполняться: либо заметив в старой копии, что она осиротела, или путем трансляции события DOM из новой копии.
Важное замечание о WebExtensions: Firefox, в отличие от Chrome, всегда повторно вставляет скрипты содержимого при загрузке на страницы, соответствующие записям манифеста. Обязательно примите это во внимание.
Есть несколько вопросов, которые охватывают это; например:
- отправка сообщения из фонового сценария в сценарий содержимого, а затем во введенный сценарий (см. ответ)
- Как правильно обрабатывать обновления расширений chrome из скриптов контента
- повторная инъекция скрипта расширения Chrome после обновления или установки
- Если в фоновом скрипте есть обработчик событий
onInstalled
, что происходит с этим обработчиком событий, когда chrome обновляет расширение (этот обработчик событий отсоединяется, и когда обновление заканчивается, новый обработчик присоединяется и затем выполняется или выполняется какой-то другой поток упражнялся)?Поскольку обновление может произойти только во время выгрузки фоновой страницы, нет никакой сложной логики; она просто сработает при первой загрузке расширения после этого с
details.reason == "update"
. Обязательно регистрируйте обработчик синхронно при загрузке скрипта (например, в коде верхнего уровня), иначе вы можете пропустить событие - обычно это касается только страниц событий, но я подозреваю, что это также важно здесь.К сожалению, насколько мне известно, это больше невозможно, если вы не можете использоватьEnterprise Policy install . Ваш лучший выбор - иметь расширение в CWS, которое опубликовано как частное.
- есть ли способ имитировать процесс обновления во время разработка для отладки событий, происходящих в процессе обновления, например для размещения расширения на каком-то локальном сервере и обновления оттуда?
В определенной степени нажатие кнопки "перезагрузить" после внесения некоторых изменений в распакованное расширение имитирует то, что происходит во время обновления-за исключением события
onInstalled
.
- Где искать документацию по темам, подобным этой и подобным, является ли исходный код chromium правильным местом или, по крайней мере, отправной точкой?
Хорошо.. Подробные вопросы коде Chromium-это, конечно, авторитетный источник. Вам также следует поискать StackOverflow, так как здесь уже накоплен большой объем знаний. Наконец, официальные документы предоставляют много информация, даже если она не сразу бросается в глаза -
chrome.runtime
например, API docs .