by nradiowave, Разработка расширений | Переход на manifest v3, #manifest #chrome #google #extension #development #разработка #manifest_v3

Всем доброго времени. Уже довольно давно веду поддержку одного расширения связанного с пакетным скачиванием картинок (Kelly Image Downloader) и решил поделится некоторыми наблюдениями касательно перехода на новый стандарт (v3) регламентирующий работу расширения с функционалом API браузера.

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

К сожалению новый формат существенно ограничивает существующий в (v2) функционал некоторых расширений.  

Из основных минусов :

- Убрано API webRequest (webRequestBlocking) - это существенно ударит по функционалу расширений которые могут фильтровать или исправлять запросы, в основном это используется как раз в блокировщиках (adBlock) рекламы, менеджерах загрузок. Такие расширения потребуется существенно переписать с учетом ограничений. Частично функционал компенсирует новое API declarativeNetRequest. Оно может работать только с заранее подготовленными таблицами правил (кол-во правил в отличии от динамической обработки событий выполнения запросов строго ограничено), без возможности создания сложной логики при построении запроса \ ответа.

- Убраны фоновые страницы (параметр background - script в manifest v2). Используя эти страницы расширение получало доступ к некоторым методам Browser API. Частично функционал восполняется возможностью создать вместо фоновой страницы Service Worker. 

Sevice Worker (SW) в отличии от полноценной фоновой страницы имеет ряд ограничений :

1. SW автоматически завершает работу при определенном времени простоя (10-15сек.). Соответственно в таком случае аналога параметру persistent (manifest v2), позволяющему создать постоянный фоновый процесс не предусмотрено.

2. SW не имеет window из-за чего все дочерние методы и объекты будут недоступны (например window.localStorage, window.URL и другие переменные характерные для окружения конкретного браузера вроде chrome, addons и т.п.)

Конечно этот список недостатков нового стандарта лишь вершина айсберга. Я лишь хотел обозначить наиболее "болезненные" моменты на мой взгляд.

Полный список и документация по новому стандарту доступна здесь

На данный момент уже можно полноценно перевести свое расширение на новую версию чтобы не иметь проблем с совместимостью с браузером в будущем.

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

Это тестовое расширение вы можете использовать в качестве примера скелета новой структуры файла manifest.json (в качестве примера также представлен вариант того как манифест выглядел бы для версии v2 в файле - manifest_v2.json).

В данном случае расширение показывает работу с SW, и просто скачивает файл "test.txt" в папку "test" относительно папки загрузок браузера. Но версию 88 оно к сожалению крешит (баг вызван методом chrome.downloads.download)

Обратная связь по этому багу уже получена (bug tracker) и скорее всего его поправят в след. версиях браузера.

В качестве более наглядного скелета манифеста расширения еще можно использовать манифест из моего основного расширения .

Из заметных и наименее очевидных отличий :

параметр "web_accessible_resources" стал иметь более сложную структуру

"web_accessible_resources": [{ "resources": ["env/css/*.css", "env/pages/*.js", "env/profile/*.js", "env/dynamic/*.js"], "matches": [], "extension_ids": [] }]

параметры "browser_action", "page_action" унифицированы в "action"

"action": { "default_popup": "env/html/recorderPopup.html", "default_icon": { "32": "env/img/icon32x32.png" } }

в качестве атрибутов для параметра "background" теперь может быть задан только SW и только одним файлом размещенным в корневой папке расширения

Код manifest:

"background": { "service_worker": "kmerged.bg.js" }

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

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

Картинки Рисунок №1 by nradiowave, Разработка расширений | Переход на manifest v3, #manifest #chrome #google #extension #development #разработка #manifest_v3