Question

Passé:
J'essaie de générer dynamiquement un Recherche ouverte plugin de recherche pour Firefox basé sur les valeurs saisies par l'utilisateur dans le cadre d'un module complémentaire plus vaste.Je n'inclus pas les formulaires et les éléments qui l'entourent, car je l'ai réduit à un simple cas de test échoué essayant d'importer du XML.

Code:
JS simplifié

var browserSearchService = Components
        .classes["@mozilla.org/browser/search-service;1"]
        .getService(Components.interfaces.nsIBrowserSearchService);

var EngineProperties = {
                xml :   'http://localhost/search.xml',
                dataType: 3,
                iconURL : 'http://localhost/logo.png',
                confirm : false,
                callback : function addEngineCallback(){
                    console.log('Jason is the greatest');           
                }
            }

browserSearchService.addEngine( EngineProperties.xml,
                                            EngineProperties.dataType,
                                            EngineProperties.iconURL,
                                            EngineProperties.confirm,
                                            EngineProperties.callback);

XML réel

<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"
                       xmlns:moz="http://www.mozilla.org/2006/browser/search/">
  <ShortName>Jason</ShortName>
  <Description>Powered By Jason</Description>
  <InputEncoding>UTF-8</InputEncoding>
  <Image width="16" height="16" type="image/x-icon">http://localhost/logo.png</Image>

  <URL method="get" type="text/html" template="http://search.mywebsearch.com/mywebsearch/GGmain.jhtml?ptb=100000487&amp;ind=1406730191685&amp;n=14787A74345&amp;st=bar&amp;searchfor={searchTerms}" />
  <URL method="get" type="application/x-moz-keywordsearch" 
    template="http://search.mywebsearch.com/mywebsearch/GGmain.jhtml?&amp;ptb=100000487&amp;ind=1406730191685&amp;n=14787A74345&amp;st=bar&amp;searchfor={searchTerms}" />
  <Url method="get" type="application/x-suggestions+json" 
    template="http://ssmsp.ask.com/query?q={searchTerms}&amp;li=ff&amp;sstype=prefix"/>

  <moz:SearchForm>http://search.mywebsearch.com/mywebsearch/GGmain.jhtml</moz:SearchForm>
</OpenSearchDescription>

(Du Projet Mycroft)

D'après ce que j'ai vu, l'erreur devrait indiquer un fichier XML invalide, mais pour ma vie, je ne trouve rien de mal à cela.Je l'ai chargé dans Firefox, j'ai corrigé toutes les fautes de frappe et erreurs syntaxiques que j'ai trouvées (avant & au lieu de &amp;, et le navigateur l'affiche et l'analyse correctement, mais il ne se charge pas en tant que moteur de recherche ouvert.

FF ne prend-il pas en charge localhost, peut-être ?Je fais un vide ici.

Merci d'avance pour tout aperçu!

Était-ce utile?

La solution 3

Problèmes:
Comme l'indique Noitidart, dataType devrait être 1 même si c'est opensearch.

Deuxièmement, je ne peux pas passer le iconURL dans addEngine.Je ne sais pas si cela est vrai pour toutes les icônes, mais en lui passant certainement un png ou un data URI les deux ont échoué.

Troisième, callback doit être un objet de la forme :

callback={
    onError   : function(err){/**/},
    onSuccess : function(err){/**/}
}

Quatrièmement, le type de fichier doit être .osdx, pas .xml

URL à url à Url n'a pas d'importance, jamais changé et l'extension fonctionne.

Enfin, lors des tests, assurez-vous d'avoir browser.search.log mis à true dans about:config.

Vous pouvez voir plus d'informations sur le rapport de bug ici.

J'espère que cela aidera le prochain gars coincé Components.classes["@mozilla.org/browser/search-service;1"].getService(Components.interfaces.nsIBrowserSearchService).addEngine()-atterrir.

Mise à jour:Paramètre confirm à true résulte en:

[Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE)
[nsIURI.host]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  
location: "JS frame :: resource://gre/components/nsSearchService.js :: 
SRCH_SVC_confirmAddEngine :: line 1370"  
data: no]

Alors, ne fais pas ça.

C'est bien de voir comment cette API est si facilement accessible.:|

Autres conseils

C'est une question de sécurité.J'ai déjà été touché par cela.Ce que je faisais, c'était charger un fichier XML pour le remplacer et xbl à partir d'un chemin local (ou d'un chemin de ressource ou quelque chose dont je ne me souviens pas) et j'obtenais une erreur XML comme s'il s'agissait d'une erreur de syntaxe mais il n'y avait rien.Je n'arrivais pas à comprendre.

Finalement j'ai créé un chrome.manifest fichier et a donné le chemin d'accès au fichier XML comme chrome://myaddon/content/myxml.xml et ça a marché.Super frustrant, l'erreur devrait s'expliquer davantage, cela m'a tellement fait perdre du temps que j'essayais de corriger la syntaxe XML...

Créez donc ce manifeste puis modifiez votre code ici :

var EngineProperties = {
                xml :   'chrome://myaddon/content/search.xml',
                dataType: 3,
                iconURL : 'chrome://myaddon/content/logo.png',
                confirm : false,
                callback : function addEngineCallback(){
                    console.log('Jason is the greatest');           
                }
            }

remarquez comment j'ai supprimé le chemin local avec le chemin Chrome.

donc apparemment, les fichiers XML doivent être chargés à partir des chemins Chrome pour fonctionner correctement.

Maintenant, si vous souhaitez héberger cette chose sur le net et l'installer comme ça, alors vous devez utiliser la méthode d'installation non privilégiée (ce qui signifie exécuter ce javascript à partir d'une page HTML).C'est quoi ça : https://developer.mozilla.org/en-US/docs/Adding_search_engines_from_web_pages

window.external.AddSearchProvider('http://localhost/search.xml');

mais si vous souhaitez l'installer comme vous le faites dans votre article de sujet, qui est l'installation de XPcom, vous devez utiliser le chemin Chrome

Ok, j'ai étudié la question en profondeur et j'ai découvert que c'était une chose très légère.

  1. dataType dans EngineProperties devrait être 1 lequel est Ci.nsISearchEngine.DATA_XML tu utilisais 3 qui est pour Ci.nsISearchEngine.TYPE_OPENSEARCH.Ouais, je sais que le vôtre est un fichier XML opensearch mais c'est du XML donc utilisez 1.
  2. Dans le changement XML <URL à <Url remarquez les minuscules r et l.bizarre.

de toute façon, vous pouvez installer cet addon ici, il installe votre moteur de recherche :https://github.com/yajd/PortableTester/tree/a9ed2432cf4fab4362b71d2c805d97caac2cd237

Utiliser https://addons.mozilla.org/en-US/firefox/addon/github-extension-installer/ module complémentaire à installer directement à partir du dépôt.

ENFIN pour je ne sais pas pour quelle raison, mais le rappel n'appelle jamais après addEngine, c'est tellement bizarre que je n'ai aucune idée de comment faire fonctionner ça :(

De plus, je ne sais pas si l'erreur de sécurité, sinon le chemin Chrome, est vraie, je ne suis pas sûr, mais cela pourrait l'être dans d'autres cas, mais peut-être pas ici.Vous devriez pouvoir créer un hôte local ou des chemins de fichiers locaux comme file:///C:/blah.xml

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top