Для наложения FireFox как указать, к какой версии (версиям) Gecko / FireFox это применить?

#firefox #firefox-addon #xul

#firefox #firefox-дополнение #xul

Вопрос:

У вас есть плагин, который установлен как часть приложения, плагин должен использовать разные наложения в зависимости от того, какая версия FF используется, поскольку она изменяет интерфейс.

Я нашел https://developer.mozilla.org/en/Bundles указать разные файлы, но, похоже, это касается только ОС / разрядности.

Есть ли способ указать, что наложение применяется только к определенным версиям пользовательского интерфейса?

ie. Это работает для FF3.6 и более ранних версий, но нарушает FF4

 <overlay id="myOverlay"
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

    <dialog id="commonDialog" onload="commonDialogOnLoad(); myLoad();"
        ondialogaccept="myAccept(); return commonDialogOnAccept();">
  

Это предназначено для входа в домен и диалоговых окон входа по FTP, поэтому идея сделать его более конкретным также может помочь.

Ответ №1:

Я не делал этого сам, но я думаю, вы можете добиться этого эффекта, используя флаги в вашем chrome.manifest файле. Смотрите https://developer.mozilla.org/en/Chrome_Registration#Manifest_flags

Комментарии:

1. Кажется, это помогает, appversion>=4.0 для нового файла наложения для FF $ и appversion<=3.* для старого файла.

Ответ №2:

Технически, ответ MatrixFrog верен, вы можете использовать флаги в вашем файле chrome.manifest. Однако вам лучше учитывать тот факт, что ваш код выводит Firefox 4 из строя, как предупреждение — этот подход не следует использовать, он, вероятно, нарушит функциональность браузера. Кроме того, что, если второе расширение попытается сделать то же самое? Вы должны расширять встроенную функциональность, а не перезаписывать ее. Ваша цель, по-видимому, запустить свой собственный код при загрузке общего диалогового окна. Пожалуйста, рассмотрите следующий подход:

 <overlay id="myOverlay"
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

    <script type="text/javascript"><![CDATA[
        window.addEventListener("load", function()
        {
            // Your code here
        }, false);
    ]]></script>
</overlay>
  

Это решает две проблемы. Во-первых, вам больше не нужно переопределять существующий обработчик для события «load» — addEventListener позволяет регистрировать столько обработчиков событий, сколько вы хотите, в отличие от атрибута / свойства onload. Другая проблема: вы добавляли функцию myLoad() в глобальное пространство имен общего диалогового окна. Если Firefox code или какое-либо другое расширение решит использовать то же имя функции в будущем, возникнут проблемы. Приведенный выше код полностью устраняет эту проблему, используя анонимную функцию — конфликтов имен быть не может.

Комментарии:

1. Я понимаю вашу точку зрения, хотя немного запутался в деталях. Разве это не должно по-прежнему находиться в теге dialog, чтобы применяться только к CommonDialog, а не на верхнем уровне?

2. Теги скрипта обрабатываются особым образом — вы можете просто поместить их внутри наложения, и они будут выполняться, когда наложение будет применено. Нет необходимости явно помещать их внутри <dialog> тега, именно там они в любом случае окажутся. Примечание: Обычно единственное, что вы должны сделать при выполнении этого скрипта, — это зарегистрировать прослушиватель для load события. Выполнение чего-либо еще до load события может привести к поломке (например, другие наложения больше не будут применяться), это распространенная ошибка.

3. Пытался добавить прослушиватель событий для ‘load’, и когда это не сработало для ‘loadComplete’, который также не сработал так, как я ожидал. Необходимо выполнить некоторые дополнительные изменения после стандартной настройки — важен порядок вызова события onload. (возможно, мне следует задать другой вопрос)

4. Да, вероятно, стоит задать новый вопрос — на самом деле это не связано.