
Safari 27 вышел 14 сентября 2026 года вместе с iOS 27, iPadOS 27 и macOS 27. В примечаниях к релизу у Apple есть строка, которая значит больше, чем кажется на первый взгляд: тот же Safari приходит и на macOS 26, и на macOS Sequoia. То есть он не ограничен теми, кто перешёл на новую операционную систему. Он появляется у всех, кто ставит обновление Safari на двухлетнем Mac, и на каждом iPhone, который обновляется сам по себе ночью, а это большинство из них.
К концу недели значительная часть людей, заходящих на ваш сайт с iPhone, будет пользоваться другим браузером, чем в пятницу, и почти никто из них об этом не узнает. Именно поэтому выход браузера становится событием для багрепортов. Страница не изменилась. Изменятся отчёты о ней.
В анонсе беты на WWDC масштаб релиза оценили так: 58 новых функций, 525 исправлений и 4 устаревшие возможности. Большинство из них незаметны всем, кто не пишет CSS. Но несколько изменений влияют на то, как страница себя ведёт, причём так, что пользователь это видит, и именно они превращаются в тикеты. Вот они, и что с каждым из них делать.
Scroll anchoring включён, и он не убирает баг, а сдвигает его
Много лет Safari был браузером, в котором страница дёргалась. Картинка выше абзаца, который вы читали, дозагружалась, или баннер вставлял себя наверху, и всё съезжало вниз прямо под пальцем. Chrome и Firefox компенсируют это уже давно, теперь то же самое делает и Safari. Когда контент добавляется или исчезает выше видимой области, браузер подстраивает позицию прокрутки так, чтобы то, что вы читали, оставалось на месте.
Это закрывает целый класс отчётов вида “страница прыгает, пока я читаю”, но только для пользователей Safari 27. Те, кто остался на Safari 26, продолжат их присылать, и это первая причина, по которой версия браузера важна в тикете.
Вторая причина одновременно является ловушкой. Многие сайты боролись с дёрганьем сами: измеряли высоту того, что вот-вот загрузится, и сдвигали прокрутку на эту величину, когда контент появлялся. Этот код был корректен в пятницу. Сегодня, в Safari 27, браузер делает ту же поправку первым, а поправка сайта накладывается поверх неё. Теперь страница прыгает в обратную сторону, ровно на ту величину, которую раньше исправлял сайт. Отчёт вида “страница подпрыгивает вверх при загрузке картинок, раньше такого не было” это как раз тот самый баг, и честный ответ таков: причиной теперь стало собственное исправление сайта.
Стандартный выход одинаков во всех браузерах: overflow-anchor: none на контейнере отключает
браузерное выравнивание прокрутки для этой области, так что работает только собственная
компенсация сайта. Либо, что лучше, удалить эту компенсацию и оставить работу всем трём движкам.
Тот же раздел примечаний исправляет более узкую проблему, которая давала очень запутанную картину
отчётов на iOS: вызов scrollTo во время инерционной прокрутки раньше обрывал её намертво.
Страница, которая прокручивала пользователя куда-то, а потом будто вцеплялась в экран, часто
страдала именно этим. Исправлено в 27, присутствует в 26.
Восемь исправлений Content Security Policy, и два из них порождают отчёты
В разделе Security примечаний к релизу перечислены восемь исправлений Content Security Policy. Шесть из них делают Safari строже или корректнее, и это в основном касается страниц, которые и так были слегка неправильными. А два из них дадут о себе знать в эндпоинте отчётов, даже если вы ничего не меняли.
Нарушения frame-ancestors в политике report-only раньше отбрасывались вместо того, чтобы
отправляться в отчёт. Теперь они отправляются. Сайт, у которого настроен
Content-Security-Policy-Report-Only с frame-ancestors, а именно так большинство команд узнаёт,
кто их встраивает, прежде чем что-то запрещать, был слеп в отношении Safari всё время, пока эта
политика существовала. С этой недели отчёты начинают приходить. Их объём может выглядеть как
атака. На самом деле это накопившийся долг.
Импорты JSON-модулей (import data from "./x.json" with { type: "json" }) проверялись по
script-src. Спецификация требует connect-src, и теперь Safari 27 с этим согласен. Политика,
которая разрешала источник JSON в script-src, но не в connect-src, начинает блокировать эти
импорты, а политика с обратным раскладом, наоборот, начинает их разрешать. В любом случае
поведение страницы меняется на одной версии браузера и не менялось на предыдущей.
- Слабо
- Наш эндпоинт CSP-отчётов переполнился за ночь. Похоже, нас встраивают повсюду.
- Лучше
- Нарушения frame-ancestors report-only от Safari 27.0 начали поступать 15 сентября. Safari 26 их отбрасывал, так что это уже существующее встраивание, которое мы раньше не видели, а не новое.
Ещё два пункта из того же списка стоят одного предложения, потому что они превращают сломанную
страницу в рабочую, а это тоже изменение, которое кто-то заметит. Элементы <object>, которые
загружали изображения, блокировались img-src, теперь это исправлено. А 'self' не совпадал с
источниками скриптов в документах с непрозрачным происхождением, например в изолированном iframe,
из-за чего некоторые скрипты, которые должны были выполниться, не выполнялись. Оба случая
исправлены. Если страница на чьём-то телефоне на этой неделе внезапно заработала, возможно, дело
не в вашем деплое.
Стилизованные select, которые раньше были обычными
В Safari 27 появляется appearance: base-select вместе с элементом <selectedcontent>. Любой
сайт, который уже выпустил кастомизированный <select> для Chrome за фича-детектом, теперь
получит кастомную версию и в Safari. Это ожидаемый результат, и обычно хороший. Но это ещё и
первый раз, когда такой CSS вообще заработал в Safari, и первый раз, когда его увидели на iPhone
на реальной ширине экрана, с реальной клавиатурой, в реальном тёмном режиме. Стоит ждать отдельных
отчётов, и фразу “выпадающий список с вчерашнего дня выглядит по-другому на моём телефоне” нужно
воспринимать как точное описание, а не как недоразумение.
Secure-куки на localhost
Спрятано в разделе Networking: теперь Safari учитывает куки Secure на loopback-хостах. Все
остальные движки делают это уже много лет, и именно поэтому сценарий входа мог работать в Chrome
на localhost, ломаться только в Safari и отправлять кого-то на час проверки сертификатов. Этот
конкретный час теперь исчез.
Что такое localhost на самом деле
разбирает остальное: почему фраза “работает на localhost” доказывает меньше, чем кажется.
Что всё это значит для отчёта
У каждого пункта выше одна и та же форма: одна и та же страница ведёт себя по-разному на Safari 26.6 и на Safari 27.0, в один и тот же день, у двух людей, сидящих рядом друг с другом. Диагностировать это можно, только если в отчёте указано, с какой версии он пришёл.
В большинстве отчётов этого нет. Люди пишут “Safari на моём iPhone”, и это не их вина: на iPhone версия Safari совпадает с версией iOS, она находится в настройках, в разделе “Основные” и “Об этом устройстве”, а обновление произошло, пока человек спал. Поэтому первый встречный вопрос должен касаться версии, ещё до шагов воспроизведения, и самый дешёвый способ её получить, это страница, которая сама её считывает. Наша лежит по адресу /tools/user-agent: она показывает браузер и его версию, операционную систему, размер экрана и цветовую схему, и пользователь может просто вставить всё это в отчёт. Она работает в любом браузере, потому что иначе нельзя.
Есть и честное ограничение с нашей стороны. Session Replay является расширением для Chrome. Оно не может захватить отчёт из Safari, и баг, который проявляется только в Safari 27, не покажется на странице, открытой в Chrome. Зато оно быстро закрывает вторую половину вопроса: откройте ту же страницу в Chrome, захватите её, и через минуту вы будете знать, в чём дело, в странице или в движке. В этом и заключается вся суть кроссбраузерного тестирования на практике: три движка, и понимание того, с каким из них вы имеете дело.
Для части, связанной с Safari, если у вас есть Mac, по-прежнему лучше всего работает Web Inspector через кабель, и как открыть инструменты разработчика на iPhone рассказывает, как это сделать. Web Inspector в Safari 27 теперь показывает каждый запрос в цепочке редиректов отдельно, что становится маленьким подарком, когда баг это зацикленный вход.
Session Replay
Бесплатное расширение для Chrome. Один клик на странице, которая ведёт себя не так, как надо, захватывает скриншот, консоль и сетевой лог и выдаёт вам ссылку, которую можно вставить в тикет.
Остальное в релизе, коротко
Ещё несколько вещей из примечаний, о существовании которых разработчику стоит знать.
Потоки стало проще потреблять. for await...of по ReadableStream, ReadableStream.from()
для создания потока из любого итерируемого объекта, и теперь потоки можно передавать через
postMessage(). Код, написанный для Chrome и опирающийся на что-то из этого, теперь работает в
Safari без полифилла.
Ошибки веб-расширений теперь видны. Необработанные исключения и неперехваченные отклонения промисов в скриптах веб-расширения Safari теперь всплывают наружу, а раньше просто исчезали. Если вы поддерживаете версию расширения для Safari, портированную из Chrome, будьте готовы узнать об ошибках, которые были в нём уже давно.
Появился static routing API для service worker: он позволяет service worker заранее объявить, какие запросы его обходят стороной, так что сетевой путь для статического ресурса больше не ждёт запуска воркера.
Четыре удаления из SVG. SVGLocatable, SVGTransformable, nearestViewportElement,
farthestViewportElement и viewTarget исчезли, вместе с glyph-orientation-horizontal. Старые
SVG-инструменты, использующие что-то из этого, будут падать с ошибкой в Safari 27, но не в 26, и
это ещё один привязанный к версии отчёт, который стоит уметь распознавать.
Что из этого следует запомнить
Обновление браузера представляет собой изменение в продакшене, которое никто в команде не выкатывал, не ревьюил и не может откатить, и с каждым днём в течение недели оно затрагивает всё большую долю пользователей. Единственная защита заключается в том, чтобы знать, с какой версии пришёл каждый отчёт, и тогда фразу “это началось вчера” можно сопоставить с фразой “вчера вышел Safari 27”, а не с последним деплоем.
Официальные примечания Apple служат основным источником, и они длинные: Safari 27 Release Notes.