Компания Google представила релиз web-браузера Chrome 74. Одновременно доступен стабильный выпуск свободного проекта Chromium, выступающего основой Chrome. Браузер Chrome отличается использованием логотипов Google, возможностью загрузки модуля Flash по запросу, наличием системы отправки уведомлений в случае краха, модулями для воспроизведения защищённого видеоконтента, системой автоматической установки обновлений и передачей при поиске RLZ-параметров. Следующий выпуск Chrome 75 запланирован на 4 июня.

Основные изменения в Chrome 74:

  • При наступлении события onUnload, вызываемого при закрытии страницы, теперь запрещено выводить всплывающие окна (блокируется вызов window.open()), что позволит защитить пользователей от принудительного открытия рекламных страниц после закрытия сомнительных сайтов;
  • В JavaScript-движке реализована появился новый режим JIT-less (флаг «—jitless»), дающий возможность выполнить JavaScript без применения JIT (используется только интерпретатор) и без выделения исполняемой памяти в процессе выполнения кода. Отключение JIT может быть полезным для повышения безопасности при работе с потенциально опасными web-приложениями, а также для обеспечения сборки на платформах, запрещающих использование JIT (например, в iOS, на некоторых Smart TV и игровых консолях. При отключении JIT производительность выполнения JavaScript снижается на 40% в тесте Speedometer 2.0 и на 80% в тесте Web Tooling Benchmark, но при симуляции работы с YouTube отмечено снижение производительности лишь на 6%. Потребление памяти при этом уменьшается незначительно, всего на 1.7%;
  • В V8 также предложена большая порция новых оптимизаций. Например, на 60% ускорено выполнение вызовов функций, в которых число фактически переданных параметров не соответствует указанному при определении функции числу аргументов. Ускорен доступ к своействам DOM при помощи функции get, что положительно повлияло на производительность фреймворка Angular. Ускорена работа парсинга JavaScript: оптимизация декодировщика UTF-8 позволила поднять производительность парсера в режиме streaming (разбор по мере загрузки) на 8%, а исключение лишних операций дедупликации дало прирост ещё на 10.5%;
  • Проведена работа по снижению потребления памяти движка JavaScript. Добавлен код для очистки кэша байткода, который занимает примерно 15% от всего размера кучи. В сборщик мусора добавлена стадия для вытеснения из кэша редко скомпилированного байткода для используемых функций или функций, вызываемых только при инициализации. Решение о чистке принимается на основании новых счётчиков, учитывающих последнее время обращения к байткоду. Указанное изменение позволило снизить потребление памяти на 5–15% без негативного влияния на производительность. Дополнительно, в компиляторе байткода исключена генерация заведомо неиспользуемого кода, например, который следует после return или break (если на него нет Jump-перехода);
  • Для WebAssembly реализована поддержка потоков и атомарных операций (API WebAssembly Threads и WebAssembly Atomics);
  • Для обособленной поставки скриптов добавлена поддержка заголовка «#!», определяющего интерпретатор для запуска. Например, по аналогии с другими скриптовыми языками, файл JavaScript может выглядеть примерно так:
    
       #!/usr/bin/env node
       console.log(42);
    
  • В CSS добавлен новый media-запрос «prefers-reduced-motion«, позволяющий сайту определить состояние настроек в операционной системе, связанных с отключением анимированных эффектов. При помощи предложенного запроса владелец сайта может узнать, что пользователь отключил у себя анимированные эффекты и также отключить различные анимационные возможности на сайте, например, убрать эффект дрожания кнопок, используемых для привлечения внимания;
  • В дополнение к появившейся в Chrome 72 возможности определения публичных полей реализована поддержка пометки полей приватными, после чего доступ к их значениям будет открыт только внутри класса. Для пометки поля приватным следует указать перед именем поля знак «#». Как и в случае с публичными полями приватные свойства не требуют явного использования конструктора.
  • HTTP-заголовок Feature-Policy, позволяющий управлять поведением API и включением определённых возможностей (например, можно включить синхронный режим работы XMLHttpRequest или отключить Geolocation API), дополнен JavaScript API для контроле активности тех или иных возможностей. Для разработчиков предложено два новых метода document.featurePolicy и frame.featurePolicy, предлагающих три функции: allowedFeatures() для получения списка разрешённых для текущего домена функций, allowsFeature() для выборочной проверки включения конкретных возможностей и getAllowlistForFeature() для вывода списка доменов, для которых на текущей странице разрешена указанная возможность;
  • Добавлена экспериментальная («chrome://flags#enable-text-fragment-anchor») поддержка режима Scroll-To-Text, позволяющего формировать ссылки на отдельные слова или фразы, без явного указания в документе меток при помощи тега «a name» или свойства «id». Для передачи ссылки предлагается специальный параметр «#targetText=», в котором можно указать текст для перехода. Допускается указание маски, включающей фразы, указывающие на начало и конец фрагмента с использованием запятой в качестве их разделителя (например, «example.com#targetText=start%20words, end%20words»);
  • В конструктор AudioContext добавлена опция sampleRate, позволяющая установить делаемую частоту дискретизации для операций со звуком через Web Audio API;
  • Добавлена поддержка класса Intl.Locale, предоставляющего методы для разбора и обработки выставляемых локалью параметров языка, региона и начертания, а также для чтения и записи тегов расширений Unicode, сохранения пользовательских настроек локали в сериализированном формате;
  • Механизм Signed HTTP Exchanges (SXG) расширен средствами для информирования распространителей контента об ошибках загрузки подписанного контента, таких как проблемы с верификацией сертификатов. Обработка ошибок производится через расширения API Network Error Logging. Напомним, что SXG позволяет владельцу одного сайта при помощи цифровой подписи авторизовать размещения определённых страниц на другом сайте, после чего в случае обращения к этим страницам на втором сайте, браузер будет показывать пользователю URL исходного сайта, несмотря на то, что страница загружена с другого хоста;
  • В класс TextEncoder добавлен метод encodeInto(), позволяющий записать закодированную строку напрямую в предварительно выделенный буфер. Метод encodeInto() является высокопроизводительной альтернативой методы encode(), требующего выполнения операции выделения буфера при каждом обращении.
  • В Service worker обеспечена буферизация вызова client.postMessage() до момента готовности документа. Сообщения, отправленные через client.postMessage(), будут удержаны до стадии генерации события DOMContentLoaded, установки onmessage или вызова startMessages();
  • В соответствии с требованием спецификации CSS Transitions добавлены события transitionrun, transitioncancel, transitionstart и transitionend, генерируемые когда CSS-переход помещен в очередь, отменяется, начинает или заканчивает выполняться.
  • При указании через overrideMimeType() или MIME-тип некорректной кодировки символов для запроса XMLHttpRequest, теперь осуществляется откат на UTF-8 вместо Latin-1;
  • Объявлено устаревшим и будет удалено в одном из следующих выпусков свойство «allow-downloads-without-user-activation», через которое можно было организовать автоматическую загрузку файлов при обработке iframe. В будущем инициирование загрузки файлов без явного действия пользователя будет запрещено, так как оно активно применялось для злоупотреблений, навязывания загрузок и подстановки частей вредоносного ПО на компьютер пользователя. Для начала загрузки обязательно потребуется клик пользователя на той же странице. Изначально свойство планировалось удалить в Chrome 74, но удаление было отложено до Chrome 76.
  • Для платформы Windows предложена опциональная тёмная тема оформления интерфейса (в прошлом выпуске тёмное оформление было подготовлено для macOS). Так как тёмное оформление почти идентично оформлению в режиме инкогнито, для выделения приватного режима работы вместо пиктограммы профиля пользователя добавлен специальный индикатор;
  • Для корпоративных пользователей добавлена возможность Chrome Browser Cloud Management для управления настройками браузеров пользователей через консоль Google Admin;

Кроме нововведений и исправления ошибок в новой версии устранено 39 уязвимостей. Многие из уязвимостей выявлены в результате автоматизированного тестирования инструментами AddressSanitizerMemorySanitizerControl Flow IntegrityLibFuzzer и AFL. Критических проблем, которые позволяют обойти все уровни защиты браузера и выполнить код в системе за пределами sandbox-окружения, не выявлено. В рамках программы по выплате денежного вознаграждения за обнаружение уязвимостей для текущего релиза компания Google выплатила 19 премии на сумму 26837 долларов США (четыре премии $3000, четыре премии $2000, одна премия $1337, четыре премии $1000, три премии $500). Размер 4 вознаграждений пока не определён.