Pregunta

Trasfondo:
Estoy intentando generar dinámicamente un Abrir búsqueda Complemento de búsqueda para Firefox basado en los valores ingresados ​​por el usuario como parte de un complemento más grande.No incluyo los formularios y la documentación que lo rodea, porque lo he reducido a un simple caso de prueba fallido al intentar importar cualquier XML.

Código:
JS simplificado

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 real

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

(Desde el Proyecto Mycroft)

Por lo que he visto, el error debería indicar un archivo XML no válido, pero por mi vida no puedo encontrar nada malo en esto.Lo cargué en Firefox y arreglé todos los errores tipográficos y sintácticos que encontré (solía tener & en lugar de &amp;, y el navegador lo muestra y lo analiza bien, pero aún así no se carga como un motor de búsqueda abierto.

¿FF no es compatible con localhost, tal vez?Estoy quedando en blanco aquí.

¡Gracias de antemano por cualquier información!

¿Fue útil?

Solución 3

Problemas:
Como lo indica Noitidart, dataType debería ser 1 aunque sea de búsqueda abierta.

En segundo lugar, no puede pasar el iconURL en addEngine.No estoy seguro si eso es cierto para todos los íconos, pero definitivamente pasándolo como png o como data URI ambos fracasaron.

Tercero, callback debe ser un objeto de la forma:

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

Cuarto, el tipo de archivo debe ser .osdx, no .xml

URL a url a Url No importa, nunca cambió y la extensión funciona.

Por último, al realizar la prueba, asegúrese de tener browser.search.log ajustado a true en about:config.

Puedes ver más información en el informe de error. aquí.

Espero que esto ayude al próximo chico atrapado. Components.classes["@mozilla.org/browser/search-service;1"].getService(Components.interfaces.nsIBrowserSearchService).addEngine()-tierra.

Actualizar:Configuración confirm a true da como resultado:

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

Así que no hagas eso.

Es bueno cómo se puede acceder tan fácilmente a esa API.:|

Otros consejos

Es una cuestión de seguridad.Esto me golpeó antes.Lo que estaba haciendo era cargar un archivo xml para anular y xbl desde una ruta local (o ruta de recurso o algo que no recuerdo) y obtenía un error xml como si fuera un error de sintaxis, pero no había nada.No pude entenderlo.

Finalmente creé un chrome.manifest archivo y dio la ruta al archivo xml como chrome://myaddon/content/myxml.xml Y funcionó.Súper frustrante, el error debería explicar más, me hizo perder tanto tiempo que estaba tratando de arreglar la sintaxis xml...

Así que crea ese manifiesto y luego cambia tu código aquí:

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

Observe cómo eliminé la ruta local con la ruta de Chrome.

Entonces, aparentemente los archivos xml deben cargarse desde las rutas de Chrome para que funcionen correctamente.

Ahora bien, si desea alojar esto en la red e instalarlo así, debe utilizar la forma de instalación sin privilegios (lo que significa ejecutar este javascript desde una página html).Cual es este: https://developer.mozilla.org/en-US/docs/Adding_search_engines_from_web_pages

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

pero si desea instalarlo como lo está haciendo en la publicación del tema, que es instalación de xpcom, debe usar la ruta de Chrome.

Ok, miré profundamente en esto y descubrí que era algo muy leve.

  1. dataType en EngineProperties debiera ser 1 cual es Ci.nsISearchEngine.DATA_XML estabas usando 3 cual es para Ci.nsISearchEngine.TYPE_OPENSEARCH.Sí, sé que el tuyo es un archivo xml de opensearch, pero es xml, así que usa 1.
  2. En el cambio XML <URL a <Url observe las minúsculas r y l.extraño.

De todos modos puedes instalar este complemento aquí, instala tu motor de búsqueda:https://github.com/yajd/PortableTester/tree/a9ed2432cf4fab4362b71d2c805d97caac2cd237

Usar https://addons.mozilla.org/en-US/firefox/addon/github-extension-installer/ Complemento para instalar directamente desde el repositorio.

POR ÚLTIMO, no sé por qué, pero la devolución de llamada nunca llama después de addEngine, es tan extraño que no tengo idea de cómo hacer que eso funcione :(

Además, no estoy seguro de si el error de seguridad si no es la ruta de Chrome es cierto, no estoy seguro, pero podría serlo en otros casos, pero tal vez no aquí.Debería poder hacer localhost o rutas de archivos locales como file:///C:/blah.xml

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top