سؤال

الخلفية الدرامية:
أحاول إنشاء ملف ديناميكيًا البحث المفتوح ابحث في المكون الإضافي لمتصفح Firefox بناءً على القيم التي أدخلها المستخدم كجزء من وظيفة إضافية أكبر.أنا لا أقوم بتضمين النماذج والتفاصيل المحيطة بها، لأنني قمت بتضييق نطاقها إلى حالة اختبار فاشلة بسيطة تحاول استيراد أي ملف XML.

شفرة:
شبيبة مبسطة

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>

(من مشروع مايكروفت)

مما رأيته، يجب أن يشير الخطأ إلى ملف XML غير صالح، ولكن طوال حياتي لا يمكنني العثور على أي خطأ في هذا.لقد قمت بتحميله في Firefox وأصلحت جميع الأخطاء المطبعية والأخطاء النحوية التي وجدتها (اعتدت أن يكون لها & بدلاً من &amp;, ، ويقوم المتصفح بعرضها وتحليلها بشكل جيد، ولكن مع ذلك لن يتم تحميلها كمحرك بحث مفتوح.

ربما لا يدعم 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]

لذا، لا تفعل ذلك.

من الرائع أن يسهل الوصول إلى واجهة برمجة التطبيقات هذه.:|

نصائح أخرى

إنه أمر أمني.لقد ضربني هذا من قبل.ما كنت أفعله هو تحميل ملف 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');           
                }
            }

لاحظ كيف قمت بإزالة المسار المحلي باستخدام مسار الكروم.

لذلك يبدو أنه يجب تحميل ملفات xml من مسارات Chrome حتى تعمل بشكل صحيح.

الآن، إذا كنت ترغب في استضافة هذا الشيء على الشبكة وتثبيته بهذه الطريقة، فعليك استخدام طريقة التثبيت غير المميزة (مما يعني تنفيذ جافا سكريبت هذا من صفحة html).وهو هذا: https://developer.mozilla.org/en-US/docs/Adding_search_engines_from_web_pages

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

ولكن إذا كنت تريد تثبيته كما تفعل في مشاركة موضوعك، وهو تثبيت xpcom، فيجب عليك استخدام مسار chrome

حسنًا، لقد بحثت بعمق في هذا الأمر واكتشفت أنه شيء بسيط جدًا.

  1. dataType في EngineProperties يجب ان يكون 1 الذي Ci.nsISearchEngine.DATA_XML كنت تستخدم 3 وهو ل Ci.nsISearchEngine.TYPE_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/ ملحق للتثبيت مباشرة من الريبو.

أخيرًا لأنني لا أعرف السبب، لكن رد الاتصال لا يتصل أبدًا بعد addEngine، إنه أمر غريب جدًا وليس لدي أي فكرة عن كيفية تشغيل ذلك :(

لست متأكدًا أيضًا مما إذا كان الخطأ الأمني ​​إذا لم يكن مسار chrome صحيحًا، ولست متأكدًا ولكنه قد يكون في حالات أخرى، ولكن ربما ليس هنا.يجب أن تكون قادرًا على القيام بالمضيف المحلي أو مسارات الملفات المحلية مثل file:///C:/blah.xml

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top