如何将SDK PageMod()转换为Webextension

时间:2017-12-07 11:01:45

标签: javascript firefox firefox-addon firefox-webextensions

我在 Firefox SDK 应用中使用pageMod(),我希望转换为 Webextension

我在我的背景js文件中声明:

var pageMod = require("sdk/page-mod");

我在manifest.json

中声明了 Webextension 中的不受欢迎
"content_scripts": [
    {
      "matches": ["*://*.mytestsite.com/*"],
      "js": ["background.js"]
    }
  ]

但是我在我的pageMod()脚本中调用background,我有很多附件和其他内容。我不知道我怎么能改变这个。

例如我想转换的内容:

pageMod.PageMod({
  include: "*.mytestsite.com",
  contentScriptFile: [self.data.url("jquery-2.0.3.min.js"), self.data.url("jquery-ui.min.js"), self.data.url("site_modal_min.js"), self.data.url("timerreview.js")],
  onAttach: function onAttach(worker) {

如何使用 Webxtension

进行PageMod()调用

1 个答案:

答案 0 :(得分:0)

请注意,在manifest.json中,您不能在content_scripts标记内包含background.js。你会这样做(假设你的域匹配选择器是正确的):

"background": {
    "scripts": ["background.js"]
},

"content_scripts": [
  {
    "matches": ["*://*.mytestsite.com/*"],
    "js": ["timerreview.js", "jquery.js"]
  }
]

如果要进行通信(变量等),请使用后台脚本和内容脚本之间的消息传递。这特别有用,因为大多数WebExtensions API仅适用于后台脚本。

在内容脚本中,添加:

// Listen for messages from the background script
browser.runtime.onMessage.addListener(onMessage);

function onMessage(message) {
    switch(message.action)
        case "testAction":
            testAction(message.data);
            break;
        default:
            break;
    }
}

function sendMessage(action, data){
    browser.runtime.sendMessage({"action": action, "data": data});
}

在后台脚本中,添加:

// listen for messages from the content or options script
browser.runtime.onMessage.addListener(function(message) {
    switch (message.action) {
        case "actionFromContent":
            doSomething(); // message.data is not needed
            break;
        default:
            break;
    }
});

// See also https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/Tabs/sendMessage
function sendMessage(action, data){
    function logTabs(tabs) {
        for (tab of tabs) {
            browser.tabs.sendMessage(tab.id, {"action": action, "data": data}).catch(function(){
                onError("failed to execute " + action + "with data " + data);
            });
        }
    }

    browser.tabs.query({currentWindow: true, active: true}).then(logTabs, onError);
}

function onError(error){
    console.error(error);
}

现在你可以使用:

sendMessage("actionFromContent") from within the content script to send a message to the background script
sendMessage("testAction", "someData") from within the background script to the active content script (the active tab)