Domanda

Storia:
Sto cercando di generare dinamicamente un file OpenSearch plug-in di ricerca per Firefox in base ai valori immessi dall'utente come parte di un componente aggiuntivo più ampio.Non includo i moduli e le informazioni che lo circondano, perché ho ristretto il campo a un semplice caso di test fallito nel tentativo di importare qualsiasi XML.

Codice:
JS semplificato

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 effettivo

<?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>

(Dal Progetto Mycroft)

Da quello che ho visto l'errore dovrebbe indicare un file XML non valido, ma per quanto mi riguarda non riesco a trovare nulla di sbagliato in questo.L'ho caricato in Firefox e ho corretto tutti gli errori di battitura e sintattici che ho trovato (in passato avevo & invece di &amp;, e il browser lo visualizza e lo analizza correttamente, ma non verrà caricato come motore di ricerca di ricerca aperto.

Forse FF non supporta localhost?Sto disegnando uno spazio vuoto qui.

Grazie in anticipo per ogni idea!

È stato utile?

Soluzione 3

I problemi:
Come indicato da Noitidart, dataType dovrebbe essere 1 anche se è opensearch.

In secondo luogo, non è possibile superare il test iconURL In addEngine.Non sono sicuro che ciò sia vero per tutte le icone, ma sicuramente gli passo un png o un file data URI entrambi fallirono.

Terzo, callback deve essere un oggetto del modulo:

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

Quarto dovrebbe essere il tipo di file .osdx, non .xml

URL A url A Url non importa, mai cambiato e l'estensione funziona.

Infine, durante il test, assicurati di averlo browser.search.log impostato true In about:config.

Puoi vedere maggiori informazioni nella segnalazione del bug Qui.

Spero che questo aiuti il ​​prossimo ragazzo bloccato Components.classes["@mozilla.org/browser/search-service;1"].getService(Components.interfaces.nsIBrowserSearchService).addEngine()-terra.

Aggiornamento:Collocamento confirm A true risulta in:

[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]

Quindi, non farlo.

È bello come l'API sia così facilmente accessibile.:|

Altri suggerimenti

È una cosa di sicurezza. Sono stato colpito da questo prima. Quello che stavo facendo stavo facendo caricare un file XML per il sovrascrittura e xbl da un percorso locale (o percorso di risorse o qualcosa che non riesco a ricordare) e avrei un errore XML come se fosse l'errore di sintassi, ma non c'era nulla. Non potrei capirlo.

Infine ho creato un file chrome.manifest e ho dato il percorso al file XML come chrome://myaddon/content/myxml.xml e ha funzionato. Super frustrante, l'errore dovrebbe spiegare di più, ha sprecato il mio tempo così tanto che stavo cercando di sistemare la sintassi XML ...

Quindi crea quel manifest che modificare il tuo codice qui:

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');           
                }
            }
.

AVVISO Come ho rimosso il percorso locale con il percorso cromato.

Allora YA apparentemente i file XML devono essere caricati dai percorsi cromati per lavorare a destra.

Ora se desideri ospitare questa cosa in rete e installarlo così, allora devi usare il modo di installazione non privilegiati (il che significa che è esatto questo JavaScript da una pagina HTML). Che è questo: https://developer.mozilla.org/en-us/docs/adding_search_engines_from_web_pages

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

Ma se vuoi installarlo come stai facendo nel tuo argomento, che è l'installazione di XPCOM, devi usare il percorso Chrome

Ok, ho guardato profondamente in questo e ho scoperto che era una cosa molto leggera.

    .
  1. dataType in EngineProperties dovrebbe essere 1 che è Ci.nsISearchEngine.DATA_XML che stava utilizzando 3 che è per Ci.nsISearchEngine.TYPE_OPENSEARCH. Sì, so il tuo è un file XML di opensearch ma il suo XML usa quindi utilizzare 1.
  2. Nella modifica XML <URL in <Url Nota la minuscola R e l. strano.
  3. Comunque è possibile installare questo addon qui installa il tuo motore di ricerca: https://github.com/yajd/petibletester/tree/a9ed2432cf4fab4362b71d2c805d97cac2cd237

    Usa https://addons.mozilla.org/ IT-US / Firefox / Addon / GitHub-Extension-Installer / addon da installare direttamente dal repo.

    Infine per non so quale motivo, ma la callback non chiama mai dopo Addengine, è così strano che non ho idea di come far funzionare: (

    Inoltre non sono sicuro se l'errore di sicurezza se non è vero, non è sicuro, ma potrebbe essere in altri casi, ma forse non qui. Dovresti essere in grado di fare percorsi localhost o o percorsi di file locali come file:///C:/blah.xml

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top