LINUX.ORG.RU

История изменений

Исправление uin, (текущая версия) :

XUL, WebExtensions и расширения браузера Firefox (аддоны) это три разные не зависящие друг от друга детали.

XUL это такой xml-based язык разметки, при помощи которого описывают интерфейс. Отличительная черта ксулевого интерфейса это то что он для своего построения использует системные элементы окон. Звучит красиво но на деле они всегда выглядели и работали криво, а код для реализации этого самого ксула наверняка представляет собой нагромождение костылей и подпорок под каждую ОС. Заменой xul является html.

Сегодня для написания расширений для браузера, мозилла предлагает использовать Add-ons SDK. Что это такое (в краце): ставится нода, ставится jpm (собственно сам sdk) через npm, структура аддонов очень похожа на вебкитовские WebExtensions - манифест фаил (тут он называется package.json), background скрипты и страницы, интерфейс описывается на html+css, очень похожий (опять же) прием по подключению и использованию API объектов.

Но на этом сходства заканчиваются, если в хромоногих расширениях есть 2 рабочих изолированных пространства (background и content) то у аддонов только одно (аналогичное background), так же у аддонов помимо всяких High-Level API есть и большой набор Low-Level, включая те самые компоненты, и можно например даже напрямую обращаться к системному API (то есть то что делал ксул неявно, нам заботливо предлагают с этим потрахаться самим, вкусить так сказать прелесть написания чего то под системные API и фреймворки). Сами модули подключаются не как в хроморасширениях через разрешения в манефесте, а как в node.js через require("sdk/tabs") например.

Сложно сказать что лучше, аддоны как то больше походят на среду для разработки приложений чем на расширения для управления поведением браузера, там где хватает WebExtensions лучше писать под них наверное (благо фаирфокс поддерживает и то и то), хотя по идее можно и в одном проекте реализовать поддержку обоих - независимый код и html вынести отдельно, браузероспецифичный отдельно, манифесты хоть и лежат оба в корне но имеют разные имена и потому не пересекаются (хотя интересно как поведет себя FF если ему такой пакет скормить, как он его воспримет - как аддон или хроморасширение).

Алсо, если интересно как выглядит использование системных апи из js кода в аддонах, то примерно так (тут должны были падать системные координаты курсора, не помню все ли правильно в этом коде или нет):

const { Cu } = require("chrome");
        Cu.import("resource://gre/modules/ctypes.jsm");

let CoreGraphics = ctypes.open("/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics");
let CoreFoundation = ctypes.open("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation");

let CGEventRef = ctypes.voidptr_t;
let CGEventSourceRef = ctypes.voidptr_t;
let CGEventCreate = CoreGraphics.declare("CGEventCreate",
                                         ctypes.default_abi,
                                         CGEventRef,
                                         CGEventSourceRef);
let CGFloat = ctypes.voidptr_t.size == 4 ? ctypes.float : ctypes.double;  // 64bit its double, in 32bit its float
let CGPoint = new ctypes.StructType("CGPoint",
                                     [ { "x" : CGFloat },
                                       { "y" : CGFloat } ]);
let CGEventGetLocation = CoreGraphics.declare("CGEventGetLocation",
                                              ctypes.default_abi,
                                              CGPoint,
                                              CGEventRef);
let CFTypeRef = ctypes.voidptr_t;
let CFRelease = CoreFoundation.declare("CFRelease",
                                       ctypes.default_abi,
                                       ctypes.void_t,
                                       CGEventRef);

let event = CGEventCreate(null);
let cursor = CGEventGetLocation(event);

CFRelease(event);

Cu.reportError(cursor);

console.log(cursor)

Исходная версия uin, :

XUL, WebExtensions и расширения браузера Firefox (аддоны) это три разные не зависящие друг от друга детали.

XUL это такой xml-based язык разметки, при помощи которого описывают интерфейс. Отличительная черта ксулевого интерфейса это то что он для своего построения использует системные элементы окон. Звучит красиво но на деле они всегда выглядели и работали криво, а код для реализации этого самого ксула наверняка представляет собой нагромождение костылей и подпорок под каждую ОС. Заменой xul является html.

Сегодня для написания расширений для браузера, мозилла предлагает использовать Add-ons SDK. Что это такое (в краце): ставится нода, ставится jpm (собственно сам sdk) через npm, структура аддонов очень похожа на вебкитовские WebExtensions - манифест фаил (тут он называется package.json), background скрипты и страницы, интерфейс описывается на html+css, очень похожий (опять же) прием по подключению и использованию API объектов.

Но на этом сходства заканчиваются, если в хромоногих расширениях есть 2 рабочих изолированных пространства (background и content) то у аддонов только одно (аналогичное background), так же у аддонов помимо всяких High-Level API есть и большой набор Low-Level, включая те самые компоненты, и можно например даже напрямую обращаться к системному API (то есть то что делал ксул неявно, нам заботливо предлагают с этим потрахаться самим, вкусить так сказать прелесть написания чего то под системные API и фреймворки). Сами модули подключаются не как в хроморасширениях через разрешения в манефесте, а как в node.js через require(«int64») например.

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

Алсо, если интересно как выглядит использование системных апи из js кода в аддонах, то примерно так (тут должны были падать системные координаты курсора, не помню все ли правильно в этом коде или нет):

const { Cu } = require("chrome");
        Cu.import("resource://gre/modules/ctypes.jsm");

let CoreGraphics = ctypes.open("/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics");
let CoreFoundation = ctypes.open("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation");

let CGEventRef = ctypes.voidptr_t;
let CGEventSourceRef = ctypes.voidptr_t;
let CGEventCreate = CoreGraphics.declare("CGEventCreate",
                                         ctypes.default_abi,
                                         CGEventRef,
                                         CGEventSourceRef);
let CGFloat = ctypes.voidptr_t.size == 4 ? ctypes.float : ctypes.double;  // 64bit its double, in 32bit its float
let CGPoint = new ctypes.StructType("CGPoint",
                                     [ { "x" : CGFloat },
                                       { "y" : CGFloat } ]);
let CGEventGetLocation = CoreGraphics.declare("CGEventGetLocation",
                                              ctypes.default_abi,
                                              CGPoint,
                                              CGEventRef);
let CFTypeRef = ctypes.voidptr_t;
let CFRelease = CoreFoundation.declare("CFRelease",
                                       ctypes.default_abi,
                                       ctypes.void_t,
                                       CGEventRef);

let event = CGEventCreate(null);
let cursor = CGEventGetLocation(event);

CFRelease(event);

Cu.reportError(cursor);

console.log(cursor)