Firefox говорит, что не может загрузить поисковый плагин с
Предыстория:
Я пытаюсь динамически сгенерировать поисковый плагин OpenSearch для Firefox на основе введенных пользователем значений как часть большего дополнения. Я не учитываю формы и несоответствия, связанные с ним, потому что я сузил их до простого неудачного тестового примера, пытающегося импортировать любой 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&ind=1406730191685&n=14787A74345&st=bar&searchfor={searchTerms}" />
<URL method="get" type="application/x-moz-keywordsearch"
template="http://search.mywebsearch.com/mywebsearch/GGmain.jhtml?&ptb=100000487&ind=1406730191685&n=14787A74345&st=bar&searchfor={searchTerms}" />
<Url method="get" type="application/x-suggestions+json"
template="http://ssmsp.ask.com/query?q={searchTerms}&li=ff&sstype=prefix"/>
<moz:SearchForm>http://search.mywebsearch.com/mywebsearch/GGmain.jhtml</moz:SearchForm>
</OpenSearchDescription>
(Из проекта Майкрофт)
Из того, что я видел, ошибка должна указывать на недопустимый файл XML, но я не могу найти в этом ничего плохого. Я загрузил его в Firefox, исправил все опечатки и синтаксические ошибки, которые я нашел (раньше имел &
вместо &
и браузер отображает и анализирует его нормально, но все же он не будет загружаться как открытая поисковая система.
Может быть, FF не поддерживает localhost? Я рисую пробел здесь.
Заранее спасибо за любую информацию!
3 ответа
Проблемы:
Как указано Noitidart, dataType
должно быть 1, хотя это opensearch.
Во-вторых, не может передать iconURL
в addEngine
, Не уверен, верно ли это для всех значков, но определенно передаю ему png или a data URI
оба не смогли.
В третьих, callback
должен быть объектом вида:
callback={
onError : function(err){/**/},
onSuccess : function(err){/**/}
}
В-четвертых, тип файла должен быть .osdx
не .xml
URL
в url
в Url
не имеет значения, никогда не менялся и расширение работает.
Наконец, при тестировании убедитесь, что у вас есть browser.search.log
установлен в true
в about:config
,
Вы можете увидеть больше информации в отчете об ошибке здесь.
Надеюсь, это поможет следующему парню, застрявшему в 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 так легко доступен.:|
Это вопрос безопасности. Я был поражен этим раньше. Я загружал 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.
так что, очевидно, XML-файлы должны быть загружены из путей Chrome для правильной работы.
Теперь, если вы хотите разместить эту вещь в сети и установить ее таким образом, вы должны использовать непривилегированный способ установки (что означает исключение этого javascript из html-страницы). Что это такое: https://developer.mozilla.org/en-US/docs/Adding_search_engines_from_web_pages
window.external.AddSearchProvider('http://localhost/search.xml');
но если вы хотите установить его так, как вы делаете в своем посте, посвященном установке xpcom, вы должны использовать chrome path
Хорошо, я глубоко изучил это и обнаружил, что это очень незначительная вещь.
dataType
вEngineProperties
должно быть1
которыйCi.nsISearchEngine.DATA_XML
вы использовали3
для чегоCi.nsISearchEngine.TYPE_OPENSEARCH
, Да, я знаю, что у вас xml-файл opensearch, но его xml, так что используйте 1.- В изменении XML
<URL
в<Url
обратите внимание на строчные буквы r и l. странно.
В любом случае вы можете установить это дополнение здесь, оно устанавливает вашу поисковую систему: https://github.com/yajd/PortableTester/tree/a9ed2432cf4fab4362b71d2c805d97caac2cd237
Используйте https://addons.mozilla.org/en-US/firefox/addon/github-extension-installer/ addon для установки прямо из репозитория.
ПОСЛЕДНЕЕ, потому что я не знаю, по какой причине, но обратный вызов никогда не вызывает после addEngine, это так странно, я понятия не имею, как заставить это работать:(
Также я не уверен, что ошибка безопасности, если не путь к Chrome, верна, не уверен, но это может быть в других случаях, но, возможно, не здесь. Вы должны быть в состоянии сделать локальный или локальный путь к файлу, как file:///C:/blah.xml