Javascript WebExtensions:拦截特殊协议链接

Javascript WebExtensions:拦截特殊协议链接,javascript,firefox-addon,protocols,browser-extension,firefox-addon-webextensions,Javascript,Firefox Addon,Protocols,Browser Extension,Firefox Addon Webextensions,我想写一个简单的WebExtension来处理某些类型的链接。我不想要一个系统范围的协议处理程序,它只适用于在我的浏览器中打开的网站。 例如,当任何东西导致magnet://链接被打开时,我想拦截它,以便WebExtension处理它。 如果可能的话,我希望在启用WebExtension时阻止系统应用程序处理它 起初我认为我可以使用registerProtocolHandler: navigator.registerProtocolHandler("magnet", "*%s", "Magnet

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

起初我认为我可以使用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打开的链接不会受到影响,因此也不会起作用。

此处正在进行工作,以支持自定义协议处理程序:

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

  "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']
    );
这不好,但很管用。
您可以在这里找到扩展名:

registerProtocolHandler已经可用,并且可以很好地用于mailto:、magnet:、irc:等。但这并不是我在寻找的问题中提到的。registerProtocolHandler只能向网站注册某个协议,但我相信这个bug的目的是让扩展在moz extension://URL上注册处理程序,这将允许处理程序包含在扩展中。我以为那就是你要找的?