Firefox 57

Firefox 57 (Firefox Quantum) — крупное обновление современного веб-браузера.

CSS, HTML

Новый механизм работы с таблицами стилей Stylo (Quantum CSS) написан на языке программирования Rust и поддерживает многопоточность. Согласно данным теста Speedometer 2.0, по сравнению с Firefox 52 прирост быстродействия двукратный.

Автоматически исправлен ряд ошибок прежнего механизма обработки таблиц стилей:

  • Некорректные аргументы функции radial-gradient() — например, radial-gradient(circle gold,red)работали несмотря на отсутствие запятой между двумя первыми составляющими.
  • При анимированном появлении изначально находившегося за пределами экрана элемента с заданной задержкой на некоторых платформах, включая Windows, не происходила перерисовка.
  • Элемент DETAILS с атрибутом open не был открыт по умолчанию, если к элементу была привязана CSS-анимация.
  • Не работали CSS-переходы (transitions) от text-shadow с заданным цветом к text-shadow без заданного цвета.
  • Отмена CSS-анимации при заданном свойстве animation-fill-mode (например, имеющем значение forwards) могла однократно запустить CSS-переход (transition), связанный с этим же элементом.
  • Анимации, заданные с использованием единиц em, не реагировали на изменения размера шрифта (font-size) контейнера, содержащего анимированный элемент.
  • Наследование размера шрифта (font-size) в некоторых ситуациях работало неправильно, из-за чего в зависимости от языковых настроек размер шрифта мог оказаться меньше ожидаемого.
  • При разборе аргументов функций domain() и url-prefix() в составе заголовков правил @-moz-document использовался тот же механизм, что и при разборе лексем типа url-token, при этом лексема, содержавшая квадратные скобки или кавычки, считалась некорректной.
  • При использовании системного шрифта типа menu в качестве значения свойства font двухмерного CANVAS-контекста было невозможно затем прочитать это значение.
  • Корневой элемент ветви DOM-дерева, ещё не вставленной в документ, трактовался как блочный вместо строчного, как того требует спецификация.
  • Не поддерживалось использование функции calc() в качестве радиуса в функции radial-gradient().
  • Некорректно разбиралось выражение calc(1*2*3).
  • Функция calc() поддерживалась не везде, где должна была согласно спецификации.
  • Псевдоэлементы ::before и ::after генерировались даже при свойстве content со значением normal или none, что не соответст­вовало спецификации.
  • Не работали CSS-переходы (transitions) между значениями свойства background-position, описывающими разное количество слоёв: например, 10px 10px и 20px 20px, 30px 30px.

Другие новшества, касающиеся CSS и HTML:

  • Свойства grid-row-gap и grid-column-gap, задающие отступы между виртуальными строками и столбцами Grid-сетки, теперь не сбрасываются стенографическим (shorthand-) свойством grid. Соответствующее решение было принято рабочей группой CSS в конце лета.
  • Включена по умолчанию поддержка полей INPUT типа date и time, отвечающих за удобный ввод даты и времени соответственно. Дату можно как вводить вручную согласно маске, так и выбирать из всплывающего календаря. Время вводится по маске.
  • Поддержка предзагрузки ресурсов с помощью <link rel="preload" />, реализованная в Firefox 56, временно отключена ввиду неполной совместимости текущей реализации с существующими сайтами. Обновлённая реализация предположительно будет включена в Firefox 58.

