使用带有外部脚本和postMessage的simple-prefs(SDK API)

时间:2012-04-15 15:00:16

标签: firefox-addon firefox-addon-sdk

我正在使用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文件中调用它...随意提出您的想法和建议!

2 个答案:

答案 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
 });
 });

})();