Как запаковать расширение Firefox с нуля

Я новичок в расширениях Firefox, и я хотел бы, чтобы вы помогли мне упаковать одно расширение, которое я создаю, и отправить его друзьям для тестирования.

Мое расширение собирается «заблокировать» некоторые URL-адреса. Это означает, что если кто-то пытается присоединиться к facebook.com, мое расширение должно перенаправить его на www.google.com.

код ниже.

const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
Cu.import('resource://gre/modules/Services.jsm');
var urls_block = [ 
    //If URLs contain any of these elements they will be blocked or redirected,
    //  your choice based on code in observer line 17
    'www.facebook.com',
     'www.apple.com'
];
var redir_obj = {
    'www.facebook.com': 'http://www.google.com/',
    'www.apple.com': 'http://www.samsung.com'
}
var observers = {
    'http-on-modify-request': {
        observe: function (aSubject, aTopic, aData) {
            console.info('http-on-modify-request: aSubject = ' 
                          + aSubject + ' | aTopic = ' + aTopic + ' | aData = ' + aData);
            var httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel);
            var requestUrl = httpChannel.URI.spec.toLowerCase();
            for (var i=0; i<urls_block.length; i++) {
                if (requestUrl.indexOf(urls_block[i]) > -1) {
                    //httpChannel.cancel(Cr.NS_BINDING_ABORTED); //this aborts the load
                    //Can redirect with this next line, if don't want to redirect and
                    //  just block, then comment this line and uncomment the line above:
                    httpChannel.redirectTo(Services.io.newURI(redir_obj[urls_block[i]],
                                               null, null));
                    break;
                }
            }
        },
        reg: function () {
            Services.obs.addObserver(observers['http-on-modify-request'],
                                           'http-on-modify-request', false);
        },
        unreg: function () {
            Services.obs.removeObserver(observers['http-on-modify-request'], 
                                           'http-on-modify-request');
        }
    }
};
function install() {}
function uninstall() {}
function startup() {
    for (var o in observers) {
        observers[o].reg();
    }
}

function shutdown(aData, aReason) {
    if (aReason == APP_SHUTDOWN) return;

    for (var o in observers) {
        observers[o].unreg();
    }
}

Большое спасибо @Noitidart за его огромную помощь.

Итак, я хочу упаковать этот код для расширения Firefox. Может ли кто-нибудь показать мне, как это сделать, или какой-либо пример?

Большое спасибо за то, что помогли мне здесь.


person Community    schedule 25.06.2015    source источник
comment
Небольшое примечание: то, что у вас есть, выглядит как файл bootstrap.js. Следуйте тому, что говорит Макиен, но используйте свой код для bootstrap.js.   -  person Michael Buckley    schedule 25.06.2015
comment
Не за что. Вот что-то, что архивируется и устанавливает надстройки начальной загрузки: addons.mozilla.org/ en-US / firefox / addon / xpicompiler вот несколько простых примеров: gist.github.com/ Noitidart / 9025999, ридми этого содержания многое объясняет   -  person Noitidart    schedule 26.06.2015
comment
@Noitidart Снова здорово !! можно ли обновить его онлайн через веб-сайт? или я должен задать еще один вопрос по этому поводу?   -  person    schedule 26.06.2015
comment
@SteliosM. крутой человек, я уверен, что ты справишься, но я не знаю как. Я предпочитаю просто загрузить его на addons.mozilla.org и установить видимость как частную, чтобы другие не могли его найти, а затем поделитесь этим как ссылкой для загрузки на ваш аддон   -  person Noitidart    schedule 26.06.2015
comment
@Noitidart спасибо большое за все! :)   -  person    schedule 27.06.2015
comment
Крутой мужик @SteliosM. :)   -  person Noitidart    schedule 27.06.2015


Ответы (1)


Как минимум, вам потребуется создать install.rdf и файл chrome.manifest < / a> файл. Пройдя по этим ссылкам, вам нужно будет сделать выбор (например, как называть свой добавочный номер, <em:id> и т. Д.).

