Расширение Firefox / Бинарный компонент Addon Обратная совместимость - PullRequest
2 голосов
/ 26 июня 2011

Я читал и искал способы компилировать двоичные компоненты для расширений Firefox. Поскольку Firefox 5 выходит (а скоро появятся 6 и 7), мне было интересно, стоит ли делать больше двоичные компоненты или просто использовать автономный исполняемый файл для запуска нужной мне функциональности.

Я получил пример двоичного компонента для компиляции для Firefox 5, но когда я тестировал его на Firefox 3.6, я получил эту ошибку:

[Exception... "Could not convert Native argument arg 0 [nsISupports.QueryInterface]" nsresult: "0x8057000a (NS_ERROR_XPC_BAD_CONVERT_NATIVE)"

Запуск этого кода

var obj = Components.classes['@example.com/MyComponent;1'].QueryInterface(Components.interfaces.IMyComponent);

И ошибки в QueryInterface. Очевидно, сборка для Firefox 4 (XULrunner-sdk 2.0 вместо 5.0 будет работать).

Вот код модуля:

#include "mozilla/ModuleUtils.h"
#include "MyComponent.h"

NS_GENERIC_FACTORY_CONSTRUCTOR(MyComponent)

NS_DEFINE_NAMED_CID(MY_COMPONENT_CID);

static const mozilla::Module::CIDEntry kMyComponentCIDs[] = {
    { &kMY_COMPONENT_CID, false, NULL, MyComponentConstructor },
    { NULL }
};

static const mozilla::Module::ContractIDEntry kMyComponentContracts[] = {
    { MY_COMPONENT_CONTRACTID, &kMY_COMPONENT_CID },
    { NULL }
};

static const mozilla::Module kMyComponentModule = {
    mozilla::Module::kVersion,
    kMyComponentCIDs,
    kMyComponentContracts,
    NULL
};

NSMODULE_DEFN(NS_MyComponent_Module) = &kMyComponentModule;
NS_IMPL_MOZILLA192_NSGETMODULE(&kMyComponentModule)

Я также слышал, что FF3.6 не нужно иметь xpt или dll внутри файла манифеста.

Так что в основном мой вопрос таков: для обратной совместимости было бы лучше создать исполняемый файл или продолжить создавать двоичные компоненты? (Так как похоже на компиляцию для FF5, FF3.6 сломался.)

1 Ответ

4 голосов
/ 27 июня 2011

Ваше сообщение об ошибке должно быть из-за неправильного распознавания файла XPT (Components.interfaces.IMyComponent - undefined). Может быть, это потому, что он находится не в том каталоге - в Firefox 3.6 вы не объявляете его в файле chrome.manifest, вместо этого он должен находиться в каталоге compoments/ вместе с вашим файлом dll.

История обратной совместимости компонентов XPCOM стала намного хуже, начиная с Firefox 4, см. https://developer.mozilla.org/En/Developer_Guide/Interface_Compatibility#Binary_Interfaces. Теоретически, если вы хотите поддерживать несколько версий Firefox, вам нужно поместить несколько версий компонента XPCOM в ваш пакет XPI. Это много усилий для релизов, которые выходят каждые шесть недель. Если точка действительно вызывает несколько функций из собственной библиотеки, то вам следует серьезно подумать о переключении на js-ctypes . Вы также можете поставить собственную библиотеку (обычную, не XPCOM) со своим расширением и использовать js-ctypes для ее вызова. Firefox поддерживает js-ctypes начиная с версии 4 (Gecko 2.0), для Firefox 3.6 вам все равно потребуется другое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...