2012-01-13 20 views
5

Tôi đã bắt đầu tiện ích mở rộng mới dựa trên phiên bản cũ hơn mà tôi đã viết trước đó và đang hoạt động chính xác ngay bây giờ. Lược đồ làm xhr khá bình thường đối với các tiện ích mở rộng của Google Chrome: tập lệnh nội dung gọi chrome.extension.sendRequest (dữ liệu, gọi lại) và yêu cầu thực tế trên nhiều trang web được thực hiện trong backround.html.Tôi có trang web trong "quyền", nhưng tiếp tục nhận được "Nguồn gốc chrome-extension: // abc không được phép bởi Access-Control-Allow-Origin".

Ngoài ra, tôi đảm bảo rằng trang web được yêu cầu được thêm vào phần "quyền" của manifest.json.

Tuy nhiên, bảng điều khiển của background.html hiển thị: "... Không cho phép xuất xứ chrome-extension: // .. bởi Access-Control-Allow-Origin".

Câu hỏi đặt ra như sau: ngoại trừ việc không có tên miền mục tiêu trong "quyền" (tôi đã thực sự cố gắng ngay cả ở đây), ĐIỀU GÌ ELSE có thể gây ra lỗi này?


Dưới đây là một số đoạn mã cần thiết:

manifest.json:

{ 
    "name": "Register quote", 
    "version": "0.0.2", 
    "permissions": [ "<all_urls>" ], 
    "background_page" : "background.html", 
    "content_scripts": [ 
     { 
      "matches": [ 
       "http://somedomain.com/*" 
      ], 
      "css": ["register_quote.css"], 
      "js": ["jquery-1.3.2.min.js", "register_quote.user.js"] 
     } 
    ] 
} 

background.html:http://pastebin.com/0zLArvfA

register_quote.user.js:

// here's the final call, how it's prepared by the content script after all: 
chrome.extension.sendRequest({ 
    'action': 'sendAjaxRequest', 
    'url': "http://somedomain.com/the_script.php" 
    'dataStr': "is_chrome=Y&ticketid=123123123&user=Vladimir+Mityukov&action=get_quoteids" 
}, arg_callback); 

PS: quên đề cập đến, đó cũng là những lỗi sau đây trong giao diện điều khiển backround.html của:

Error in event handler for 'undefined': TypeError: Cannot read property 'length' of undefined 
    at setupPageActionEvents (chrome/ExtensionProcessBindings:424:36) 
    at chrome/ExtensionProcessBindings:1021:5 
    at [object Object].dispatch (chrome/EventBindings:182:28) 
    at Object.<anonymous> (chrome/EventBindings:237:25) 

Don'e có bất kỳ ý tưởng thông điệp gì này có nghĩa là gì và một phần của tôi mã có thể gây ra nó .. Các kịch bản, được đề cập ở đây, không phải của tôi.

+1

Tôi dường như không thể tìm thấy vấn đề ở cái nhìn đầu tiên, nhưng bạn có biết rằng bạn có thể [ngay bây giờ] (http://blog.chromium.org/2011/07/chrome-extensions-now-with -more.html) phát hành XHR trực tiếp từ tập lệnh nội dung của bạn? – ronme

+1

Bạn nên khởi chạy trình gỡ lỗi với "Tạm dừng ngoại lệ chưa được kích hoạt" để tìm mã gây ra lỗi 'Không thể đọc thuộc tính 'length''. –

+0

> nhưng bạn có biết bây giờ bạn có thể phát hành XHR trực tiếp từ tập lệnh nội dung của mình không? Yay, giờ nó hoạt động mà không cần proxy background.html! – pilat

Trả lời

3

Điều này có thể được gây ra bởi một số weirdness của mô hình "<all_urls>", có lẽ hãy thử thay đổi nó để là URL cụ thể mà bạn muốn gọi:

Xem: http://code.google.com/p/chromium/issues/detail?id=87671

"permissions": [ "http://somedomain.com/*" ] 

Trên lưu ý phụ, tập lệnh nội dung hiện được phép thực hiện cuộc gọi XHR xuyên quốc gia:

http://code.google.com/chrome/extensions/xhr.html

"Ghi chú phiên bản: Kể từ Chrome 13, tập lệnh nội dung có thể thực hiện các yêu cầu có nguồn gốc chéo đến cùng một máy chủ như phần còn lại của tiện ích. Trước Chrome 13, tập lệnh nội dung không thể trực tiếp đưa ra yêu cầu; thay vào đó, nó đã phải gửi một thông điệp tới phần mở rộng mẹ hỏi phần mở rộng để thực hiện một yêu cầu cross-xứ."

Trong trường hợp này bạn sẽ cần phải thêm http://somedomain.com/ vào danh sách cho phép trong biểu hiện.

+0

Có mẫu hình thường xuyên trước khi tôi đã thử , vì vậy, đó không phải là lý do. Tuy nhiên, việc sử dụng các cuộc gọi xhr từ bên trong bản thân contentcript đã làm được điều đó! – pilat

1

Các câu trả lời ở trên là sai và tôi chỉ muốn làm rõ cho độc giả trong tương lai kể từ khi tôi cũng đã có cùng một vấn đề.

Điều này là do Access-Control-Allow-Origin của máy chủ không cho phép Chrome: // loại tiện ích mở rộng.

Bất cứ khi nào bạn gửi tới máy chủ, bạn có tiêu đề gốc. Từ tiện ích của Chrome, đây là "tiện ích mở rộng của Chrome //: blarg blarg blarg".

Rất nhiều máy chủ có "Access-Control-Allow-Origin" của "*" vì vậy trong hầu hết các trường hợp, các cuộc gọi api sẽ đi qua.

Tuy nhiên, nếu Access-Control-Allow-Origin cần địa chỉ http hoặc tên miền nhất định, thì bạn không thể làm gì để làm cho nó hoạt động.

Nó hoạt động trên tập lệnh nội dung vì bạn có nguồn gốc của chính url đó, là "http: // blarg blarg blarg".

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