Comment convertir l'extension de Firefox Jetpack -> à Firefox Addon SDK Extension
-
28-10-2019 - |
Question
J'utilise Builder Beta (Firefox) et j'essaie de faire quelque chose comme ceci:
(Il y a 3 sections dans Addon Builder: Lib, Data, Libraries)
Obtenez un fichier "Def.htm" à partir de la section de données et ouvrez-les dans un nouvel onglet je le fais avec ceci:
var tabs = require("tabs"); var data = require("self").data; tabs.open(data.url('def.htm'));
Obtenez la définition JSON de "Def.htm" Def.htm ressemble à ceci:
<html><head> <title>Def title</title> </head><body> <script type="text/javascript"> this.definition = { aaa: 1000, bbb: { ccc: { ddd: "eee", ... ... }; </script> </body></html>
Appelez la fonction JS et passez la définition:
Il fonctionne avec l'extension Jetpack (sur Firefox 3.5), voici le code:
jetpack.tabs.onReady(function() {
var window = this.contentWindow.wrappedJSObject;
var def = window.definition;
dowork (def);
});
J'ai besoin des mêmes fonctionnalités sur le SDK complémentaire.
La solution
C'est une approche assez étrange, pourquoi essayez-vous d'obtenir des données JSON d'une manière si compliquée? Que diriez-vous de le mettre dans un fichier data/definition.json
(correctement encodé alors):
{
"aaa": 1000,
"bbb": {
"ccc": {
"ddd": "eee",
...
...
};
Et le lire en utilisant le request
forfait:
var Request = require("request").Request;
var data = require("self").data;
Request({
url: data.url("definitions.json"),
onComplete: function(response)
{
dowork(response.json);
}
});
Mais si vous souhaitez vraiment accéder aux données dans un onglet - le SDK complémentaire n'autorise pas l'accès direct aux pages de contenu à partir de votre extension. Vous pouvez utiliser le page-mod
forfait Pour injecter un script de contenu dans cette page qui renverra ensuite les données à l'extension. Quelque chose dans ce sens:
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);
});
}
});