Сервис развивается: тестируем формат, собираем идеи, улучшаем сервис. Есть идеи? Написать
Дайджесты новостей
Консенсус браузерных движков Blink, Gecko и WebKit и динамическая адаптация живого стандарта WHATWG

Ситуативные отношения браузеров: когда движки единодушны вопреки спецификации

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

В реальной жизни взаимоотношения браузеров и стандартов куда сложнее и напоминают запутанный союз. Нередко возникает ситуация, когда три ведущих независимых браузерных движка — Chromium (Blink), Firefox (Gecko) и Safari (WebKit) — ведут себя абсолютно согласованно, однако их единодушное поведение прямо противоречит букве утвержденной спецификации HTML.

В таких случаях перед консорциумом WHATWG встает сложная дилемма: объявить всех разработчиков браузеров нарушителями и потребовать переписать код движков или признать сложившуюся практику фактическим стандартом и изменить текст спецификации. Разбор подобных инженерных коллизий показывает, как на самом деле развивается веб и почему обратная совместимость оказывается важнее формальных догм.

Исторический парадокс: стандарты веба рождались из практики

Чтобы понять природу этих компромиссов, полезно вспомнить историю зарождения интернета. Когда Тим Бернерс-Ли в 1989–1990 годах создавал концепцию Всемирной паутины в ЦЕРНе, он одновременно разрабатывал первый веб-сервер, первый браузер-редактор WorldWideWeb и базовые правила гипертекстовой разметки HTML.

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

Первая официальная спецификация HTML 2.0 (RFC 1866), опубликованная в 1995 году, не пыталась изобрести новый язык с нуля. Ее авторы прямо зафиксировали свою задачу: собрать воедино, упорядочить и документировать то, что браузеры NCSA Mosaic и Netscape Navigator уже поддерживали на практике. Стандарты веба исторически задумывались не как священные скрижали, а как инструмент кодификации работающей реальности.

Когда в середине 2000-х годов возник консорциум WHATWG (Web Hypertext Application Technology Working Group), основанный инженерами Apple, Mozilla и Opera, во главу угла была поставлена концепция живого стандарта (Living Standard). Спецификация перестала быть статичным томом с номером версии и превратилась в непрерывно обновляемый документ, отражающий живую эволюцию платформы.

Анатомия противоречия: случай Андреу Ботельи и issue #6247

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

Работа веб-форм опирается на две ключевые технологии: кодирование тела запроса multipart/form-data и программный интерфейс FormData в JavaScript. При передаче текстовых полей и файлов критически важным является вопрос: как именно обрабатывать символы перевода строк? Разные операционные системы используют разные соглашения: в Unix и macOS принят символ перевода строки LF (\n), в Windows — комбинация возврата каретки и перевода строки CRLF (\r\n), а старые версии Mac OS использовали одиночный возврат каретки CR (\r).

Спецификация HTML в определенный момент содержала строгий текст алгоритма, согласно которому имена файлов и служебные заголовки при сериализации формы не должны были подвергаться нормализации переводов строк. Однако детальный аудит поведения браузерных движков показал поразительный факт: Chrome, Firefox и Safari игнорировали это требование спецификации. Все три движка единодушно заменяли любые варианты переводов строк на канонический формат CRLF.

В открытом обсуждении WHATWG issue #6247 была зафиксирована точная формулировка проблемы: все браузеры согласны нормализовать переводы строк, но спецификация требует оставлять их без нормализации. Возникла классическая ситуация ситуативного консенсуса (situationship): индустрия пришла к полному согласию, но на бумаге это согласие считалось ошибкой.

Суть проблемы совместимости

Если бы разработчики движков попытались строго последовать тексту старой спецификации и отключили нормализацию строк, тысячи существующих бэкенд-серверов на Python, PHP, Ruby и Java перестали бы корректно парсить входящие формы, отправленные пользователями Windows и Mac, что привело бы к масштабным поломкам веб-приложений.

Взвесив риски, рабочая группа WHATWG приняла единственно разумное решение: текст спецификации HTML был переписан под фактическое поведение браузеров. Живой стандарт официально зафиксировал нормализацию строк, приведя теорию в гармонию с практикой.

