Firefox插件预取链接标签

Firefox add-on prefetching with link tag

本文关键字:标签 链接 预取 插件 Firefox      更新时间:2023-09-26

我正在尝试创建一个简单的Firefox插件来预取一些网页。我想使用Firefox的link标签来进行预取,因为这似乎是最简单的方法。下面是我的代码:

main.js:

exports.main = function() {
    var commentFinder = pageMod.PageMod({
        include: "*",
        contentScriptFile: data.url("prefetch.js"),
        attachTo: ["top"],
        onAttach: function(worker) {
            worker.port.emit("init");
        }
    });
}

prefetch.js:

var start = '<link rel="prefetch" href="';
var end = '">'
var links = [];
var aTags = document.body.getElementsByTagName("a")
for(var i=0; i<aTags.length; i++){
    var href = aTags[i].getAttribute("href");
    if(links.indexOf(href) == -1) 
        links.push(href);
}
for(var i=0;i<links.length;i++){
    console.log(links[i]);
    var tag = start + String(links[i]) + end;
    document.head.innerHTML = tag + document.head.innerHTML;
}

当我在我请求的页面的HTML中包含链接标签时,它们会被预取,但是当我使用附加组件添加链接标签时,它们不会。我认为问题可能是当Firefox检查链接标签,但我不确定。有什么方法来测试/修复这个?

我查看了代码,似乎只有在解析器仍处于活动状态时才处理<link rel="prefetch">元素(参见ProcessLink (hg)的调用图)。因此,当在网站中使用内联脚本时,它可以工作,但不使用常规的page-mod

您可以尝试早先附加脚本,即将contentScriptWhen: "start"添加到页面mod选项中。但是您应该知道,此时DOM中只有document元素,没有其他元素,因此您需要让脚本等待其他节点……

另一种选择是,您可以使用nsIPrefetchService,而不是创建<link>元素,通过让您的内容脚本消息传递链接/引用列表到main.js,然后通过require("chrome")调用服务。

旁白:从带宽和性能的角度来看,无条件预取所有链接可能不是最好的主意。

另外:不是所有的链接都是可预取的(mailto:等)。