سؤال

أنا أقوم بنقل أحد ملحقات Firefox إلى Chrome ، وأنا أواجه مشكلة صغيرة مع استعلام Ajax. يعمل الكود التالي بشكل جيد في امتداد FF ، لكنه يفشل مع حالة "0" في Chrome.

function IsImage(url) {
    var isImage = false;
    var reImageContentType = /image\/(jpeg|pjpeg|gif|png|bmp)/i;
    var reLooksLikeImage = /\.(jpg|jpeg|gif|png|bmp)/i;

    if(!reLooksLikeImage.test(url)) 
    {
        return false;
    }

    var xhr = $.ajax({
        async: false,
        type: "HEAD",
        url: url,
        timeout: 1000,
        complete : function(xhr, status) {
            switch(status)
            {
                case "success":
                    isImage = reImageContentType.test(xhr.getResponseHeader("Content-Type"));
                    break;
            }
        },
    });

    return isImage;
}

يتحقق هذا الجزء الخاص من الامتداد بما هو موجود على الحافظة (مشكلة أخرى في كروم قمت بحلها بالفعل) ، وإذا كان عنوان URL للصورة ، فإنه يرسل طلب رأس ويتحقق من رأس استجابة "نوع المحتوى" للتأكد من أنه صورة . إذا كان الأمر كذلك ، فسوف يعود صحيحًا ، بلصق نص الحافظة في علامة IMG. خلاف ذلك ، إذا كان يبدو وكأنه عنوان URL العادي ليس صورة ، فإنه يلفها في علامة A. إذا لم يكن عنوان URL ، فهو يفعل معجونًا عاديًا.

على أي حال ، فإن عنوان URL الذي يتم فحصه هو بالتأكيد صورة ، ويعمل بشكل جيد في FF ، ولكن في الوظيفة الكاملة ، XHR.Status هو "0" ، والحالة هي "خطأ" عند اكتمال الوظيفة. زيادة المهلة إلى 10 ثوان لا يساعد. لقد قمت بالتحقق من أن صور الاختبار يجب أن تعود كـ "Image/JPEG" عند التشغيل:

curl -i -X HEAD <imageURL>

أعلم أيضًا أنني يجب أن أستخدم عمليات الاسترداد للنجاح والخطأ بدلاً من اكتمالها ، لكنها لا تعمل أيضًا. أيه أفكار؟

هل كانت مفيدة؟

المحلول

عندما اكتشفت كريس ، في البرامج النصية للمحتوى ، لا يمكنك القيام بأي XHRs عبر المجال. سيكون عليك القيام بها في صفحة تمديد مثل الخلفية أو المنبثقة أو حتى الخيارات للقيام بذلك.

لمزيد من المعلومات حول الحد من نصوص المحتوى ، يرجى الرجوع إلى:http://code.google.com/chrome/extensions/content_scripts.html

ولمزيد من المعلومات حول قيود XHR ، يرجى الرجوع إلى:http://code.google.com/chrome/extensions/xhr.html

نصائح أخرى

لقد قمت بحل جزء من المشكلة ، في الواقع معظمها. أولاً ، كما ذكرت أنا و برينان بالأمس ، كنت بحاجة إلى وضع أذونات في Meantest.json.

"permissions": [
    "http://*/*",
    "https://*/*"
],

ليس من المثالي إعطاء أذونات لكل مجال ، ولكن نظرًا لأنه يمكن استضافة الصور من أي مجال ، فسيتعين عليه القيام به ، وسأضطر إلى الحماية من XSS.

المشكلة الأخرى هي أن Chrome بالفعل يمنع أي شيء في قسم Content_scripts من إجراء مكالمات Ajax ، وفشل بصمت. ومع ذلك ، لا يوجد مثل هذا القيود على الخلفية _page ، إذا كان لديك واحد. يمكن لهذه الصفحة إجراء أي مكالمات Ajax التي تريدها ، ولديه API للسماح للبرنامج النصي بفتح منفذ وتقرير الطلبات إلى صفحة الخلفية هذه. كتب أحدهم نصًا يسمى Xhrproxy كحل بديل ، وقمت بتعديله للحصول على رأس الاستجابة المناسب. إنها تعمل!

مشكلتي الوحيدة الآن هي معرفة كيفية جعل البرنامج النصي ينتظر حتى يتم تعيين نتيجة المكالمة في الحدث ، بدلاً من العودة فورًا.

تحقق من ملف البيان الخاص بك. هل لدى التمديد إذن للوصول إلى عنوان URL هذا؟

إذا كان ذلك يساعد في مشكلتك الثانية (أو أي شخص آخر): يمكنك إرسال طلب إلى صفحة الخلفية الخاصة بك مثل:

chrome.extension.sendRequest({var1: "var1value", var2: "value", etc}, 
 function(response) {
    //Do something once the request is done.
}); 

المتغير response يمكن أن يكون أي شيء تريده. يمكن أن يكون ببساطة نجاحًا أو نفيًا. متروك لكم.

في صفحة الخلفية الخاصة بك ، يمكنك إضافة مستمع:

chrome.extension.onRequest.addListener(
function(request, sender, sendResponse) {
      // Do something here
      // Once done you can send back all the info via:
      sendResponse( anything you want here );

      // and it'll be passed back to your content script.
});

باستخدام هذا ، يمكنك تمرير الاستجابة من طلب Ajax الخاص بك مرة أخرى إلى البرنامج النصي للمحتوى والقيام بكل ما تريد القيام به هناك.

الإجابة المقبولة عفا عليها الزمن.

يمكن أن تصنع برامج النصوص المحتوى الآن xmlhttprequests تمامًا مثل البرامج النصية الخلفية!

يجب السماح بعناوين URL المتعلقة بالبيان:

{
  "name": "My extension",
  ...
  "permissions": [
    "http://www.google.com/"
  ],
  ...
}

يمكنك أيضًا استخدام تعبيرات مثل:

"http://*.google.com/"
"http://*/"

للحصول على المزيد من الأذونات العامة.

هنا هو رابط الوثائق.

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