在firefox addon sdk中的后台线程中运行pageMod?

时间:2012-04-24 10:38:11

标签: highlighting background-process firefox-addon-sdk

我必须创建一个firefox插件,根据单词列表(可能是6500个单词)搜索加载的页面,并突出显示匹配并在悬停时显示同义词。

所以我使用遍历dom的HightlightRegex.js并根据使用正则表达式 \ bMyWord \ b 的正则​​表达式进行搜索。

主要问题是在一个有很多搜索词出现的页面上测试插件时,Firefox会挂起一段时间(5-6秒),然后会显示高亮显示。这发生在一个单词上,所以我可以想象如果我搜索6500个单词会发生什么。

那么有什么方法可以在后台线程中运行pageMod或异步并在匹配时突出显示单词而不冻结UI?

您可以在https://builder.addons.mozilla.org/addon/1042263/latest/

查看该加载项

目前,附加组件并不依赖于单独的选项卡,而是在浏览器上作为一个整体运行,但我怀疑这会导致Firefox挂起。

我需要尽可能高效地做到这一点,所以非常欢迎这个建议。

3 个答案:

答案 0 :(得分:1)

DOM通常不是线程安全的,你不能从主线程以外的任何东西访问它。唯一的解决方案是将工作分解为更小的块,并使用setTimeout(..., 0)异步运行下一个块,而不会阻塞所有块。

答案 1 :(得分:1)

您可以尝试的一件事是使用page-worker模块加载页面并对其进行处理:

https://addons.mozilla.org/en-US/developers/docs/sdk/1.6/packages/addon-kit/page-worker.html

并且,正如Wladimir建议的那样,只使用异步代码来搜索文档文本以避免锁定firefox。

答案 2 :(得分:1)

正如canuckistani暗示的那样,更好的解决方案只需要两个同步的DOM操作:读写。翻录整个页面(或者,更好的是,只有它的<body>)并将其发送给执行突出显示的异步工作者或线程。完成后,工作人员会发出一个事件并传递突出显示的内容,插件现在可以将其插入到页面中。

这样,完成的唯一同步操作是快速,廉价的操作,而其余操作是异步完成的,远离主线程。但是,canuckistani建议在page-worker中加载页面:没有必要这样做,因为页面已经加载到选项卡中。只需加载虚假页面并插入实际内容。