Pergunta

Bastidores:
Estou tentando gerar dinamicamente uma OpenSearch search plugin para Firefox baseado em valores inseridos como parte de um maior add-on.Eu não estou incluindo os formulários e sujeira que o rodeia, porque eu já reduzi-lo a um simples caso de teste reprovado tentando importar XML.

Código:
Simplificado JS

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>

(A partir do Mycroft Projeto)

Pelo que tenho visto o erro deve indicar um erro de arquivo XML, mas para a vida de mim eu não consigo encontrar nada de errado com isso.Eu tenho carregado no Firefox corrigido todos os erros de digitação e erros sintáticos eu encontrei (usado para ter & em vez de &amp;, e o navegador exibe e analisa-o bem, mas ainda não é possível carregar como um abrir de pesquisa do motor de busca.

Faz FF não suporte localhost, talvez?Eu estou desenhando um espaço em branco aqui.

Obrigado antecipadamente por qualquer insight!

Foi útil?

Solução 3

Problemas:
Como indicado pelo Noitidart, dataType deve ser de 1, mesmo que opensearch.

Segundo, não é possível passar o iconURL no addEngine.Não tenho certeza se isso é verdadeiro para todos os ícones, mas, definitivamente, passando png ou um data URI ambos falharam.

Terceiro, callback precisa ser um objecto de formulário:

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

O quarto tipo de arquivo deve ser .osdx, não .xml

URL para url para Url não importa, nunca mudou e extensão do trabalho.

Por fim, ao testar, garantir que você tenha browser.search.log conjunto para true no about:config.

Você pode ver mais informações no relatório de bug aqui.

Espero que isso ajude um cara que tá preso na Components.classes["@mozilla.org/browser/search-service;1"].getService(Components.interfaces.nsIBrowserSearchService).addEngine()-terra.

Atualização:Definição confirm para true resultados em:

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

Então, não faça isso.

É bom como de que a API é tão facilmente acessível.:|

Outras dicas

É uma coisa segurança.Fui atingido por isto antes.O que eu estava fazendo era carregar um arquivo xml para substituir e xbl a partir de um caminho local (ou caminho de recurso ou algo que eu não lembro) e eu gostaria de receber o erro de xml como foi erro de sintaxe, mas não havia nada.Eu não conseguia descobrir.

Finalmente eu criei um chrome.manifest arquivo e deu o caminho para o arquivo xml como chrome://myaddon/content/myxml.xml e funcionou.Super frustrante, o erro deve explicar mais, é desperdiçado meu tempo tanto que eu estava a tentar corrigir a sintaxe de xml...

Criar, assim, que se manifestam de alterar o seu código aqui:

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 como eu removi o caminho local com o chrome caminho.

assim ya, aparentemente, xml ficheiros devem ser carregados a partir do google chrome caminhos para funcionar direito.

Agora, se você gostaria de hospedar coisa na net e instalá-lo assim, então você tem que usar o não-privelaged maneira de instalar (o que significa que excecute este javascript em uma página html).O que é: https://developer.mozilla.org/en-US/docs/Adding_search_engines_from_web_pages

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

mas se você deseja instalá-lo como você está fazendo em seu tópico, post, que é xpcom de instalar, você tem que usar o google chrome caminho

Ok, eu olhei profundamente para isso e descobri que era uma pequena coisa.

  1. dataType no EngineProperties deve ser 1 o que é Ci.nsISearchEngine.DATA_XML você estava usando 3 o que é para Ci.nsISearchEngine.TYPE_OPENSEARCH.Sim, eu sei que o seu é um opensearch arquivo xml, mas seu xml de modo de uso 1.
  2. No XML, alterar <URL para <Url observe o caso inferior a r e a l.estranho.

de qualquer maneira você pode instalar esse addon aqui, instala o seu mecanismo de pesquisa:https://github.com/yajd/PortableTester/tree/a9ed2432cf4fab4362b71d2c805d97caac2cd237

Utilização https://addons.mozilla.org/en-US/firefox/addon/github-extension-installer/ addon para instalar direto do repositório.

Por último sei por que razão, mas de retorno de chamada nunca chamadas depois de addEngine, é tão estranho eu não tenho nenhuma idéia de como começar a funcionar :(

Também não tenho certeza se o erro de segurança se não chrome caminho é verdade, não tenho certeza, mas pode ser em outros casos, mas talvez não aqui.Você deve ser capaz de fazer localhost ou local ou de caminhos de arquivo como file:///C:/blah.xml

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top