Firefox addon 使用带有外部脚本和postMessage的简单prefs(SDK API)

Firefox addon 使用带有外部脚本和postMessage的简单prefs(SDK API),firefox-addon,firefox-addon-sdk,Firefox Addon,Firefox Addon Sdk,我正在使用SDK开发一个新版本的插件(针对Gmail),需要为我的用户存储一些布尔首选项。为此,我想使用新的“SimplePrefs”API。基于此,我得到了一些东西,但我面临以下问题: 1) 我无法将首选项的更改正确地传递到数据中的外部脚本。我需要禁用并重新启用加载项以应用更改 2) 如何确保首选项直接应用于打开Gmail的选项卡 这是我的package.json: { "name": "Demo", "license": "MPL 1.1/GPL 2.0/LGPL 2.1", "auth

我正在使用SDK开发一个新版本的插件(针对Gmail),需要为我的用户存储一些布尔首选项。为此,我想使用新的“SimplePrefs”API。基于此,我得到了一些东西,但我面临以下问题:

1) 我无法将首选项的更改正确地传递到数据中的外部脚本。我需要禁用并重新启用加载项以应用更改

2) 如何确保首选项直接应用于打开Gmail的选项卡

这是我的package.json:

{
"name": "Demo", 
"license": "MPL 1.1/GPL 2.0/LGPL 2.1", 
"author": "me", 
...

"preferences": [{
    "type": "bool",
    "name": "option1",
    "value": true,
    "title": "Description Option1"
},
    {
    "type": "bool",
    "name": "option2",
    "value": true,
    "title": "Description Option2"
  }]
}
My main.js:

const pageMod=require(“页面修改”);
常量数据=需要(“自身”)数据;
const prefSet=require(“简单prefs”);
//获取选项的值
var option1=prefSet.prefs.option1;
var option2=prefSet.prefs.option2;
//倾听变化
函数onPrefChange(prefName){prefSet.prefs[prefName];}
打开预设置(“选项1”,打开预设置更改);
打开预设置(“选项2”,打开预设置更改);
exports.main=函数(){
pageMod.pageMod({
包括:[”https://mail.google.com/*","http://mail.google.com/*"],
contentScriptWhen:'准备就绪',
contentScriptFile:[data.url(“jquery.js”)、data.url(“script.js”)],
onAttach:功能(工作程序)
{
worker.postMessage(选项1);
worker.postMessage(选项2);
}
});
}
My script.js(在数据中):

(函数(){
//选择1
self.on(“消息”,函数(选项1){
如果(选项1==true){
//这样做
}});
//选择2
self.on(“消息”,函数(选项2){
如果(选项2==true){
//这样做
}});
})();

在main.js文件中使用postMessage协议并在script.js文件中调用它肯定有一种更简洁的方法。。。请随时提出您的想法和建议

您需要在onAttach处理程序中设置pref change处理程序,因为它是代码中唯一可以访问prefSet全局和给定页面的工作实例的地方。这种模式适合我:

const pageMod=require(“页面修改”);
常量数据=需要(“自身”)数据;
const prefSet=require(“简单prefs”);
//倾听变化
exports.main=函数(){
pageMod.pageMod({
包括:[“*”],
contentScriptWhen:'结束',
contentScript:'self.port.on(“prefchange”,函数(数据){console.log(JSON.stringify(数据,null,”);}),
onAttach:功能(工作程序){
函数onPrefChange(prefName){
worker.port.emit('prefchange',[prefName,prefSet.prefs[prefName]]);
}
打开预设置(“选项1”,打开预设置更改);
打开预设置(“选项2”,打开预设置更改);
}
});
}

查看这个github repo的工作示例:

好的,这是我想要的一个工作版本,虽然很难看。因此,如果你有一个更漂亮的方式来实现它,请随时分享

Mypackage.json

{
"name": "Demo", 
"license": "MPL 1.1/GPL 2.0/LGPL 2.1", 
"author": "me", 
...

"preferences": [{
    "type": "bool",
    "name": "option1",
    "value": true,
    "title": "Description Option1"
},
    {
    "type": "bool",
    "name": "option2",
    "value": true,
    "title": "Description Option2"
  }]
}
Mymain.js

{
"name": "Demo", 
"license": "MPL 1.1/GPL 2.0/LGPL 2.1", 
"author": "me", 
...

"preferences": [{
    "type": "bool",
    "name": "option1",
    "value": true,
    "title": "Description Option1"
},
    {
    "type": "bool",
    "name": "option2",
    "value": true,
    "title": "Description Option2"
  }]
}
const pageMod=require(“页面修改”);
常量数据=需要(“自身”)数据;
const prefSet=require(“简单prefs”);
exports.main=函数(){
pageMod.pageMod({
包括:[“*//example.com/*”],
contentScriptWhen:'结束',
contentScriptFile:[data.url(“jquery.js”)、data.url(“script.js”)],
onAttach:功能(工作程序){
//持久值
var option1=prefSet.prefs.option1;
var option2=prefSet.prefs.option2;
worker.port.emit('get-prefs',[option1,option2]);//发送者1
//倾听变化
函数onPrefChange(prefName){
让有效负载=[prefName,prefSet.prefs[prefName]];
worker.port.emit('prefchange',payload);//发送者2
}
打开预设置(“选项1”,打开预设置更改);
打开预设置(“选项2”,打开预设置更改);
}
});
}
和myscript.js(数据中):

(函数(){
//持久值
self.port.on(“获取prefs”,函数(prefs){
//onPrefchange值
self.port.on(“prefchange”),函数(数据){
$(文档).ready(函数(){
var option1=prefs[0];
var option2=prefs[1];
var选项=数据[0];
var值=数据[1];
var-css;
if(option1==true | | option==option1&value==true){
css=“body{背景色:红色!重要}”;
}
if(option2==true | | option==option2&value==true){
css=“body{背景色:蓝色!重要}”;
}
/////////////////////////////////CSS激活
$('head')。追加(''+css+'');
////////////////////////////////#CSS激活
});//结束jQuery就绪
});
});
})();

谢谢@canuckistani。慢慢地到达那里。然而,我仍然有一些困难,让它与我的外部脚本和后消息一起工作。到底有什么困难?如果有帮助,我的代码发布在这里: