我想编写一个处理某些类型链接的简单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打开的链接不会受到影响,因此无法正常工作..
答案 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/