Depuis Firefox 2 et Internet Explorer 7, les deux navigateurs ennemis (ou presque) partagent le même format de description des plugins de recherche. Ce format et son utilisation sont d'ailleurs très bien expliqués sur la page associée du MDC.

Ce qui l'est un peu moins, c'est la manière de supporter à la fois Firefox 1[1], Firefox 2, et Internet Explorer 7.

Tout d'abord, notons que la balise link que l'on peut ajouter dans le head est comprise à la fois par IE7 et Firefox 2, mais pas par Firefox 1.5. J'ai donc décidé d'ajouter un lien, pour appeler la méthode JavaScript responsable de cet ajout. Or, cette méthode n'est pas la même non plus pour Firefox 1.5. Tout est d'ailleurs indiqué sur le MDC.

La raison, c'est que Firefox 1.5 n'utilise pas le même format. Il utilise le format ''src'', d'après ce que j'ai compris, le même que Sherlock.

Mon premier essai fut d'utiliser le code suivant :

if (window.external.AddSearchProvider) {
    window.external.AddSearchProvider(engineUrlOS);
} else if (window.sidebar && window.sidebar.addSearchEngine) {
    window.sidebar.addSearchEngine(engineUrlSRC, engineUrlIco, engineTitle, null);
} else {
    alert("Votre navigateur ne supporte pas l'ajout de plugins de recherche.");
}

Et là, premier problème; en effet, Firefox 1.5 ne connait pas du tout window.external. Et donc, il lance une erreur JavaScript au premier if. D'où le deuxième essai :

if (window.external && window.external.AddSearchProvider) {
    window.external.AddSearchProvider(engineUrlOS);
} else if (window.sidebar && window.sidebar.addSearchEngine) {
    window.sidebar.addSearchEngine(engineUrlSRC, engineUrlIco, engineTitle, null);
} else {
    alert("Votre navigateur ne supporte pas l'ajout de plugins de recherche.");
}

C'est mieux: ça marche dans Firefox 1.5 et dans Firefox 2. Dans IE6, j'ai bien la boîte qui me dit que ça ne marche pas. Dans IE7, cependant, cette erreur sybilline: Object doesn't support this method or property[2]. Interrogation. Tests multiples. Google.

Et finalement, il semble qu'on ne puisse pas correctement tester les méthodes de window.external dans IE (trouvé à propos de window.external.AddFavorite qui ajoute un marque-page). C'est étrange que la détection ait correctement fonctionné dans IE6, mais passons. Voici le code final, qui marche (chez moi (tm)) :

if (window.external) {
    try {
        window.external.AddSearchProvider(engineUrlOS);
    } catch (e) {
        alert("Votre navigateur ne supporte pas l'ajout de plugins de recherche.");
    }
} else if (window.sidebar && window.sidebar.addSearchEngine) {
    window.sidebar.addSearchEngine(engineUrlSRC, engineUrlIco, "AIS Newsletter", null);
} else {
    alert("Votre navigateur ne supporte pas l'ajout de plugins de recherche.");
}

Idée: on utilise les capacités de JavaScript à traiter les exceptions.

C'est beau, non ?

Notes

[1] J'avoue que je ne sais plus si les plugins de recherche existent depuis Firefox 1.5 ou avant.

[2] Ou un truc qui ressemble.