Firefox说无法从中下载搜索插件

时间:2014-08-01 15:48:20

标签: javascript xml firefox firefox-addon opensearch

背景故事:
我尝试根据用户输入的值动态生成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;,浏览器显示并解析它很好,但它赢了&#39 ; t作为开放搜索搜索引擎加载。

FF不支持localhost吗?我在这里画一个空白。

提前感谢任何见解!

3 个答案:

答案 0 :(得分:3)

这是安全的事情。之前我被这个击中了。我正在做的是从本地路径(或资源路径或我不记得的东西)加载xml文件以覆盖和xbl,我会得到xml错误,就像语法错误但没有任何东西。我无法理解。

最后,我创建了一个chrome.manifest文件,并提供了像chrome://myaddon/content/myxml.xml这样的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文件才能正常工作。

现在,如果你想在网上托管这个东西并安装它,那么你必须使用非privelaged安装方式(这意味着从html页面中优化这个javascript)。这是:https://developer.mozilla.org/en-US/docs/Adding_search_engines_from_web_pages

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

但是如果你想像你在主题帖子中那样安装它,那就是xpcom install,你必须使用chrome路径

答案 1 :(得分:2)

好的,我深入研究了这一点,发现这是一件非常轻微的事情。

    {li} dataType EngineProperties 1 Ci.nsISearchEngine.DATA_XML 3 Ci.nsISearchEngine.TYPE_OPENSEARCH <URL <Url file:///C:/blah.xml。是的,我知道你的是一个opensearch xml文件,但它的xml使用1。
  1. 在XML更改{{1}}到{{1}}中注意小写的r和l。怪异。
  2. 无论如何你可以在这里安装这个插件安装你的搜索引擎: https://github.com/yajd/PortableTester/tree/a9ed2432cf4fab4362b71d2c805d97caac2cd237

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

    最后因为我不知道是什么原因,但是回调从不在addEngine之后调用,它是如此奇怪我不知道如何让它工作:(

    此外,我不确定安全错误,如果不是chrome路径是真的,不确定,但可能在其他情况下,但可能不在这里。您应该可以执行本地主机或本地文件路径,如{{1}}

答案 2 :(得分:2)

<强>问题:
NoitidartdataType should be 1 even though it's opensearch所示。

其次,无法通过iconURL中的addEngine。不确定这是否适用于所有图标,但绝对传递给它一个png或data URI都失败了。

第三,callback需要成为形式的对象:

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

第四,文件类型应为.osdx,而不是.xml

URLurlUrl并不重要,从不改变和扩展工作。

最后,在测试时,请确保browser.search.log中的true设置为about:config

您可以在错误报告here上看到更多信息。

希望这有助于下一个人陷入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非常好。 :|