Как ссылаться на файл JavaScript в Lib из файла HTML в Data? - PullRequest
2 голосов
/ 03 января 2012

Я решил попробовать Конструктор дополнений Mozilla . Моя структура каталогов выглядит примерно так:

enter image description here

Проблема в том, что файл popup.html должен ссылаться на stackapi.js. Но я понятия не имею, как это сделать. Просматривая документы Mozilla, кажется, есть способ сделать обратное:

var data = require("self").data;
var url_of_popup = data.url("popup.html");

Это позволяет скриптам в Lib получать доступ к файлам данных в Data. Но мне нужно поступить наоборот.

Ответы [ 3 ]

3 голосов
/ 10 января 2012

В надстройках, созданных с помощью Add-on SDK (а Builder - просто веб-интерфейс для SDK), веб-страницы не могут напрямую обращаться к модулям расширения - у них нет необходимых привилегий. Если вам просто нужно добавить файл JavaScript с веб-страницы, поместите этот файл в каталог data. Однако у него не будет никаких особых привилегий (например, возможность звонить require()).

Вы не говорите, как используете popup.html, но я думаю, что это панель . Если вы хотите, чтобы эта страница взаимодействовала с вашим дополнением, вам нужно использовать скрипты контента. Поместите файл сценария содержимого в каталог data, назначьте его панели с помощью параметра contentScriptFile. См. документацию по сценариям содержимого , сценарий содержимого сможет использовать self.postMessage() для отправки сообщений на расширение, расширение может выполнять необходимые операции и отправлять сообщение тогда.

2 голосов
/ 02 августа 2013

Вы можете получить URL-адрес файла stackapi.js, перейдя вверх из папки /data и обратно вниз в папку /lib, например:

var url=require("sdk/self").data.url("../lib/stackapi.js");

Затем используйте этот URL ресурса в параметре contentScriptFile, когда присоединяете сценарии к тому, что, как я предполагаю, будет popup.html.

Вам нужно будет проверить, в какой среде вы находитесь в данный момент, чтобы определить, нужно ли добавлять какие-либо ссылки на объект exports, чтобы сделать их доступными из дополнения.

if(typeof(exports)!="undefined"){
  exports.something=function(){...};
}
0 голосов
/ 20 июля 2015

Пришлось пройти по тому же сценарию, но решение от jongo45, похоже, больше не работает. Как-то нашел решение, которое сработало для меня. Публикация ниже, поскольку это может помочь кому-то нуждающемуся.

Ниже код получает список всех файлов в "lib / subdir".

const fileIO = require("sdk/io/file");    
const fspath = require("sdk/fs/path");
const {Cc, Ci} = require("chrome");

const currDir = Cc["@mozilla.org/file/directory_service;1"]
            .getService(Ci.nsIDirectoryServiceProvider)
            .getFile("CurWorkD", {}).path;

const listOfFiles = fileIO.list(fspath.resolve(currDir,'lib/subdir'));
...