cómo convertir la extensión de firefox jetpack -> a la extensión sdk del complemento de firefox
-
28-10-2019 - |
Pregunta
Estoy usando Add-on Builder Beta (Firefox) y estoy intentando hacer algo como esto:
(Hay 3 secciones en Addon Builder: Lib, Datos, Bibliotecas)
-
Obtenga el archivo "def.htm" de la sección de datos y ábralo en una nueva pestaña Lo hago con esto:
var tabs = require("tabs"); var data = require("self").data; tabs.open(data.url('def.htm'));
-
Obtenga la definición JSON de "def.htm" def.htm se ve así:
<html><head> <title>Def title</title> </head><body> <script type="text/javascript"> this.definition = { aaa: 1000, bbb: { ccc: { ddd: "eee", ... ... }; </script> </body></html>
-
Llame a la función JS y pásele la definición:
Funciona con la extensión Jetpack (en Firefox 3.5), aquí está el código:
jetpack.tabs.onReady(function() {
var window = this.contentWindow.wrappedJSObject;
var def = window.definition;
dowork (def);
});
Necesito la misma funcionalidad en Add-on SDK.
Solución
Ese es un enfoque bastante extraño, ¿por qué está tratando de obtener datos JSON de una manera tan complicada?¿Qué tal ponerlo en un archivo data/definition.json
(codificado correctamente entonces):
{
"aaa": 1000,
"bbb": {
"ccc": {
"ddd": "eee",
...
...
};
Y leerlo usando el paquete request
:
var Request = require("request").Request;
var data = require("self").data;
Request({
url: data.url("definitions.json"),
onComplete: function(response)
{
dowork(response.json);
}
});
Pero si realmente desea acceder a los datos en una pestaña, el SDK complementario no permite el acceso directo a las páginas de contenido desde su extensión.Puede utilizar paquete page-mod
para inyectar un script de contenido en esta página que luego enviará los datos de vuelta a la extensión.Algo parecido a esto:
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);
});
}
});