Введение

Интерфейс программирования приложений Netscape Plugin Application Programming Interface (NPAPI) — устаревший интерфейс программирования приложений (API) для плагинов веб-браузеров, первоначально разработанный для Netscape Navigator 2.0 в 1995 году и впоследствии принятый другими браузерами. В архитектуре NPAPI плагин объявляет типы контента (например, "audio/mp3"), которые он может обрабатывать. Когда браузер обнаруживает тип контента, который не может обработать нативно, он загружает соответствующий плагин, выделяет место в контексте браузера для отображения плагина и затем передает ему данные. Плагин отвечает за рендеринг данных. Плагин работает непосредственно внутри страницы, в отличие от более старых браузеров, которым требовалось запускать внешнее приложение для обработки неизвестных типов контента. NPAPI требует от каждого плагина реализации и предоставления примерно 15 функций для инициализации, создания, удаления и позиционирования контента плагина. NPAPI также поддерживает скрипты, печать, полноэкранные плагины, плагины без окон и потоковую передачу контента. NPAPI часто использовался для плагинов, требующих высокой производительности на низком уровне, таких как видеоплееры, включая Adobe Flash Player и Microsoft Silverlight, а также платформы для веб-приложений, такие как Java Runtime Environment. Поддержка NPAPI в основных браузерах начала снижаться с 2015 года и постепенно прекращалась в течение следующих семи лет. Все основные веб-браузеры отказались от поддержки сторонних плагинов NPAPI из соображений безопасности и обслуживания, поскольку существуют более совершенные технологии.

Поддержка сценариев

Скриптинг — это функция, позволяющая JavaScript-коду на веб-странице взаимодействовать с плагином. Различные версии Netscape, а затем Mozilla поддерживали эту функцию, используя различные технологии, включая LiveConnect, XPConnect и NPRuntime.

LiveConnect (живой соединение)

LiveConnect — это функция веб-браузеров, позволяющая программному обеспечению Java и JavaScript взаимодействовать внутри веб-страницы. Со стороны Java это позволяет апплету вызывать встроенные скрипты страницы или получать доступ к встроенной среде JavaScript, как это могут делать сами скрипты. И наоборот, со стороны JavaScript это позволяет скрипту вызывать методы апплетов или получать доступ к библиотекам Java Runtime, как это могут делать апплеты. LiveConnect использовался в Netscape 4 для реализации возможности скриптования плагинов NPAPI. Реализация LiveConnect, зависящая от Open Java Interface, была удалена из дерева исходного кода Mozilla в конце июня 2009 года в рамках очистки Mozilla 2. Она больше не требовалась с выпуском переработанной среды выполнения Java от Sun Microsystems. Однако старая реализация была восстановлена для Gecko 1.9.2, поскольку Apple еще не портировала новую JRE на Mac OS X. Функциональность Java–JavaScript, поддерживаемая переработанной средой Java Runtime Environment, по-прежнему называется "LiveConnect", несмотря на отказ от подхода, специфичного для Open Java Interface. С Netscape 4 NPAPI был расширен, чтобы позволить скриптовать плагины. Это расширение также называется LiveConnect. Плагин мог реализовать класс Java и предоставить экземпляр этого класса для доступа. К этому классу можно было обращаться из JavaScript и из Java-апплетов, работающих внутри страницы. Недостатком LiveConnect является его тесная привязка к версии Java, встроенной в браузер Netscape. Это препятствовало использованию браузером других сред выполнения Java и увеличивало размер загружаемого файла браузера, поскольку для скриптования плагинов требовалось включение Java. Кроме того, программирование с LiveConnect сложно: разработчику необходимо определить класс Java для плагина, скомпилировать его с помощью специализированного компилятора заголовков Java и реализовать собственные методы. Обработка строк, исключений и других объектов Java из C++ не является тривиальной задачей. Более того, LiveConnect использует устаревший API для вызова нативных C++-функций из Java, известный как JRI. Технология JRI давно заменена JNI.

XPConnect

XPConnect (Cross Platform Connect) — это технология, обеспечивающая простое взаимодействие между XPCOM и JavaScript.

Объектная связь

XPConnect позволяет JavaScript-объектам прозрачно получать доступ и манипулировать объектами XPCOM. Он также позволяет JavaScript-объектам предоставлять интерфейсы, соответствующие требованиям XPCOM, для вызова объектами XPCOM. Основная задача XPConnect заключается в том, чтобы объекты, взаимодействующие через интерфейс в стиле XPCOM, как правило, не нуждались в знании или заботе о языке реализации объекта на другой стороне интерфейса. Главная причина существования XPConnect – замена кода, написанного вручную, в тех местах, где необходимо взаимодействие между нативным кодом и кодом JavaScript. Модуль DOM является примером такой области применения.

Безопасность