Кроме того, похоже, что вы добавляете bootstrap / restartless -on и должен вызывать файл, содержащий код, который вы включили в вопрос: bootstrap.js

.xpi формат файла (Упаковка расширений):

Файлы .xpi, которые используются в качестве контейнеров для расширений Mozilla (Firefox, Thunderbird и т. Д.), Представляют собой просто сжатые архивы с расширением zip, расширение которых изменено на .xpi. Файлы начинаются в корневом каталоге сжатого zip-архива (т. Е. Существует каталог первого уровня, в котором хранятся файлы). Файлы должны быть либо несжатыми, либо сжатыми с использованием алгоритма «Deflate». Использование других алгоритмов сжатия приведет к тому, что ваш .xpi файл не загрузится и появится всплывающее окно, указывающее, что надстройка повреждена.

Содержимое архива может быть от нескольких файлов до любого количества файлов. Как минимум, у вас есть install.rdf < / a> и файл chrome.manifest . Почти всегда будет хотя бы один дополнительный файл (если не много дополнительных файлов).

Мое очень простое расширение Bootstrap / Restartless, Print Button is Print (изменяет кнопку печати для печати вместо предварительного просмотра), имеет следующую структуру:

Archive contains:
  bootstrap.js
  chrome/
  chrome/content/
  chrome/content/options.xul
  chrome/skin/
  chrome/skin/printer-typeC128.png
  chrome/skin/printer-typeC32.png
  chrome/skin/printer-typeC48.png
  chrome/skin/printer-typeC64.png
  chrome.manifest
  install.rdf
  license.txt
Total 12 entries (42360 bytes)
  • Есть требуемые install.rdf и файлы chrome.manifest.
  • Требуется файл bootstrap.js для расширений Bootstrap / Restartless. Он содержит код, который запускается при установке, удалении, включении, отключении расширения или при запуске или завершении работы Firefox. Это расширение достаточно простое, поэтому весь код JavaScript содержится в bootstrap.js.
  • Существует файл chrome / content / options.xul, который является XUL-определением диалоговое окно настроек.
  • license.txt просто объясняет, что расширение было выпущено под Mozilla Public License, v2. .0.
  • Файлы .png являются значком этого расширения в различных разрешениях.

Файл install.rdf для кнопки печати имеет значение Print is (все экземпляры PrintButtonIsPrint должны быть изменены на что-то для вашего расширения, которое вы определяете в своем файле chrome.manifest; все их вы можете просто удалить из файла instal.rdf, если хотите, поскольку у вас нет диалогового окна параметров или определенных значков (пока).):

<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:em="http://www.mozilla.org/2004/em-rdf#">
    <Description about="urn:mozilla:install-manifest">
    <em:id>[email protected]</em:id> <!-- MUST be unique to your extension. -->
    <em:version>1.0.1</em:version>
    <em:type>2</em:type>
    <em:name>Print Button is Print</em:name> <!-- Should be unique to your extension. -->
    <em:bootstrap>true</em:bootstrap> <!-- Indicate that the extension is restartless -->
    <em:unpack>false</em:unpack>
    <em:description>Makes the Print Button print the page instead of presenting a print preview. Adds the option of using shift-left-click and/or ctrl-left-click for Print Preview (both enabled by default).</em:description>
    <em:creator>Makyen</em:creator>
    <!-- No about.
    <em:aboutURL>chrome://PrintButtonIsPrint/content/about.xul</em:aboutURL>
    -->
    <em:optionsURL>chrome://PrintButtonIsPrint/content/options.xul</em:optionsURL>
    <em:iconURL>chrome://PrintButtonIsPrint/skin/printer-typeC48.png</em:iconURL> 
    <em:icon64URL>chrome://PrintButtonIsPrint/skin/printer-typeC64.png</em:icon64URL> 
