WebExtensions:拦截特殊协议链接

时间:2017-01-12 12:04:20

标签: javascript firefox-addon protocols browser-extension firefox-webextensions

我想编写一个处理某些类型链接的简单WebExtension。我不想要一个系统范围的协议处理程序,它应该只适用于在我的浏览器中打开的网站 因此,例如当任何东西导致磁铁://链接被打开时,我想截取它,以便WebExtension处理它。
如果可能的话,我希望在启用WebExtension时阻止系统应用程序处理它。

起初我以为我可以使用registerProtocolHandler:

navigator.registerProtocolHandler("magnet", "*%s", "Magnet handler"); 

但我不认为这会做我想要的... ... 我的下一个想法是在所有元素上使用click事件:

document.getElementsByTagName('a').addEventListener('click', event => {
    let link = event.target.href
    if (link.startsWith('magnet://')) {
        // handle magnet link
        return false
    }
}

但这只适用于点击的链接。使用JavaScript打开的链接不会受到影响,因此无法正常工作..

2 个答案:

答案 0 :(得分:1)

这里正在开展工作以支持自定义协议处理程序: https://bugzilla.mozilla.org/show_bug.cgi?id=1271553

答案 1 :(得分:1)

我在扩展中使用了一个技巧来做到这一点: 在清单中注册协议处理程序:

  "protocol_handlers": [
    {
      "protocol": "magnet",
      "name": "Torrent Control Reloaded Magnet Handler",
      "uriTemplate": "https://torrent-control-reloaded.invalid/%s"
    }
  ]

然后按照您的意愿处理请求:

   browser.webRequest.onBeforeRequest.addListener(
        (details) => {
            var parser = document.createElement('a');
            parser.href = details.url;
            var magnetUri = decodeURIComponent(parser.pathname).substr(1);
            // do what you want with magnetUri
            return {cancel: true}
        },
        {urls: ['https://torrent-control-reloaded.invalid/*']},
        ['blocking']
    );

这不好,但它有效。 您可以在此处找到扩展程序:https://github.com/Mika-/torrent-control/