1

我无法将复杂的 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();
            }
        }
    } 
);    

这个问题,我知道 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");
    }
});    

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

4

1 回答 1

9

让我们看看你的清单。在整个答案中,我将参考相关文档。如果您对开始使用 Firefox 插件开发一无所知,请阅读入门教程。

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

  • chrome.extension.sendMessage// 查看内容脚本以了解如何使用模块并传递消息chrome.tabs.sendMessagechrome.extension.onMessage.addListener
    sdk/page-mod

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

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

  • chrome.privacy.services.autofillEnabled.get
    sdk/preferences/service模块。可以在about:config 条目文章中找到首选项标识符列表。对于您的具体示例:

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

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

  • localStorage
    sdk/simple-storage

于 2013-07-08T08:37:49.463 回答