Создать пакет XPI с дополнительным SDK?

#javascript #firefox-addon #firefox-addon-sdk

#javascript #firefox-дополнение #firefox-addon-sdk

Вопрос:

Я получил задание написать дополнение для Firefox, которое добавит элемент div на существующую страницу. Я скачал дополнительный SDK и написал main.js файл, который выглядит следующим образом:

 var data = require("sdk/self").data;
require("sdk/tabs").on("ready", ExecuteAd);

function ExecuteAd(tab) {
  if ( tab.url.indexOf("some url checking") > -1 ) {
    var image = "http://www.lavasoft.com/img/product_icons/aaw11/free.png";
    var link = "http://www.google.me";

    tab.attach({
        contentScriptFile: data.url("myscript.js"),
        contentScript: "appendFunc('" image "', '" link "');"
        //contentScript: "alert('Works');"
    });
  }
}
  

Когда я выполняю команду cfx run , запускается Firefox, и если я перехожу на определенные веб-страницы, этот скрипт работает. Но когда я создаю файл XPI с помощью cfx xpi , а затем нажимаю на Firefox и открываю этот файл, он устанавливает мое дополнение, но теперь, когда я захожу на те же веб-страницы, которые я указал ранее, дополнение не работает. У меня есть этот внешний файл Javascript, который хранится в папке ‘data’.

appendFunc находится в myscript.js файле.

Как заставить мое расширение работать в производственной среде, а не только в среде тестирования? Я думаю, что основная проблема заключается в том, что он не находит это data/myscript.js (включено ли это в файл .xpi?)

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

1. Если вы не хотите пробовать что-то другое, кроме дополнительного sdk. Вот шаблон, который поможет вам со стилем начальной загрузки: GitHubGist :: Noitidart / watchPage …

Ответ №1:

Не смешивайте contentScript и contentScriptFile . Кроме того, вы не можете знать, какой из обоих загружается первым.

Вместо этого загрузите свой скрипт и общайтесь с помощью port .

main.js

 var data = require("sdk/self").data;
require("sdk/tabs").on("ready", ExecuteAd);

function ExecuteAd(tab) {
  var image = "http://www.lavasoft.com/img/product_icons/aaw11/free.png";
  var link = "http://www.google.me";
  var worker = tab.attach({
      contentScriptFile: data.url("myscript.js")
  });
  worker.port.emit("showAd", {image: image, link: link});
}
  

myscript.js

 self.port.on("showAd", function(data) {
  console.log("showing ad", data.link, data.image);
});
  

Кроме того, похоже, что PageMod это был бы лучший выбор для того, что вы делаете.

PS: Также ознакомьтесь с Политиками дополнительных приложений, если вы планируете размещать на addons.mozilla.org веб-сайт. Политики, например, запрещают вставлять объявления, которые а) четко не помечены как таковые и б) в которых пользователь не зарегистрировался до этого.

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

1. Это не работает с использованием связи портов в среде разработки. Я также пробовал использовать тот же метод с помощью PageMod, но он не работает в среде разработки.

2. Я не могу догадаться, что сломано в вашем коде. Я протестировал свой, и он работает с использованием cfx run и cfx xpi . Поэтому, пожалуйста, отправьте дополнительный вопрос с подробным описанием вашего кода, что именно не работает и сообщений об ошибках (или, если это все еще вписывается в рамки этого вопроса, обновите свой вопрос и дайте мне знать).