Firefox сообщает, что не удалось загрузить плагин поиска с
-
02-01-2020 - |
Вопрос
Предыстория:
Я пытаюсь динамически генерировать Открытый поиск Плагин поиска для 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 не поддерживает локальный хост?Я рисую здесь пробел.
Заранее спасибо за любую информацию!
Решение 3
Проблемы:
Как указано Нойтидарт, dataType
должно быть 1, даже если это открытый поиск.
Во-вторых, не может пройти 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
, и он работал. Super расстраивает, ошибка должна объяснить больше, она потратила впустую время, так что я пытался исправить синтаксис 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 Path.
Так что я, по-видимому, файлы XML должны быть загружены из путей Chrome, чтобы работать вправо.
Теперь, если вы хотите провести эту вещь в сети и установить его так, то вам необходимо использовать некомнациональный способ установки (что означает, что Excutute это 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/ аддон для установки прямо из репо.
НАКОНЕЦ, потому что я не знаю, по какой причине, но обратный вызов никогда не вызывает после addEngine, это так странно, что я понятия не имею, как заставить это работать :(
Также я не уверен, верна ли ошибка безопасности, если не путь chrome, не уверен, но это может быть в других случаях, но, возможно, не здесь.Вы должны иметь возможность использовать локальный хост или локальные пути к файлам, например file:///C:/blah.xml