Firefox 48

Второй летний выпуск веб-браузера Firefox подкрался незаметно. Что он нам приготовил?

CSS

  • Экспериментальная поддержка значения text свойства background-clip, превращающего текст в маску для фона элемента. В стабильной версии Firefox возможность по умолчанию отключена, включается с помощью параметра layout.css.background-clip-text.enabled в about:config.
  • Псевдоэлемент ::first-letter теперь включает в себя предшествующие и последующие смежные дефисы, тире (длинное, среднее) и прочие аналогичные Юникод-символы.
  • Поддержка свойства color-adjust, значение exact которого позволяет на уровне CSS явным образом включить печать фоновых цветов и изображений. В браузерных движках WebKit и Blink (Chromium) аналогичная возможность доступна с помощью нестандартного свойства -webkit-print-color-adjust.
  • Поддержка использования функции calc() в значениях свойства line-height.
  • Поддержка вложенных calc().
  • Поддержка Flexbox и находящегося в процессе реализации механизма Grid для HTML-элемента FIELDSET.
  • Правило @supports в собственных таблицах стилей браузера теперь можно использовать для проверки, включён ли определённый булев параметр в about:config, например: @supports -moz-bool-pref("имя_параметра") {}. К сожалению, в расширениях эта возможность, судя по всему, пока недоступна.

JavaScript

  • Метод Array.prototype.values(), возвращает итератор, позволяющий перебирать значения элементов массива с использованием цикла for…of или с помощью метода next() итератора.
  • Методы padStart() и padEnd() добавляют многократно повторенную заданную подстроку (по умолчанию пробел) в начало или конец заданной строки соответственно до достижения заданной суммарной длины строки. Работают аналогично пресловутому NPM-пакету left-pad, с которым связана одна любопытная история.
  • Так называемый well-known-символ Symbol.isConcatSpreadable позволяет явным образом указать, следует ли разворачивать (трактовать как последовательность хранимых в нём значений, а как не самостоятельную сущность) конкретный массив или массивоподобный объект при использовании в качестве аргумента метода concat() другого массива. Доступны также символы Symbol.species, позволяющий получить или переопределить конструктор по умолчанию для объектов дочерних классов, и Symbol.unscopables, позволяющий задать свойства, которые следует исключать при переборе свойств объекта с использованием оператора with, недоступного в Strict-режиме.
  • Метод Intl.getCanonicalLocales() возвращает массив канонических в отношении регистра неповторяющихся кодов локалей вида en-US на основании переданного массива локалей.
  • Поддержка метода contains() строк как объектов String окончательно удалена, вместо него следует использовать метод includes(). Начиная с Firefox 40 метод contains() был объявлен нерекомендуемым из-за несовместимости с одноимённым нестандартным методом, использовавшимся в версиях библиотеки MooTools ниже 1.2.6.
  • Возвращена поддержка DOM-метода Node.isSameNode(), удалённая начиная с Firefox 10 в связи с нелепым удалением из спецификации DOM в пользу прямого строгого сравнения узлов как переменных вида a === b, но впоследствии возвращённого в спецификацию в том числе в связи с неизбежно обнаруженными проблемами совместимости с существующими сайтами.
  • Поддержка метода Element.animate() как части Web Animations API, представляющего собой новый способ создания плавных анимаций и позиционируемого в качестве альтернативы requestAnimationFrame(), не подверженной влиянию периодических задержек и подёргиваний, связанных с работой механизма «сборки мусора».
  • Методы Element.insertAdjacentText() и Element.insertAdjacentElement() предоставляют унифицированный способ вставки текста или элемента перед элементом, в качестве его первого или последнего узла, либо после элемента без необходимости обращения к его родительскому элементу.
  • Свойство scrollingElement объекта document содержит элемент, прокрутка которого осуществляется при прокрутке документа.
  • Удалена поддержка кодировки UTF-16 в TextEncoder в соответствии с текущей версией спецификации.
  • В рамках Fetch API доступно управление кэшированием и отправкой заголовка запроса, содержащего адрес ссылающейся страницы.

WebExtensions API

Реализация WebExtensions API — нового набора высокоуровневых средств создания расширений — формально достигла статуса стабильной.

К сожалению, на самом деле WebExtensions API на данный момент сильно ограничен в возможностях по сравнению с традиционным подходом XUL/XPCOM. В частности:

  • нет прямого доступа к собственным элементам интерфейса (в том числе кнопкам) браузера (т. е., например, авторское расширение UsableHomeButton, переопределяющее поведение встроенной кнопки «Домой», с помощью WebExtensions сейчас вообще нереализуемо). Можно добавить свою кнопку, но не изменить поведение или вид встроенной;
  • недоступны многочисленные привычные по XPCOM возможности (при этом не предоставлены их эквиваленты), в том числе встроенные JS-функции, используемые в интерфейсе браузера.

При этом вместо native.js, ранее ожидавшегося низкоуровневого способа доступа к интерфейсу браузера, теперь предполагается просто реализовать некоторый фиксированный набор высокоуровневых возможностей, покрывающих большинство нужд разработчиков расширений (кхм), тестировать которые можно будет после установки расширения WebExtension Experiments, которое будет содержать экспериментальные реализации соответствующей функциональности до их переноса в сам браузер.

Таким образом, в текущем состоянии WebExtensions API, пожалуй, пригоден в основном для написания пользовательских контент-скриптов (подобных используемым в расширении Greasemonkey), распространяемых в относительно удобном в установке форм-факторе расширения. А пока можно смело продолжать использовать прежние способы создания расширений (XUL/XPCOM, Addons SDK) вплоть до момента их полного запрета. Такой запрет планируется на 2017 год, но на практике процесс наверняка затянется.

Прочее

  • Многопроцессный режим (Electrolysis, e10s) экспериментально включён у некоторых из пользователей. При отсутствии значимых проблем режим постепенно будет включён у всё большего количества пользователей.
  • Механизм разбора медиафайлов в контейнере MP4 переписан на языке Rust. Системный язык Rust позиционируется как альтернатива языкам C и C++, способствующая написанию эффективно распараллеленных программ, свободных от небезопасных операций с памятью, являющихся причиной многих уязвимостей, характерных для программ, написанных на C и C++. Уместно заметить, что совместными усилиями Mozilla и Samsung разрабатывается браузерный движок Servo, изначально ориентированный на мобильные устройства. Вполне возможно, что в дальнейшем отдельные части Servo постепенно будут задействованы и в Firefox подобно MP4-парсеру в Firefox 48.

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