как конвертировать расширение Firefox Jetpack -> расширение SDK Firefox аддон - PullRequest
2 голосов
/ 15 января 2012

Я использую Add-on Builder Beta (Firefox) и пытаюсь сделать что-то вроде этого:

(В Addon Builder есть 3 раздела: Lib, Data, Libraries)

  1. Получить файл "def.htm" из раздела данных и открыть его в новой вкладке. Я делаю это с помощью этого:

    var tabs = require("tabs");
    var data = require("self").data;
    tabs.open(data.url('def.htm'));
    
  2. Получить определение JSONиз "def.htm" def.htm выглядит так:

    <html><head>
    <title>Def title</title>
    </head><body>
    <script type="text/javascript">
        this.definition = {
            aaa: 1000,
            bbb: {
                ccc: {
                    ddd: "eee",
                    ...
                    ...
       };
    </script>
    </body></html>
    
  3. Вызовите функцию JS и передайте ей определение:

Он работает с расширением Jetpack (в Firefox 3.5), вот код:

jetpack.tabs.onReady(function() {
    var window = this.contentWindow.wrappedJSObject;
    var def = window.definition;

    dowork (def); 
});

Мне нужна такая же функциональность в Add-on SDK.

1 Ответ

1 голос
/ 16 января 2012

Это довольно странный подход, почему вы пытаетесь получить данные JSON таким сложным способом? Как насчет помещения его в файл data/definition.json (затем правильно закодированный):

{
    "aaa": 1000,
    "bbb": {
        "ccc": {
            "ddd": "eee",
            ...
            ...
};

И считывание с использованием пакета request :

var Request = require("request").Request;
var data = require("self").data;
Request({
  url: data.url("definitions.json"),
  onComplete: function(response)
  {
    dowork(response.json);
  }
});

Но если вы действительно хотите получить доступ к данным на вкладке - Add-on SDK не разрешает прямой доступ к страницам контента с вашего расширения. Вы можете использовать пакет page-mod , чтобы внедрить на эту страницу скрипт содержимого, который затем отправит данные обратно в расширение. Что-то вроде этого:

var PageMod = require("page-mod").PageMod;
PageMod({
  include: data.url("def.htm"),
  contentScriptWhen: 'end',
  contentScript: 'self.postMessage(definition)',
  onAttach: function onAttach(worker)
  {
    worker.on("message", function(data)
    {
      dowork(data);
    });
  }
});
...