<!--Firefox-->
    <em:targetApplication>
        <Description>
            <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
            <em:minVersion>29.0</em:minVersion>
            <em:maxVersion>37.*</em:maxVersion>
        </Description>
    </em:targetApplication>
    </Description>
</RDF>

chrome.manifest (оба экземпляра PrintButtonIsPrint следует заменить на что-то для вашего расширения):

content      PrintButtonIsPrint                                         chrome/content/
skin         PrintButtonIsPrint               classic/1.0               chrome/skin/

Для создания файла .xpi я использую пакетный файл, в котором используется комбинация DOS и Unix / Linux (на самом деле Cygwin) команды:

mkxpi.bat:

rm -f [email protected]
zip -1 -r [email protected] * [email protected]
pause

Это удалит все старые версии файла .xpi. Затем он создает новый .xpi файл, используя -1 минимальное сжатие (скорость доступа важнее экономии места) и содержащий все файлы и подкаталоги * *, но игнорируя все файлы в тексте xpi.ignore файл [email protected]. Игнорирование файлов используется, потому что у меня есть другие вещи в каталоге (например, .git каталог, .bak файлы, автоматически созданные из редактора, и т. Д.). После создания .xpi файла сценарий выполняет pause, чтобы я мог проверить, какие файлы были включены, что не было ошибок и т. Д., Вместо того, чтобы просто закрыть окно и предположить, что все в порядке.

Мой файл xpi.ignore немного длинноват, поскольку в нем накапливается мусор из различных проектов, и его редко удаляют:

*.com
*.class
*.dll
*.exe
*.o
*.so
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip
*.log
*.sql
*.sqlite
*.svg
*/.DS_Store
*/.DS_Store?
*/._*
._*
*/.Spotlight-V100
.Spotlight-V100
*/.Trashes
.Trashes
*/ehthumbs.db
*/Thumbs.db
*.ORIG
*.bak
*OLD*
OLD/*
*/OLD/*
*.OLD
*.OLD[0-9]
*/OLD/*
*/OLD[0-9]/*
*.unknown
*.unknown[0-9]
*.updated
*.updated[0-9]
*/Copy *
*/OLD
*/OLD*
*/OLD[0-9]
*/OLD[0-9][0-9]
*/test/*
*/not in xpi/*
*/tmp
*.tmp
*/foo
*.foo
*checkpoint
.git
*/.git
.gitignore
*/.gitignore
xpi.ignore
mkclean.bat
mkclean.bat.DONTRUN
mkxpi.bat
*.xpi
*/devtools-toolbox-window.ico
*/devtools-webconsole.ico
*/JSConsoleWindow.ico
*/main-window.ico
*/places.ico
*/viewSource.ico

Установка расширений:

Что касается установки расширений (т.е. файла .xpi), это может быть просто перетащите его в окно Firefox, в котором запущен профиль, в котором вы хотите его установить. Для разработки / тестирования вы можете разместить расширение в каталоге на локальном диске. с помощью прокси-файла расширения Firefox (создайте файл с именем в качестве <em:id> расширения в каталоге extensions профиля, содержащего одну строку с полным путем к каталогу, содержащему файлы расширения). В зависимости от вашей цели (один профиль, все профили, все пользователи, какая ОС и т. Д.) Существуют другие варианты того, как установить расширения.

Этот ответ в основном скопирован из моего ответа здесь.

person Makyen♦    schedule 25.06.2015
comment
что я должен указать в качестве идентификатора описания ?? потому что у вас большое число - person ; 25.06.2015
comment
@SteliosM. <em:targetApplication><Description><em:id> в приведенном выше примере - это идентификатор Firefox, и он зафиксирован. Если вы хотите, чтобы ваше расширение загружалось в Firefox, вы используете именно его. Если вы хотите загрузить в другое или дополнительное приложение (например, Thunderbird), вы используете другое или дополнительное <em:targetApplication>. Вы можете найти список GUID и допустимых версий приложений, на MDN . - person Makyen♦; 25.06.2015