WebExtensions:拦截特殊协议链接

3
我希望编写一个简单的Web扩展,用于处理特定类型的链接。我不想要一个系统范围的协议处理程序,它应该只在我的浏览器中打开的网站上工作。
例如,当任何东西引起一个磁力链接被打开时,我希望拦截它,以便Web扩展处理它。
如果可能的话,在启用Web扩展时,我希望防止系统应用程序处理它。

起初我认为可以使用registerProtocolHandler:

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

但我认为这样做并不能达到我想要的效果...
我的下一个想法是在所有a元素上使用点击事件:

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

但这只适用于被点击的链接。通过JavaScript打开的链接不会受到影响,所以这也行不通。
2个回答

2
我在扩展程序中使用了一个技巧来实现这个目的: 在清单文件中注册您的协议处理程序:
  "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/


1

registerProtocolHandler已经可用,并且对mailto:,magnet:,irc:等工作得很好。但正如问题中所提到的那样,这不是我要寻找的。registerProtocolHandler只能将某个协议注册到网站。 - Forivin
2
但我相信该错误的意图是让扩展在moz-extension:// URL注册处理程序,这将允许处理程序包含在扩展中。我以为这就是你要找的东西? - Andrew Swan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接