По умолчанию полные права предоставляются только скриптам Chrome, то есть скриптам, являющимся частью приложения или расширения. Для удаленных документов HTML/XHTML/XUL большинство объектов XPCOM недоступны для скриптов, поскольку они имеют ограниченные привилегии из соображений безопасности. Даже если они доступны (например, объект XMLHttpRequest), обычные ограничения безопасности также могут применяться (например, невозможно открывать URL-адреса других доменов). Mozilla уже использовала XPCOM для определения интерфейсов многих объектов, реализованных на C++. Каждый интерфейс определялся файлом IDL и обрабатывался компилятором IDL, который создавал файлы заголовков и библиотеку независимого от языка, являющуюся двоичным представлением интерфейса. Этот двоичный код описывал интерфейс, методы, параметры, структуры данных и перечисления. XPConnect использует информацию из библиотеки типов для организации вызовов между различными контекстами потоков и между JavaScript и кодом C++, скомпилированным нативно. XPConnect широко используется в Mozilla. Начиная с Netscape 6.1 и Mozilla 0.9.2, NPAPI был расширен таким образом, что плагин мог возвращать скриптируемый интерфейс для себя, а XPConnect организовывал вызовы к нему из JavaScript и реализации на C++. XPConnect не имеет зависимости от Java. Однако технология основана на XPCOM. Следовательно, разработчику плагина необходимо быть знакомым с подсчетом ссылок, интерфейсами и IDL для реализации скриптов. Зависимость от XPCOM привела к определенным проблемам с динамической связью (например, к проблеме хрупкого базового класса), которые необходимо было решить, прежде чем плагин будет правильно работать с разными браузерами. С тех пор XPCOM был изменен для предоставления статически связанной версии, чтобы решить эти проблемы. Этот подход также требует установки файла xpt рядом с динамической библиотекой (DLL); в противном случае плагин будет казаться работающим, но скрипт не будет выполняться, что может вызвать путаницу.

Время запуска NPRuntime

В конце 2004 года все основные компании-разработчики браузеров, использующие NPAPI, договорились о NPRuntime как о расширении оригинального NPAPI для обеспечения поддержки скриптов посредством API, стилистически похожего на старый NPAPI в стиле C и не зависящего от других браузерных технологий, таких как Java или XPCOM. Поддержка NPRuntime реализована только в Firefox ESR (Extended Support Release) и Safari.

Поддержка

В связи с устареванием API, проблемами безопасности и переходом на альтернативные технологии, такие как HTML5, многие поставщики программного обеспечения начали прекращать поддержку NPAPI в 2013 году.

Интернет-проводник

Версии Internet Explorer с 3 по 5.5 SP2 поддерживали NPAPI, что позволяло плагинам, работавшим в Netscape Navigator, функционировать и в Internet Explorer. Поддержка осуществлялась через небольшой элемент управления ActiveX (с именем "plugin.ocx"), который выполнял роль прокладки между ActiveX и NPAPI-плагином. Microsoft прекратила поддержку, начиная с версии 5.5 SP2, из соображений безопасности.

Google Chrome (всего лишь один)

Google Chrome окончательно прекратил поддержку NPAPI на всех платформах в сентябре 2015 года. В сентябре 2013 года Google объявила о поэтапном отказе от поддержки NPAPI в браузере Google Chrome в течение 2014 года, объяснив это тем, что "[его] архитектура, разработанная в 90-х годах, стала основной причиной зависаний, сбоев, проблем с безопасностью и сложности кода". В мае 2014 года поддержка NPAPI была удалена из Chrome версии 35 и более поздних версий для Linux. В апреле 2015 года в Chrome для Windows и OS X (версии 42 и более поздние) поддержка NPAPI была отключена по умолчанию. Однако до сентября 2015 года (версия 45) пользователи могли снова включить NPAPI.

Опера

Opera прекратила поддержку в версии 37 в мае 2016 года.

Firefox (англ.)

Mozilla Firefox, в версии 52.0, выпущенной в марте 2017 года, прекратил поддержку NPAPI, за исключением Flash. Канал ESR продолжал поддерживать эту функцию, а версия 52 ESR стала последней возможностью использования NPAPI. В Firefox 69.0 NPAPI для Flash был отключен по умолчанию. В Firefox 85.0, выпущенном в январе 2021 года, поддержка NPAPI была полностью удалена. В канале ESR поддержка Flash NPAPI завершилась с версией 78.15.0, выпущенной в октябре 2021 года.

Сафари

Safari прекратил поддержку всех плагинов NPAPI, кроме Flash, начиная с версии 12, выпущенной в сентябре 2018 года. Поддержка Flash была удалена из Safari 14, выпущенной в сентябре 2020 года.

Морская Обезьяна

SeaMonkey прекратил поддержку плагинов NPAPI, начиная с версии 2.53.1, за исключением Flash. Поддержка NPAPI была полностью удалена в SeaMonkey 2.53.7, выпущенном в марте 2021 года.

ActiveX

Internet Explorer и браузеры, основанные на Internet Explorer, используют элементы управления ActiveX, документы ActiveX и сценарии ActiveX для обеспечения расширяемости веб-страниц, сопоставимой с NPAPI. Хотя ActiveX обычно ассоциируется с Internet Explorer, это технология интеграции, позволяющая любой компьютерной программе интегрировать части других компьютерных программ, поддерживающих такую интеграцию. Тем не менее, Internet Explorer устарел, а его преемник, Microsoft Edge, не поддерживает ActiveX.

ПППИ

12 августа 2009 года на странице Google Code был представлен новый проект под названием Pepper, вместе с API плагина Pepper (PPAPI); PPAPI является производным от NPAPI и предназначен для повышения переносимости и безопасности плагинов. Это расширение разработано специально для упрощения реализации выполнения плагинов в отдельном процессе. Первоначально PPAPI поддерживался только в Google Chrome и Chromium. Позже другие браузеры на основе Chromium, такие как Opera и Vivaldi, добавили поддержку плагинов PPAPI. В феврале 2012 года Adobe Systems объявила, что будущие версии Adobe Flash Player для Linux будут предоставляться исключительно через PPAPI. Предыдущая версия, Flash Player 11.2, с поддержкой NPAPI, будет получать обновления безопасности в течение пяти лет. В августе 2016 года Adobe заявила, что вопреки предыдущему объявлению, она вновь будет поддерживать Flash Player на основе NPAPI в Linux и продолжать выпускать его новые версии. В августе 2020 года Google объявила о прекращении поддержки PPAPI в Google Chrome и Chromium в июне 2022 года.