火狐浏览器提示无法从下载搜索插件

3
故事背景:我正在尝试基于用户输入的值,在较大的插件中动态生成一个Firefox的OpenSearch搜索插件。我没有包括其周围的表单和杂质,因为我已经把它缩小到了一个简单的测试用例,尝试导入任何XML。
代码:
简化后的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

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

(来自Mycroft Project)

从我所看到的情况来看,这个错误应该是指一个无效的XML文件,但是我却找不出任何问题。我已经在Firefox中加载了它,并修复了我发现的所有错别字和语法错误(以前是使用&而不是&amp;),浏览器可以显示和解析它,但是它仍然无法作为搜索引擎加载。

可能FF不支持本地主机吗?我对此一无所知。

提前感谢您的任何见解!

3个回答

3
这是一个安全问题。我之前就遇到过这个问题。我的操作是从本地路径(或资源路径或其他我记不清的路径)加载XML文件进行覆盖和XBL,但我会收到XML错误,就好像它是语法错误一样,但实际上没有错误。我无法找出原因。

最后,我创建了一个chrome.manifest文件,并提供了XML文件的路径,如chrome://myaddon/content/myxml.xml,然后它就可以工作了。非常令人沮丧,错误信息应该解释得更详细,浪费了我很多时间,我一直在试图修复XML语法……

因此,请创建那个清单文件,然后在这里更改您的代码:

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

请注意,我已用chrome路径替换了本地路径。
所以,显然必须从chrome路径加载xml文件才能正常工作。
现在,如果您想在网络上托管此内容并像那样安装它,则必须使用非特权方式进行安装(这意味着从html页面执行此javascript)。 就像这样:https://developer.mozilla.org/en-US/docs/Adding_search_engines_from_web_pages
window.external.AddSearchProvider('http://localhost/search.xml');

但是如果你想像在你的主题帖中所做的那样安装它,也就是 xpcom 安装,你必须使用 chrome 路径。


我可以在window.external.AddSearchProvider中使用数据URI吗? - Jason Nichols
即使改成Chrome协议,仍然没有任何反应。可能是XML问题,但我无法找出原因。 - Jason Nichols
1
我认为数据URI应该可以正常工作。你能把你实际的XML文件发给我吗?将其发布到Github上,我会让它正常工作。XML文件是否与“window.external.AddSearchProvider”一起使用? - Blagoh
这是我的实际XML。它用data:URI或chrome:// URI不起作用,但当我创建了一个指向虚假域名的主机条目并使用标题“Content-Type:application/opensearchdescription+xml”传递时,它就可以工作了。但仍然没有帮助,因为我无法在用户机器上的添加程序内部执行该操作。 - Jason Nichols
1
我认为安全方面在这种情况下不适用。但我不确定。 - Noitidart

2

问题:
正如Noitidart所指出的那样,dataType应该是1,即使它是opensearch。

第二,无法在addEngine中传递iconURL。不确定是否对所有图标都有效,但肯定会导致传递png或data URI失败。

第三,callback需要是以下格式的对象:

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

第四点,文件类型应为.osdx,而非.xml
URL转换为urlUrl都无所谓,从未更改过且扩展名有效。
最后,在测试时,请确保在about:config中将browser.search.log设置为true
您可以在此处的错误报告中查看更多信息。
希望这能帮助下一个卡在Components.classes["@mozilla.org/browser/search-service;1"].getService(Components.interfaces.nsIBrowserSearchService).addEngine()的人。
更新:将confirm设置为true会产生以下结果:
[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]

所以,不要这样做。

很棒的是那个API非常容易访问。 :|


谢谢,伙计,这篇文章太棒了。这个在 MDN 上有吗?特别是关于回调函数的部分。在哪些情况下应该使用 dataType 为 3 的 opensearch? - Noitidart
1
据我所知,没有。我从 Bugzilla 上打开的工单中得到了 Gavin 提供的回调信息,通过尝试不同的数据类型来获取了数据类型,然后你进行了确认。另外,很抱歉在回答中拼错了你的用户名...我的拼写不太好。 - Jason Nichols
1
嘿,你在和我聊天 :P 我的拼写比你还糟糕 :P 问问 @nmaier 吧 :P 而且我从不道歉 :P - Noitidart

2

我仔细研究了一下,发现问题很小。

  1. EngineProperties 中的 dataType 应该是 1,对应的是 Ci.nsISearchEngine.DATA_XML,你使用的是 3,对应的是 Ci.nsISearchEngine.TYPE_OPENSEARCH。我知道你的文件是 opensearch xml 文件,但它也是 xml,所以使用 1。
  2. 在 XML 中将 <URL 更改为 <Url,注意小写字母 r 和 l。怪异。

无论如何,您可以在此处安装此插件,它会安装您的搜索引擎: https://github.com/yajd/PortableTester/tree/a9ed2432cf4fab4362b71d2c805d97caac2cd237

使用 https://addons.mozilla.org/en-US/firefox/addon/github-extension-installer/ 插件直接从存储库中安装。

最后,由于某种原因,添加引擎后回调从未调用过,这太奇怪了,我不知道如何使其工作 :(

此外,我不确定安全错误是否为真,如果不是 chrome 路径,也许在其他情况下可能会出现,但在这里可能不会。您应该能够使用 localhost 或本地文件路径,例如 file:///C:/blah.xml


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接