Возьмём небольшое расширение для чтения: по нажатию на иконку оно берёт выделенный абзац текущей вкладки и предлагает короткое объяснение. Это конкретная задача с чувствительным шагом: если текст отправляется на серверную модель, содержимое страницы покидает браузер. Поэтому первым экраном должна быть не генерация ответа, а явное решение о том, какие разрешения и какая передача данных действительно нужны.
Архитектура: кто за что отвечает
manifest.jsonописывает имя/версию, action и нужные разрешения. Chrome требует manifest в корне расширения; актуальные примеры и поля описаны в Manifest reference (manifest file format).- Popup — маленькая панель с кнопкой «Объяснить выделение», состояниями отправки и ответом.
- Content script работает с DOM страницы, чтобы прочитать выделенный текст или вставить результат, если это нужно. Chrome описывает content scripts как средства взаимодействия с веб-страницей; статические match patterns и программное внедрение имеют разные правила (content scripts).
- Extension service worker обрабатывает события action, сообщения и работу с API. Он может завершаться при простое; Chrome рекомендует сохранять необходимое состояние вместо ожидания, что глобальная переменная переживёт остановку (lifecycle).
Для чтения выделенного текста запускай сценарий после явного действия пользователя. Chrome activeTab даёт временный доступ к активной вкладке после пользовательского жеста, а scripting позволяет инжектировать код при соответствующей конфигурации; это часто уже достаточно для одноразового действия без постоянного разрешения на все сайты (tutorial activeTab). Если расширение должно автоматически сканировать любую открытую страницу, объясни, зачем ему нужен более широкий host access.
Минимальные разрешения и прозрачная передача
Прототипу может понадобиться activeTab и scripting, а host_permissions — только если выбранный API или режим внедрения требует доступ к конкретным доменам. Не добавляй tabs, широкие *://*/* или постоянное чтение истории «на всякий случай». Chrome разделяет permissions, optional permissions, content script matches и host permissions; изменение match patterns может вызвать предупреждения у пользователя (Declare permissions). Если функция расширения необязательна, спроси разрешение в момент, когда понятно, зачем оно необходимо.
До API-запроса покажи, что отправляется: выделенный текст, URL страницы или оба поля; куда передаются данные; что пользователь может отменить. Не отправляй весь DOM, cookies или скрытые поля ради объяснения выбранного абзаца. Если передача выключена, локальный интерфейс должен так и сказать, а не симулировать ответ модели.
Перед отправкой текста стороннему API также определи границы передачи данных.
Запрос для первого билда
Создай Chrome Extension Manifest V3 для ручного объяснения выделенного текста. Кнопка запускается только после клика на extension action. Сначала покажи manifest, popup, content script и service worker как отдельные части. Используй только разрешения, необходимые для active-tab сценария; перечисли каждое и объясни его. Пока ответ модели замени явным test fixture, ничего не отправляй в сеть. При пустом выделении покажи инструкцию. Не запускай код и не утверждай, что расширение опубликовано.
После генерации проверь структуру и код под выбранную версию Chrome. Service worker может останавливаться и запускаться заново, поэтому проверяй обработчики после простоя и не храни важное состояние только в глобальной переменной. Если подключаешь API, ключ должен храниться на сервере, а не в пакете расширения.
Локальная проверка и упаковка
В локальной разработке Chrome позволяет загрузить распакованную папку через экран управления extensions с включённым developer mode; после изменения кода расширение нужно обновить и повторить сценарий. Проверь: обычный текст; пустое выделение; страницу, к которой нет доступа; закрытую вкладку; отменённый запрос; долгий ответ; отказ сервера; отсутствие сети; текст с приватными данными, который не должен уйти без согласия. Проверь разрешения на чистом профиле браузера, а не только в уже авторизованной сессии разработчика.
Перед ZIP-упаковкой убери ключи, тестовые адреса и лишние source maps, если они раскрывают приватную информацию. Перечитай manifest и список permissions, убедись, что описание магазина соответствует поведению. Chrome Web Store отдельно требует заполнить listing/privacy/distribution information и отправить элемент на review; review process зависит от элемента (publish documentation). Отправка пакета не означает, что его уже приняли или опубликовали. Публикацию не обещай до фактического статуса в кабинете.
Сначала получи маленькое расширение, которое честно читает выбранный фрагмент только после действия пользователя. Потом добавляй сетевую часть, сообщая, какие данные покидают браузер и кто их обрабатывает. Это позволит проверить permission boundary и основной сценарий до того, как появятся новые источники доступа.
