Перейти к основному содержимому

Безопасный режим

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

Что делает безопасный режим

Безопасный режим активируется параметром ?safe=1 в URL. Он обрабатывается до загрузки любого кода пакетов:

  • CSS сторонних тем и оверрайды токенов не добавляются в документ.
  • Точки входа сторонних плагинов никогда не выполняются, включая устаревшие точки входа.
  • Встроенная тема и встроенный рантайм плагинов остаются активными.

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

Почему сломанная тема не может заблокировать восстановление

Пользователя защищают от сломанной темы несколько гарантий:

  • Предпросмотр до применения — темы предпросматриваются до активации, а установка пакета никогда не активирует его автоматически.
  • Безопасный режим до пакетов?safe=1 обрабатывается до обращения к реестру тем, поэтому даже тема, чей CSS роняет рендерер, никогда не загружается.
  • Кнопка сброса — действие сброса возвращает встроенную тему, удаляет ссылки на CSS рантайма и очищает инлайн-оверрайды --st-*. Удаление активной темы также сбрасывает сохранённый выбор темы.
  • Темы не могут скрыть Settings — навигационная панель всегда сохраняет доступность элемента Settings, потому что пропущенные системные элементы восстанавливаются в стандартном порядке. В безопасном режиме используется встроенный порядок панели, и переключатель меню остаётся доступным.
  • Никакого выполнения кода — темы вообще не содержат JavaScript. Это CSS, токены и декларативный макет, поэтому нет кода темы, который мог бы выполниться до вступления безопасного режима в силу.

Ограничения пакетов тем

Пакет темы никогда не получает доступа к чатам, API-ключам или файловой системе. Его таблицы стилей проверяются на запрещённые конструкции (@import, удалённые URL, URL javascript:, expression(), !important и другие) до принятия, а его токены должны быть безопасными CSS-значениями. В Theme SDK нет исполняемой точки входа.

Безопасный режим для плагинов

Тот же переключатель отключает сторонние плагины. Песочницы плагинов, изоляция процессов и обеспечиваемая хостом очистка — это слой рантайма; безопасный режим — это переключатель «на всякий случай», который предотвращает загрузку недоверенного кода в первую очередь. Детали со стороны плагинов см. в Песочнице плагинов.

Программная проверка безопасного режима

Пакет @neotavern/theme-sdk экспортирует getSafeModeFromSearch(search), который разбирает строку поиска URL и возвращает, присутствует ли ?safe=1. Хост использует его как единственный шлюз перед загрузкой CSS пакетов и оверрайдов токенов, и та же функция доступна альтернативным хостам.

Об областях оболочки, которые остаются доступными в безопасном режиме, см. Контракт оболочки.