В настоящее время я работаю над Matlab API Search дополнением к моим разработчикам омнибоксовых расширений , и столкнулся со странной проблемой XHR (интересно, возможно, что-то недавно изменилось в Chrome) .
Когда расширение пытается извлечь список функций API из http://www.mathworks.com/help/techdoc/ref/funcalpha.html,, XHR завершается ошибкой с «Access-Control-Allow-Origin». Я видел этот сбой в прошлом с некоторыми другими моими расширениями, но обычно это было результатом того, что я забыл указать правильные разрешения в манифесте. Тем не менее, мой манифест включает «http://www.mathworks.com/" в список разрешений, поэтому я не понимаю, почему это не удается. Я видел упоминание о запрещении XHR с несколькими источниками в сценариях содержимого, но это сценарий, включенный в фоновая страница, а не контент-скрипт, поэтому я не понимаю, почему это не получается.
ПРИМЕЧАНИЕ. Я использую Chrome 14 (канал разработчика). Мне любопытно узнать, работает ли это недавно в Chrome 14 и работает ли оно в более ранних версиях Chrome, или я просто делаю глупости в своем коде. Если он не работает в Chrome 14, любые предложения об обходном пути будут с благодарностью.
Manifest:
{
"name":"Matlab API Search",
"description":"Adds support to the omnibox to search the Matlab API.",
"background_page":"background.html",
"icons":{"128":"icon128.png", "32":"icon32.png", "16":"icon16.png"},
"omnibox":{"keyword":"matlab"},
"permissions":[
"tabs",
"http://www.mathworks.com/"
],
"version":"1.0"
}
XHR Звоните:
xhr("http://www.mathworks.com/help/techdoc/ref/funcalpha.html",
function(url, req) {
// ...
},
function(url, req) {
// ...
}).send(null);
Где функция xhr
была определена следующим образом:
function xhr(url, ifexists, ifnotexists, retry_interval) {
var retry_time = retry_interval || 5;
var req = new XMLHttpRequest();
console.log("Fetching: " + url);
req.open("GET", url);
req.onreadystatechange=function(){
if (req.readyState == 4){
var status=req.status;
if ((status == 200) || (status == 301) || (status == 302)) {
ifexists(url, req);
} else {
ifnotexists(url, req);
setTimeout(function() { xhr(url, ifexists, ifnotexists, retry_time + 5).send(null); }, retry_time);
}
}
};
return req;
}
ПРИМЕЧАНИЕ
Я также попробовал следующие разрешения:
http://www.mathworks.com/*
http://*.mathworks.com/*
*://www.mathworks.com/*
*://*.mathworks.com/*
*://*
http://*/*
(Я бы не хотел использовать «Все ваши данные на всех сайтах», во всяком случае, но это, кажется, подразумевает, что это не проблема с тем, как я объявил свои разрешения, поэтому я невероятно запутался ).
Версия
14.0.803.0 (Официальная сборка 90483) dev
Обновление
Я подал эту ошибку Chrome , так как я думаю, что это на самом деле ошибка в Chrome. Однако, если это не будет исправлено, я был бы очень признателен за любой обходной путь, который может сделать эту работу.