5

Я начал новое расширение, исходя из старого, которое я написал ранее, и которое сейчас работает правильно. Схема выполнения xhr довольно обычна для расширений Google Chrome: сценарий содержимого вызывает chrome.extension.sendRequest (данные, обратный вызов), а фактический запрос на межсайтовый сайт выполняется в backround.html.У меня есть сайт в «разрешениях», но продолжайте получать «Origin chrome-extension: // abc не разрешен Access-Control-Allow-Origin».

Кроме того, I'v удостоверился, что запрошенный сайт добавлен в раздел «Разрешения» manifest.json.

Однако консоль background.html отображает: «... Происхождение chrome-extension: // .. не допускается Access-Control-Allow-Origin».

Вопрос заключается в следующем: за исключением того, что целевой домен не указан в «разрешениях» (я действительно пытался даже здесь), ЧТО ЭТО может привести к этой ошибке?


Вот некоторые важные фрагменты кода:

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: забыл упомянуть, есть также следующее сообщение об ошибке в консоли backround.html в:

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 имеют ни малейшего представления, что означает, что это сообщение и какая часть моего код может вызвать это. Сценарии, упомянутые здесь, не мои.

+1

Кажется, я не могу понять, что проблема на первый взгляд, но знаете ли вы, что можете [сейчас] (http://blog.chromium.org/2011/07/chrome-extensions-now-with -more.html) выдает XHR непосредственно из вашего скрипта контента? – ronme

+1

Вы должны запустить отладчик с «Пауза на неперехваченное исключение», чтобы найти код, вызывающий ошибку 'Can not read property 'length. –

+0

> но знаете ли вы, что теперь вы можете отправить XHR прямо из своего сценария контента? Yay, теперь он работает без background.html прокси! – pilat

ответ

3

Это может быть вызвано некоторой странности "<all_urls>" модели, возможно, попробуйте изменить его, чтобы быть конкретный URL, который вы хотите позвонить:

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

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

Об одном Примечание. Скрипты контента теперь разрешены для звонков XHR с перекрестным происхождением:

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

«Замечание по версии: Начиная с Chrome 13, скрипты содержимого могут передавать запросы с кросс-началом на те же серверы, что и остальные расширения. До Chrome 13 скрипт содержимого не мог напрямую запрашивать запросы; вместо этого, он должен был отправить сообщение своему родительскому расширения с просьбой о продлении сделать запрос кросс-происхождения.»

В этом случае вам нужно будет добавить http://somedomain.com/ в список разрешений в манифесте.

+0

Был обычный узор, прежде чем я попытался , так что это не было причиной. Тем не менее, использование xhr звонков изнутри самого оккупированного текста сделало трюк! – pilat

1

ответ выше неправильный, и я просто хочу уточнить для будущих читателей, так как у меня тоже была такая же проблема.

Это связано с тем, что для Access-Control-Allow-Origin сервера не разрешен тип распространения Chrome: //.

Всякий раз, когда вы отправляете сервер, у вас есть заголовок источника. Из расширений Chrome это «расширение Chrome //: blarg blarg blarg».

Многие серверы имеют «Access-Control-Allow-Origin» из «*», поэтому в большинстве случаев вызовы api будут проходить.

Однако, если для Access-Control-Allow-Origin нужен http-адрес или определенный домен, то нет никаких вещей, которые вы можете сделать, чтобы заставить его работать.

Он работает над сценарием контента, потому что у вас есть источник самого URL, который является «http: // blarg blarg blarg».

Смежные вопросы