如何将Chrome扩展程序(使用特定于Chrome的API)转换为Firefox附加组件?

时间:2013-07-08 08:00:25

标签: api google-chrome-extension firefox-addon firefox-addon-sdk content-script

我无法将复杂的Chrome扩展程序转换为Firefox附加组件。在Chrome扩展程序中,作者使用了一些Chrome API,例如

  • chrome.extension.sendMessage
  • chrome.browserAction.setIcon
  • webkitNotifications.createNotification
  • chrome.tabs.sendMessage
  • chrome.extension.onMessage.addListener
  • chrome.browserAction.onClicked.addListener
  • chrome.privacy.services.autofillEnabled.get
  • chrome.runtime.onInstalled.addListener
  • chrome.tabs.query
  • localStorage

等等。

我不知道如何在Firefox附加代码中实现这些方法。可以使用回调函数调用其中一些API。例如:

chrome.extension.sendMessage ( {
        type: "get.identitieswithurl",
        originUrl: lgmIdentitySave.originUrl,
        actionUrl: lgmIdentitySave.actionUrl
    }, 
    function (resultIdentities) {
        if(resultIdentities != null && resultIdentities.length > 0) {
            lgmIdentitiesPage = resultIdentities;
            fillFormsWithCredential(resultIdentities[0]);
            if(resultIdentities.length > 1 && lgmSuggestionSelectIdDismissed == false) {
                showSelectIdentitySuggestionBar();
            }
        }
    } 
);    

this question开始,我知道Firefox代码可以像

一样编写
// main add-on script
pageMod.PageMod({
    include: "*.org",
    contentScriptFile: self.data.url("my-script.js"),
    // Send the content script a message inside onAttach
    onAttach: function (worker) {
        worker.port.emit("replacePage", "Page matches ruleset");
    }
});    

但我仍然不知道如何添加回调函数。

1 个答案:

答案 0 :(得分:8)

我们来看看你的清单。在整个答案中,我将参考相关的documentation。如果您对开始使用Firefox附加组件开发完全无能为力,请阅读Getting started教程。

在开始之前,还请阅读modulesSDK Idioms(最后一个非常重要,因为它解释了Firefox附加SDK世界中的重要概念)。

  • chrome.extension.sendMessage / chrome.tabs.sendMessage / chrome.extension.onMessage.addListener
    请参阅Content scripts了解如何使用sdk/page-mod模块并传递消息。

  • chrome.browserAction.setIconchrome.extension.onMessage.addListener
    我编写了一个SDK模块,它是Chrome的chrome.browserAction API for Firefox的完整实现。安装说明和文档位于https://github.com/Rob--W/browser-action-jplib

  • webkitNotifications.createNotification
    请参阅sdk/notifications模块。

  • chrome.privacy.services.autofillEnabled.get
    请参阅sdk/preferences/service模块。可以在about:config entries文章中找到偏好标识符列表。对于您的具体示例:

    var prefName = 'browser.formfill.enable';
    var prefService = require("sdk/preferences/service");
    var isAutoFillEnabled = prefService.get(prefName); // true or false
    
  • chrome.runtime.onInstalled.addListener
    您的扩展程序是否已安装,可以通过阅读loadReason property of the self module来确定,例如

    if (require('sdk/self').loadReason == 'install') {
        // Do something on the very first install
    }
    
  • chrome.tabs.query
    sdk/tabs模块是一个迭代器。您可以遍历该对象并自行过滤掉结果。

  • localStorage
    请参阅sdk/simple-storage