在Firefox Addon中有一个“大脑”?

时间:2010-01-08 20:12:30

标签: firefox firefox-addon xul add-on

我有一个插件,每5分钟左右检查一个新帖子的RSS源,如果有,它会显示一个警告()。问题是,我担心如果用户打开多个窗口,那么当有新帖子时,会弹出数百万个警告说同样的事情。无论如何,一次只有一个“大脑”在运行吗?

提前致谢!

2 个答案:

答案 0 :(得分:4)

查找名为“Javascript共享代码模块”或JSM的内容。

主要文档在这里:

https://developer.mozilla.org/En/Using_JavaScript_code_modules

您的插件中需要共享内存的每个.js文件都会打开,并显示以下行:

Components.utils.import("resource://xxxxxxxx/modules/[yourFilenameHere].jsm", com.myFirefoxAddon.shared);

上面一行打开[yourFilenameHere] .jsm并将其导出(见下文)的函数和变量加载到com.myFirefoxAddon.shared对象中。加载的该对象的每个实例都将指向内存中的同一实例。

请注意,如果你希望你有一个希望让它过去适度,你需要在com.myFirefoxAddon。*类型对象中编写所有代码,因为AMO的goons正在阻止批准不添加的插件Respect the Global Namespace

JSM最大的警告是你需要手动导出你希望可用于其余代码的每个函数......因为JS不支持公共/私有类型的东西,这让我觉得有点像穷人的“公共”支持......在任何情况下,您都需要在JSM文件的某处创建一个EXPORTED_SYMBOLS数组,并命名出要导出的每个函数或对象,如下所示:

var EXPORTED_SYMBOLS = [
    /* CONSTANTS */
    "SERVER_DEBUG",
    "SERVER_RELEASE",

    "LIST_COUNTRIES",
    "LIST_TERRITORIES_NOEX",

    /* GLOBAL VARIABLES */
    /* note: primitive type variables need to be stored in the globals object */
    "urlTable",
    "globals",

    /* INTERFACES */
    "iStrSet",

    /* FUNCTIONS */
    "globalStartup",

    /* OBJECTS */
    "thinger",
    "myObject"

]

答案 1 :(得分:2)

[编辑] 模块不是解决此问题的正确方法,因为代码仍会导入到每个窗口中,并且您设置的任何侦听器/定时器都将在每个窗口中运行。 您应该小心使用模块 - 所有定时器/回调必须在模块代码中设置(不仅仅使用模块中定义的观察者对象),您不应该使用任何对窗口的引用。模块。

正确的方法是 我希望编写一个XPCOM组件(在JS中)。它有点复杂,是的,我没有方便的链接解释如何做到这一点。一件事:使用XPCOMUtils实现它更容易,旧的文档将为您抛出大量的样板代码。