【问题标题】:Firefox says could not download the search plugin fromFirefox 说无法下载搜索插件
【发布时间】:2014-09-24 21:06:07
【问题描述】:

背景故事:
我正在尝试根据用户输入的值为 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;amp; 而不是 &amp;amp;,浏览器可以很好地显示和解析它,但它不会作为打开的搜索搜索加载引擎。

FF 不支持本地主机,也许吧?我在这里画一个空白。

提前感谢您的任何见解!

【问题讨论】:

    标签: javascript xml firefox firefox-addon opensearch


    【解决方案1】:

    这是一个安全问题。我以前被这个打击过。我正在做的是从本地路径(或资源路径或我不记得的东西)加载一个用于覆盖和 xbl 的 xml 文件,我会收到 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吗?
    • 另外,即使更改为 chrome 协议,仍然没有。一定是xml问题,但不知道是什么问题。
    • 我认为数据 uri 应该可以正常工作。你能把你的实际xml文件发给我吗?把它贴在 github 上,我会让它工作。 xml 文件是否与 window.external.AddSearchProvider 一起使用?
    • 那是我的实际 XML。它不能作为 data:URI 或 chrome:// uri 工作,但是当我创建一个指向虚假域的主机条目并使用标题“Content-Type:application/opensearchdescription+xml”传递它时,它就起作用了。仍然无济于事,因为我无法从用户机器上的插件中执行此操作。
    • 我认为安全问题不适用于这种情况。不过我不确定。
    【解决方案2】:

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

    1. dataType 中的 EngineProperties 应该是 1Ci.nsISearchEngine.DATA_XML 你使用的是 3Ci.nsISearchEngine.TYPE_OPENSEARCH。是的,我知道你的是一个 opensearch xml 文件,但它的 xml 所以使用 1。
    2. 在将 XML 中的 &lt;URL 更改为 &lt;Url 时,请注意小写的 r 和 l。很奇怪。

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

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

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

    此外,我不确定如果不是 chrome 路径的安全错误是否属实,不确定但在其他情况下可能是这样,但可能不在这里。您应该能够执行 localhost 或本地文件路径,例如 file:///C:/blah.xml

    【讨论】:

      【解决方案3】:

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

      第二,不能通过addEngine中的iconURL。不确定这是否适用于所有图标,但肯定是通过 png 或 data URI 都失败了。

      第三,callback需要是表单的对象:

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

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

      URLurlUrl 没关系,永远不会改变并且扩展工作。

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

      您可以在错误报告here 中查看更多信息。

      希望这可以帮助下一个困在Components.classes["@mozilla.org/browser/search-service;1"].getService(Components.interfaces.nsIBrowserSearchService).addEngine()-land 的人。

      更新:将 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 上的某个地方吗?特别是关于回调。在什么情况下我们应该使用 3 的 dataType 来进行 opensearch?
      • 据我所知,没有。我从 Gavin 那里得到了关于我在 Bugzilla 上打开的票证上的回调信息,我通过乱搞得到了数据类型,然后你确认了。另外,对不起,我在答案中拼错了你的 u/n……我没有这么拼。
      • 你跟我说话好吗 :P 我拼写比你差 :P 问@nmaier :P 我从不道歉 :P
      猜你喜欢
      • 2013-05-06
      • 2015-12-22
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      相关资源
      最近更新 更多