2009-12-23 33 views
9

Tôi đang chuyển một trong các tiện ích mở rộng Firefox của mình sang Chrome và tôi đang gặp sự cố nhỏ với truy vấn AJAX. Mã sau hoạt động tốt trong phần mở rộng FF, nhưng không thành công với trạng thái "0" trong Chrome.Cuộc gọi jQuery.ajax không thành công trong phần mở rộng của 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; 
} 

Phần cụ thể này của tiện ích mở rộng kiểm tra nội dung trên clipboard (một vấn đề khác của Chrome) gửi yêu cầu HEAD và kiểm tra phản hồi "Kiểu nội dung" tiêu đề để chắc chắn đó là một hình ảnh. Nếu vậy, nó sẽ trả về true, dán văn bản clipboard vào thẻ IMG. Nếu không, nếu nó trông giống như một URL bình thường không phải là một hình ảnh, nó sẽ kết thúc nó trong một thẻ A. Nếu nó không phải là một URL, nó chỉ làm một dán đơn giản.

Dù sao, url được kiểm tra chắc chắn là hình ảnh và hoạt động tốt trong FF, nhưng trong chức năng đầy đủ, xhr.status là "0" và trạng thái là "lỗi" khi hàm hoàn tất. Tăng thời gian chờ lên 10 giây không giúp được gì. Tôi đã xác minh những hình ảnh kiểm tra nên trở lại là "image/jpeg" khi chạy:

curl -i -X HEAD <imageURL> 

Tôi cũng biết tôi nên sử dụng sự thành công và callbacks lỗi thay vì hoàn thành, nhưng họ không làm việc, hoặc. Bất kỳ ý tưởng?

+0

Có thể là giới hạn bảo mật đối với tất cả yêu cầu AJAX khỏi việc gia hạn không? –

+0

không nên 'trả về isImage;' là một phần của cuộc gọi lại đầy đủ? – pixeline

+0

@pixieline: Có thể. Đó là chỉ để có một điểm trở lại, nhưng nó thậm chí không nhận được rằng đến nay, bởi vì chuyển đổi (trạng thái) là "lỗi", do đó, chi nhánh không bao giờ được gọi là. –

Trả lời

11

Khi bạn đã tìm ra Chris, trong Tập lệnh nội dung, bạn không thể thực hiện bất kỳ XHR xuyên quốc gia nào. Bạn sẽ phải thực hiện chúng trong một trang mở rộng như Background, Popup, hoặc thậm chí là Options để thực hiện nó.

Để biết thêm thông tin về giới hạn nội dung kịch bản, vui lòng tham khảo: http://code.google.com/chrome/extensions/content_scripts.html

Và để biết thêm thông tin về giới hạn XHR, vui lòng tham khảo: http://code.google.com/chrome/extensions/xhr.html

+6

Đối với bất kỳ ai ngại trên trang này, điều này là [không đúng đối với Chrome 13+] (http://developer.chrome.com/extensions/whats_new.html#13) – Arithmomaniac

5

Kiểm tra tệp kê khai của bạn. Tiện ích có quyền truy cập url đó không?

Nếu nó giúp cho vấn đề thứ hai của bạn (hoặc bất cứ ai khác): Bạn có thể gửi yêu cầu đến trang nền của bạn như:

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

Các Biến response có thể bất cứ điều gì bạn muốn nó được. Nó có thể chỉ đơn giản là một chuỗi thành công hoặc từ chối. Tùy thuộc vào bạn.

Trên trang nền của bạn, bạn có thể thêm một người biết lắng nghe:

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. 
}); 

Với điều này bạn có thể vượt qua các phản hồi từ yêu cầu AJAX của bạn trở lại kịch bản nội dung của bạn và làm bất cứ điều gì bạn muốn làm với nó ở đó.

+0

Đó là một trong những vấn đề. Khác là content_scripts không thể gửi yêu cầu AJAX. Các trang nền có thể, tuy nhiên, mà tôi sẽ giải thích trong câu trả lời của riêng tôi. –

5

Tôi đã giải quyết được một phần vấn đề, thực sự phần lớn vấn đề. Đầu tiên, như Brennan và tôi đã đề cập ngày hôm qua, tôi cần thiết lập quyền trong manifest.json.

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

Không lý tưởng để cấp quyền cho mọi miền, vì hình ảnh có thể được lưu trữ từ bất kỳ miền nào, nó sẽ phải làm và tôi sẽ phải bảo vệ chống lại XSS.

Vấn đề khác là Chrome thực sự chặn mọi thứ trong phần content_scripts khỏi thực hiện cuộc gọi AJAX, không hoạt động âm thầm. Tuy nhiên, không có giới hạn như vậy trên background_page, nếu bạn có một. Trang đó có thể thực hiện bất kỳ cuộc gọi AJAX nào mà họ muốn và Chrome có API để cho phép tập lệnh của bạn mở một cổng và chuyển yêu cầu đến trang nền đó. Ai đó đã viết một tập lệnh có tên là XHRProxy làm giải pháp thay thế và tôi đã sửa đổi nó để có được tiêu đề phản hồi thích hợp. Nó hoạt động!

Vấn đề duy nhất của tôi bây giờ là tìm ra cách làm cho tập lệnh đợi kết quả của cuộc gọi được đặt trong sự kiện, thay vì chỉ trả lại ngay lập tức.

+0

Xin chào, điều này không giữ thêm bất kỳ tập lệnh nội dung nào có thể tạo yêu cầu xml, xem câu trả lời của tôi. –

Các vấn đề liên quan