Изменения в поведении BFCache с портами сообщений расширения.

Кэш назад/вперед (или BFCache) — это оптимизация браузера, которая обеспечивает мгновенную навигацию вперед и назад. Мы вносим изменения в Chrome BFCache, которые потенциально повлияют на расширения, использующие порты сообщений. Если у вас есть расширение Chrome, которое использует обмен сообщениями для взаимодействия между сценариями контента и вашим расширением, читайте дальше, чтобы узнать, как протестировать и адаптировать ваше расширение.

Порт сообщения расширения

Расширения взаимодействуют со сценарием содержимого или другими расширениями посредством передачи сообщений. Сообщения можно отправлять с помощью одноразовых запросов, вызывая runtime.sendMessage() и tabs.sendMessage() или используя повторно используемый порт сообщений. Пока порт активен, как сценарий содержимого, так и фоновый сценарий расширения могут повторно использовать порт для отправки сообщений друг другу.

Дополнительные сведения см. в разделе Передача сообщений .

Назад/вперед кеш

При переходе со страницы, поддерживающей BFCache , браузер позволяет странице со всем ее состоянием оставаться в памяти, но в не полностью активном состоянии. Если пользователь выполняет навигацию по истории (назад или вперед) к кэшированной странице, браузер попытается восстановить страницу из BFCache. Это ускоряет навигацию и улучшает работу пользователя в Интернете.

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

Дополнительную информацию см. в разделе Кэш назад/вперед .

Влияние портов сообщений расширения на BFCache

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

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

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

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

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

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

Новое поведение: закрытие канала сообщений, когда страница сохраняется в BFCache.

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

Поскольку канал закрыт, на страницу не будут отправляться сообщения, пока она находится в BFCache. Таким образом, страница не будет удалена из-за расширения.

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

// content script

let port;

window.addEventListener('pageshow', (event) => {
  if (event.persisted) {
    // The page is restored from BFCache, set up a new connection.
    port = chrome.runtime.connect();
  }
});

Подробнее о разговоре WECG от представителей разных браузеров (под выпуском 474).

Я затронут?

Новое поведение будет доступно в Chrome 123 под флагом, чтобы вы могли протестировать свой код. См. график для получения дополнительной информации. Используйте следующие шаги, чтобы протестировать свое расширение. Обратите внимание, что это всего лишь простой тест, и мы рекомендуем вам запускать Chrome с включенной функцией в течение определенного периода времени, поскольку может быть трудно предсказать, какие функции расширения могут вызвать проблемы.

  1. Убедитесь, что версия Chrome не ниже 123. В идеале используйте Chrome Canary, который имеет дополнительное предупреждение, упрощающее тестирование.
  2. Запустите Chrome со следующим флагом:

    --disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  3. Перейдите на страницу, которая поддерживает BFCache без запуска расширения (например, какой-нибудь простой сайт, например https://example.com/ ). Следуйте инструкциям по BFCache , чтобы убедиться, что он восстановлен из BFCache.

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

  5. Если из-за вытеснения страницу пришлось загрузить заново, а не из BFCache, и проблема, препятствующая восстановлению , — «ExtensionSentMessageToCachedFrame», то это изменение может повлиять на расширение.

    В Chrome Canary 124.0.6315.0 и новее вы также увидите на странице следующее предупреждение:

    Предупреждение отображается, когда страница не восстанавливается из BFCache.
    Предупреждение отображается, когда страница не восстанавливается из BFCache.

Как только будет подтверждено, что расширение публикует сообщения на странице BFCache, вы можете выполнить следующие действия, чтобы принудительно включить эксперимент и посмотреть, не нарушается ли какая-либо логика.

  1. Запустите Chrome со следующим флагом:

    --enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  2. Перейдите на страницу, которая не была восстановлена ​​из BFCache из-за «ExtensionSentMessageToCachedFrame».

  3. Двигайтесь вперед и назад. Страница должна быть восстановлена ​​сейчас, но канал сообщений между сценарием содержимого и сервис-воркером должен быть отключен.

  4. Проверьте, работает ли расширение как обычно; если нет, вам следует повторно подключиться вручную, как показано в предыдущем разделе.

График выпуска

Мы планируем постепенно наращивать новое поведение, начиная с Chrome 123. Вот подробный план:

Дата Запланированная веха
15 февраля Начните эксперимент с новым поведением в Chrome Canary и Dev.
1 марта Начните эксперимент с новым поведением в бета-версии Chrome.
18 марта Опубликуйте новое поведение для 4 процентов пользователей Chrome Stable.
25 марта Опубликуйте новое поведение для 50 процентов пользователей Chrome Stable.
2 апреля Эксперимент завершается, и новое поведение становится стандартным.