Почему у веба есть память: цена поломки совместимости

Главная особенность веб-платформы, отличающая ее от закрытых экосистем вроде iOS или Android, заключается в том, что веб обладает бесконечной памятью («The Web has memory»).

В мире нативных приложений разработчик операционной системы может объявить старый API устаревшим, дать два года на адаптацию и затем полностью удалить его. В вебе такой подход невозможен. Нельзя выпустить условный «Web 2.0» с жестким ультиматумом: владельцы сайтов, не обновившие код за полгода, теряют доступ к аудитории. Сайт персонального блога, созданный в 1998 году, должен открываться в современном браузере 2026 года точно так же, как и четверть века назад.

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

Ярким примером этой вынужденной совместимости служит так называемый стандарт совместимости (Compatibility Standard). В эпоху взрывного роста мобильного веба разработчики оптимизировали сайты исключительно под браузер Safari на iPhone, массово прописывая стили с префиксом -webkit-. Когда разработчики Firefox и Chromium попытались открывать мобильные сайты строго по стандартам W3C, многие страницы оказались полностью сломаны. В результате в официальный веб-стандарт пришлось включить требование к движкам поддерживать чужие проприетарные свойства -webkit-, чтобы сохранить работоспособность интернета.

Механизм конвергенции: роль Web Platform Tests (WPT)

Означает ли это, что браузеры могут делать все, что им вздумается, а стандарты обречены плестись в хвосте? Вовсе нет. В современном вебе действует мощный механизм обратной связи, центральное место в котором занимает проект Web Platform Tests (WPT).

Циклический контур обратной связи между спецификацией стандартов, платформенными тестами и независимыми браузерными движками.

WPT — это гигантский открытый набор кроссбраузерных тестов, охватывающий все разделы веб-стандартов. Этот репозиторий интегрирован в системы непрерывной интеграции (CI) всех ключевых движков — Blink, Gecko и WebKit.

Цикл взаимодействия устроен следующим образом:

  1. Формулирование гипотезы: Рабочая группа WHATWG описывает алгоритм новой возможности в Living Standard.
  2. Написание тестов: Вместе со спецификацией создаются тесты WPT, проверяющие граничные случаи.
  3. Реализация в движках: Инженеры браузеров внедряют функционал и запускают тесты.
  4. Обнаружение расхождений: Если тесты показывают, что реализация расходится с ожиданиями или ломает существующие сайты, начинается дискуссия.
  5. Конвергенция: Если все движки сошлись на более удачном решении, спецификацию корректируют. Если же поведение браузеров создает угрозу безопасности или нарушает архитектурную логику, движки выпускают исправления.

Важно подчеркнуть: консенсус браузеров никогда не легализует уязвимости безопасности. Если во всех браузерах обнаруживается одинаковая ошибка в проверке сертификатов или парсинге междоменных запросов (CORS), комитет не меняет спецификацию в пользу дыры. Браузеры обязаны устранить брешь, сколь бы болезненным ни было обновление.

Стандарт как инструмент взаимопонимания

Главный инженерный вывод из феномена «ситуативных отношений» прост: веб-стандарт — это не догматический закон, а инструмент конвергенции («A standard is a tool towards convergence»). Цель комитета состоит не в том, чтобы покарать создателей движков за отступление от текста, а в том, чтобы привести экосистему к общему, воспроизводимому и безопасному знаменателю.

Для практикующего веб-разработчика понимание этих механизмов дает важный практический ориентир:

  • Не стоит воспринимать спецификацию как застывшую догму: при обнаружении странного поведения движков всегда полезно проверить issue-трекер WHATWG и тесты WPT.
  • Поведение, поддержанное всеми ключевыми браузерами на протяжении нескольких релизов, с высокой вероятностью станет частью официального стандарта, даже если текущий текст спецификации отстает от реальности.
  • Надежность веб-архитектуры держится на балансе между инновациями и строгой обратной совместимостью, где консенсус практиков часто оказывается сильнее кабинетных предписаний.