我正在使用SDK开发新版本的插件(定位Gmail),并且需要为我的用户存储一些布尔首选项。为此,我想使用新的“simple-prefs”API。基于Mozilla documentation和此Stackoverflow question,我得到了一些东西,但我面临以下问题:
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"
}]
}
我的main.js:
const pageMod = require("page-mod");
const data = require("self").data;
const prefSet = require("simple-prefs");
// Get the values for options
var option1 = prefSet.prefs.option1;
var option2 = prefSet.prefs.option2;
// Listen for changes
function onPrefChange(prefName) { prefSet.prefs[prefName]; }
prefSet.on("option1", onPrefChange);
prefSet.on("option2", onPrefChange);
exports.main = function() {
pageMod.PageMod({
include: ["https://mail.google.com/*","http://mail.google.com/*"],
contentScriptWhen: 'ready',
contentScriptFile: [data.url("jquery.js"),data.url("script.js")],
onAttach: function(worker)
{
worker.postMessage(option1);
worker.postMessage(option2);
}
});
}
我的script.js(数据中):
(function(){
// Option 1
self.on("message", function(option1) {
if( option1 == true ) {
// Do this
}});
// Option 2
self.on("message", function(option2) {
if( option2 == true ) {
// Do this
}});
})();
在我的main.js文件中使用postMessage协议肯定有一种更简洁的方法,并在我的script.js文件中调用它...随意提出您的想法和建议!
答案 0 :(得分:3)
您需要在onAttach处理程序中设置pref更改处理程序,因为它是代码中唯一可以访问prefSet全局和给定页面的worker实例的位置。这种模式对我有用:
const pageMod = require("page-mod");
const data = require("self").data;
const prefSet = require("simple-prefs");
// Listen for changes
exports.main = function() {
pageMod.PageMod({
include: ["*"],
contentScriptWhen: 'end',
contentScript: 'self.port.on("prefchange", function(data) { console.log(JSON.stringify(data,null," ")); })',
onAttach: function(worker) {
function onPrefChange(prefName) {
worker.port.emit('prefchange', [prefName, prefSet.prefs[prefName]]);
}
prefSet.on("option1", onPrefChange);
prefSet.on("option2", onPrefChange);
}
});
}
请参阅此github repo以获取一个工作示例:https://github.com/canuckistani/Pref-changes
答案 1 :(得分:2)
好的,这是我想要的工作版本,虽然很难看。因此,如果您有更好的方法来实现它,请随时分享!
我的 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"
}]
}
我的 main.js :
const pageMod = require("page-mod");
const data = require("self").data;
const prefSet = require("simple-prefs");
exports.main = function() {
pageMod.PageMod({
include: ["*//example.com/*"],
contentScriptWhen: 'end',
contentScriptFile: [data.url("jquery.js"),data.url("script.js")],
onAttach: function(worker) {
// Persistent values
var option1 = prefSet.prefs.option1;
var option2 = prefSet.prefs.option2;
worker.port.emit('get-prefs', [ option1, option2 ]); // sender1
// Listen for changes
function onPrefChange(prefName) {
let payload = [prefName, prefSet.prefs[prefName]];
worker.port.emit('prefchange', payload); // sender2
}
prefSet.on("option1", onPrefChange);
prefSet.on("option2", onPrefChange);
}
});
}
和我的 script.js (在数据中):
(function(){
// Persistent Values
self.port.on("get-prefs", function(prefs) {
// onPrefchange Values
self.port.on("prefchange", function(data) {
$(document).ready(function() {
var option1 = prefs[0];
var option2 = prefs[1];
var option = data[0];
var value = data[1];
var css;
if(option1 == true || option == "option1" && value == true){
css = "body {background-color:red !important}";
}
if(option2 == true || option == "option2" && value == true){
css = "body {background-color:blue !important}";
}
///////////////////////////////// CSS Activation
$('head').append('<style type="text/css">' + css + '</style>');
//////////////////////////////// #CSS Activation
});//end jQuery ready
});
});
})();