3

Je voudrais écrire une extension Web simple qui gère certains types de liens. Je ne veux pas de gestionnaire de protocole à l'échelle du système, il devrait simplement fonctionner pour les sites Web ouverts dans mon navigateur.
Ainsi par exemple quand quelque chose provoque un lien magnet: // à ouvrir, j'aimerais intercepter cela pour que WebExtension le gère.
Et si possible, j'aimerais empêcher les applications système de le gérer tant que WebExtension est activé.WebExtensions: Intercepter des liens de protocole spéciaux

Au début, je pensais que je pouvais utiliser registerProtocolHandler:

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

Mais je ne pense pas que ce serait faire ce que je veux qu'il ...
Ma prochaine idée était d'utiliser un événement de clic sur tous les éléments: a-

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

Mais cela ne fonctionne que pour les liens qui ont été cliqué. Un lien qui est ouvert en utilisant JavaScript ne serait pas affecté, de sorte que ne fonctionnerait pas non plus ..

Répondre

1

Des travaux sont en cours ici pour soutenir les gestionnaires de protocole personnalisé: https://bugzilla.mozilla.org/show_bug.cgi?id=1271553

+0

registerProtocolHandler est déjà disponible et fonctionne très bien pour mailto :, magnet :, irc: etc. registerProtocolHandler peut uniquement enregistrer un certain protocole sur un site Web. – Forivin

+2

Mais je crois que l'intention dans ce bogue est de laisser les extensions enregistrer des gestionnaires à moz-extension: // urls qui permettraient au gestionnaire d'être contenu dans l'extension. Je pensais que c'était ce que tu cherchais? –

1

J'ai utilisé un truc dans une extension à faire juste que: Enregistrez votre gestionnaire de protocole dans le manifeste:

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

puis traiter la requête que vous le souhaitez:

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'] 
    ); 

Ce n'est pas bien, mais ça marche. Vous pouvez trouver l'extension ici: https://github.com/Mika-/torrent-control/