firefox addon sdk page-worker阻止主线程

时间:2014-11-24 02:39:13

标签: firefox firefox-addon firefox-addon-sdk

当一个页面在插件脚本中加载页面工作者时,我在后台抓取大约20个网站。不幸的是,浏览器冻结,在此期间无法预测。

我尝试使用timers.setTimeout(...,0-400ms)并尝试了wiki中的示例

function executeSoon(aFunc) {
    var tm = Cc["@mozilla.org/thread-manager;1"]
        .getService(Ci.nsIThreadManager);

    tm.mainThread.dispatch({
        run: function () {
            aFunc();
        }
    }, Ci.nsIThread.DISPATCH_NORMAL);
}

但这也会冻结用户界面。还有其他解决方案吗?

抓取代码:

...
timer.setTimeout(function () {
    let pageWorker = require("sdk/page-worker").Page({
       contentScriptFile: self.data.url("js/extractor.js"),
           contentURL:        url
    });

    pageWorker.port.on("loaded", function (content) {
        if (typeof callback === 'function') {
            callback(content);
        }
    });
}, 200)
...

即使在更简单的情况下,它返回body.textContent的extractor.js也是阻塞的。

2 个答案:

答案 0 :(得分:0)

页面工作者API只是创建一个不可见的页面,它不会在后台线程上这样做,因为它必须创建一个完整的窗口/文档环境,包括允许完整的dom /样式功能的布局,并且布局总是发生在主线。

如果您想在后台进行计算,则应使用Worker或ChromeWorker API,在这些API中您无法访问DOM和许多其他API。

在SDK中,您可以使用

const { ChromeWorker } = require("chrome");

答案 1 :(得分:0)

这是因为Firefox使用主要线程用于页面工作者,在Firefox中,每晚内容页面使用单独的进程,这意味着页面工作者也将使用单独的进程,因此请尝试Firefox Nightly,它应该在那里工作,这将在几个月后发布。