Как кто-то использует сторонние библиотеки для включения в дополнения / расширения Firefox? - PullRequest
3 голосов
/ 25 июня 2011

В настоящее время я учусь создавать дополнения Firefox с использованием XPCOM и хочу знать, как включать сторонние библиотеки для их разработки.Я выполнил несколько руководств по компиляции .xpt и .dll из файлов c ++ (отмеченных в: https://developer.mozilla.org/en/How_to_build_a_binary_XPCOM_component_using_Visual_Studio и http://nerdlife.net/building-a-c-xpcom-component-in-windows/), и я не уверен, как мы должны включать файлы в проект дополнения (который упакован в файл .xpi).

Я использую Opencv (c ++) для преобразования изображений с помощью аддона, таких как изменение размера очень большого изображения (3 Мб высокого разрешения PNG) до чего-то маленького и простого (такогокак 600X800 200kb jpg), что будет сделано моим аддоном. Я знаю, что Opencv написан на c ++, и xpcom может скомпилировать код c ++ в dll и xpt. Я прочитал несколько учебных пособий, но большинство из них указывают на добавление этих файлов (xptи dll) в папке «C: / Program Files (x86) / Mozilla Firefox / компоненты» вместо папки «компоненты /» надстроек (я полагаю, что это не то, как работают надстройки). Хотя страница Mozilla (приведенная выше) содержиткое-что о папках "{app} / components" и "{app} /application.ini", но я никогда не читал ничего подобного, поэтому я не понимаю, как это делается.

Мой другой вариантIon превращает методы Opencv в исполняемый файл, а затем запускает его отдельно (аналогично тому, как аддон MemoryFox запускает исполняемый файл для очистки памяти Firefox) и использует его для изменения размера изображения.

Я действительно не уверен, как это сделатьэто (я новичок в разработке аддонов), и я хотел бы знать, как этого добиться (используя сторонние библиотеки C ++ в аддонах).Пример, учебное пособие или объяснение хороши для начала.

Заранее спасибо.

Редактировать: Я также хотел бы сообщить, что я прочитал большую часть https://developer.mozilla.org/en/Creating_XPCOM_Components(выбрал и выбрал темы), и это не говорит мне, как достичь вышеуказанного.

Ответы [ 2 ]

3 голосов
/ 25 июня 2011

Есть несколько мест, где вы можете хранить аддон и сообщать FireFox о его существовании.В основном все сводится к тому, как вы хотите его распространять.

В MS Windows процесс loadLibrary будет искать текущий каталог, а затем путь.Простое расположение вашего xpcom.dll рядом с 3rdparty.dll в папке компонентов вашего плагина должно работать нормально.

XPCOM похож на Windows COM, но для разных платформ.
Ваша разработка соответствует требованиям интерфейсов.
Вашему аддону, возможно, не нужно определять свой собственный интерфейс (.idl -compiles-> .xpt, .h), но если это происходит из Firefox 4, вам нужно будет указать это в chrome.manifest.
После компиляции вынужно будет также перечислить вашу DLL в chrome.manifest.

взяв примерную функцию-прототип long Add(in long a, in long b);

baz_1.idl может выглядеть так:

#include "nsISupports.idl" 
[scriptable, uuid(F0F0F0F0-AAAA-BBBB-CCCC-111111111111)]
interface iBaz : nsISupports
{ 
  long Add(in long a, in long b);
};

сгенерируйте ваш заголовок и xpi distrib

$(GECKOBIN_PATH)/xpidl -m header -I $(GECKOSDK_PATH)/idl -e baz_1.idl 
$(GECKOBIN_PATH)/xpidl -m typelib -I $(GECKOSDK_PATH)/idl -e baz_1.idl 

Свяжите руководство контракта с именем контракта в C ++ для использования FF4

NS_DEFINE_NAMED_CID(BAZ_CID); // defined in baz.h generated from baz_1.idl
static const mozilla::Module::ContractIDEntry kSLMozContracts[] = {
    { "@foo.bar.com/baz;1", &kBAZ_CID },
    { NULL }
};

в C ++
nsCOMPtr<iBaz> baz = do_CreateInstance("@foo.bar.com/baz;1",&rv);

использование в JavaScript
var baz = components.classes["@foo.bar.com/baz"] .createInstance(Components.interfaces.iBaz);

Пример.
У нас есть продукт, который также предоставляет аддон Firefox, поэтому мы не поставляем xpi, но аддон находится в подпапке продукта.

Продукт в
c:\program files\foo\

addon in - давайте назовем этот foobar
c:\program files\foo\bar

, зарегистрируйте аддон

HKLM\SOFTWARE\Mozilla\Firefox\Extensions\
"{GUID}"="c:\program files\foo\bar"

, тогда макет аддона будет

foobar\chrome.manifest
foobar\install.rdf
foobar\components\baz_1.xpt
foobar\components\baz_1_32.dll
foobar\components\baz_1_64.dll
foobar\components\someOtherWorker.dll
foobar\chrome\ui.jar

В FF <4 вам не нужно было перечислять двоичные файлы в манифесте, вещи в папке компонентов загружаются и проверяются на наличие функций, чтобы определить, являются ли они xpcom, поэтому манифест chrome мог выглядеть как </p>

content baz jar:chrome/ui.jar!/content/baz/
skin baz classic/1.0 jar:chrome/ui.jar!/skin/classic/baz/ 

Начиная с FF 4, манифесту chrome нужно перечислить ваши двоичные файлы, чтобы он выглядел следующим образом (мы поддерживаем только 64-битную версию).после FF 3.5)

content baz jar:chrome/ui.jar!/content/baz/
skin baz classic/1.0 jar:chrome/ui.jar!/skin/classic/baz/ 

interfaces components/baz_1.xpt
binary-component components/baz_1_32.dll ABI=WINNT_x86-msvc
binary-component components/baz_1_64.dll ABI=WINNT_x86_64-msvc appversion>=3.5

FireFox 5 (Out now) изменил

  • форматы файлов xpt - так что ваши интерфейсы не будут найдены FF5, если вы не создадите с помощьюэтот SDK.
  • версия регистрации xpcom - поэтому FF5 не будет использовать dll, созданную для FF4, так как версия xpcom недостаточно высока.
2 голосов
/ 25 июня 2011

Учебник, на который вы ссылаетесь, касается разработки приложений, а не расширений.Таким образом, application.ini не применяется в вашем случае.Расширения имеют файл манифеста с именем chrome.manifest, начиная с Firefox 4, все компоненты XPCOM и файлы XPT должны быть зарегистрированы там, иначе они будут игнорироваться.Больше не имеет значения, где находится компонент, хотя components/ все равно будет для них общим местом.https://developer.mozilla.org/en/XPCOM/XPCOM_changes_in_Gecko_2.0#Component_registration должна быть хорошей отправной точкой - это должно объяснить, что вам нужно там написать.

Обратите внимание, что исходный код в учебниках, которые вы читали, также устарел.Текущие примеры кода связаны с https://developer.mozilla.org/en/XPCOM/XPCOM_changes_in_Gecko_2.0#Binary_components. И вы должны использовать XULRunner SDK 2.0 (соответствует Firefox 4) или выше.Извините, вы прибыли в неудачное время - это самое большое изменение в XPCOM за последние 10 лет.

...