4

我正在使用 SDK 开发我的附加组件的新版本(针对 Gmail),并且需要为我的用户存储一些布尔首选项。为此,我想使用新的“simple-prefs”API。根据Mozilla 文档和这个Stackoverflow 问题,我得到了一些东西,但我面临以下问题:

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 文件中调用它当然有一种更简洁的方法......请随意提出您的想法和建议!

4

2 回答 2

3

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

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 存储库:https ://github.com/canuckistani/Pref-changes

于 2012-04-16T04:01:33.797 回答
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
 });
 });

})();
于 2012-04-19T13:56:32.220 回答