JavaScript, DOM

  • Включена по умолчанию поддержка PerformanceObserver API, позволяющего отслеживать события измерения быстродействия браузера.
  • Поддержка DOM-свойства Selection.type в рамках Selection API. Свойство возвращает строку, позволяющую определить, выделено ли что-нибудь (значение None), установлен ли курсор без выделения диапазона (Caret) или выделен диапазон (Range).
  • Одиночная кавычка (') в хэшах (якорях) URL-адресов (URL, Location) теперь не экранируется, что соответствует спефицикации и поведению других браузеров.

WebExtensions API вместо XUL/XPCOM

В стабильных и бета-версиях Firefox отключена поддержка считающихся теперь устаревшими расширений на основе XUL/XPCOM. Скрытые about:config-настройки extensions.allow-non-mpc-extensions и extensions.legacy.enabled, в сборках Developer Edition и Nightly позволяющие включить поддержку таких расширений, игнорируются, а в Developer Edition и Nightly устаревшие расширения работают частично или неправильно.

WebExtensions API — теперь единственный легитимный способ создания расширений. На сайт Addons.Mozilla.org расширения прежнего типа после выхода Firefox 57 не принимаются. Расширения на Addons.Mozilla.org теперь проверяются автоматически и публикуются в течение нескольких минут после загрузки.

С точки зрения разработчиков расширений WebExtensions API имеет серьёзные ограничения по сравнению с прежним подходом. Например, нет возможности переопределять поведение собственных элементов интерфейса Firefox, таких как кнопка «Домой».

Новый API является более высокоуровневым и позволяет разработчикам Firefox вносить изменения в браузер, не нарушая работоспособность расширений. Многопоточная архитектура нового API потенциально повышает быстродействие на системах с многоядерными процессорами.

WebExtensions API во многом совместим с подходом, применяемым в Chrome и послужившим основой нового API как такового, что позволяет относительно легко портировать расширения Chrome для работы в Firefox и наоборот.

Некоторые из наиболее интересных новшеств WebExtensions API в Firefox 57:

  • Метод browser.browserAction.openPopup() открывает всплывающее окно, привязанное к кнопке расширения. В других браузерах такая возможность отсутствует.
  • Поддержка чтения адресов начальной страницы браузера и пустой вкладки. К сожалению, чтение адреса начальной страницы браузера в Firefox 57 не работает, если адрес не был переопределён одним из расширений (исправлено в Firefox 58), а попытка загрузить не переопределённую пустую вкладку (about:newtab), например, методом browser.tabs.update() приводит к ошибке вида «Некорректный URL-адрес» (Illegal URL) даже в Firefox 59 (Nightly) (см. смежный баг 1269456).
  • Новый метод browser.webRequest.filterResponseData() позволяет изменять ответ сервера — например, код HTML-документа — до его обработки браузером и отображения страницы пользователю.
  • Поддержка копирования PNG- и JPEG-изображений в буфер обмена в расширениях с помощью метода browser.clipboard.setImageData().
  • Метод browser.tabs.create(), предназначенный для создания новых вкладок, теперь поддерживает в качестве URL-адресов значения с префиксом view-source:, соответствующим встроенному в браузер интерфейсу просмотра исходного кода заданного ресурса.
  • Реализованы функции поиска по странице.
  • При открытии новой вкладки, переопределённой средствами расширения, адресная строка теперь пуста аналогично обычной новой вкладке. При этом слева от поля ввода адреса отображается длинная надпись «Расширение (название_расширения)», пропадающая, когда пользователь начинает набирать адрес. Возможность переопределения вкладки была реализована в Firefox 54, но при этом в адресной строке пустой вкладки отображался служебный адрес HTML-страницы вида moz-extension://…/page.htm, заданной расширением.

Прочее

  • Поддержка аппаратного декодирования видео в формате VP9 на платформе AMD.
  • Прокрутка теперь обрабатывается асинхронно (Async Pan and Zoom, APZ) и не блокирует интерфейс браузера. Негативный побочный эффект — при слишком быстрой прокрутке ставшая видимой часть страницы может отрисовываться с заметной задержкой.
  • Внедрено новое оформление пользовательского интерфейса Photon, и обновлён логотип Firefox, ставший более контрастным и графически упрощённым. Главное меню Firefox, открываемое нажатием кнопки с пиктограммой в виде трёх горизонтальных линий, теперь вместо кнопок снова приобрело более классический вид списка. Параллельно переработано оформление инструментов разработки, многие из которых теперь реализованы с использованием веб-технологий и JS-библиотек React и Redux.

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

UsableHomeButton 2.0

Авторское расширение UsableHomeButton, позволяющее быстро перейти на главную страницу (в корень домена) любого сайта, к выходу Firefox 57 переписано с использованием WebExtensions API.

Впервые расширение было опубликовано в 2009-м году и изменяло поведение встроенной кнопки «Домой» браузера. Позднее было добавлено контекстное меню, позволявшее переходить на родительские адреса, на канонический адрес страницы, копировать название, заголовок, декодированный адрес страницы, удалять из адреса хэш (якорь) без перезагрузки страницы, открывать штатную начальную (домашнюю) страницу браузера и проч.

В WebExtensions API переопределение встроенной кнопки «Домой» не преду­смотрено, поэтому новая версия расширения добавляет собственную кнопку. Нажатие кнопки теперь всегда открывает меню, т. к. в новом API ограничены возможности контекстных меню и возможности обработки событий нажатия кнопки расширения.

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

Из-за ошибки в Firefox 57 пункт меню «Начальная страница браузера» доступен только в Firefox 58+.

Добавлены пункты меню «Попробовать по HTTPS» и «Попробовать без www».