Javascript 在Chrome扩展中禁止XHR,尽管添加了正确的权限?
我目前正在为我的浏览器添加一个插件,遇到了一个奇怪的XHR问题(想知道Chrome最近是否有什么变化) 当扩展尝试从中获取API函数列表时,XHR将失败并显示“访问控制允许源”。我以前在我的一些其他扩展中看到过这种失败,但通常是由于忘记在清单中声明正确的权限。但是,我的清单包括“http://www.mathworks.com/“在权限列表中,所以我不明白为什么会失败。我看到一些人提到内容脚本中不允许使用跨源XHR,但这是一个包含在背景页面中的脚本,而不是内容脚本,所以我不明白为什么会失败 注意:我使用的是Chrome14(开发频道)。我很想知道这是最近Chrome14中出现的在早期Chrome版本中运行良好的东西,还是我只是在代码中做了一些愚蠢的事情。如果它在Chrome14中被破坏,任何关于解决方法的建议都将不胜感激 舱单:Javascript 在Chrome扩展中禁止XHR,尽管添加了正确的权限?,javascript,google-chrome,google-chrome-extension,xmlhttprequest,Javascript,Google Chrome,Google Chrome Extension,Xmlhttprequest,我目前正在为我的浏览器添加一个插件,遇到了一个奇怪的XHR问题(想知道Chrome最近是否有什么变化) 当扩展尝试从中获取API函数列表时,XHR将失败并显示“访问控制允许源”。我以前在我的一些其他扩展中看到过这种失败,但通常是由于忘记在清单中声明正确的权限。但是,我的清单包括“http://www.mathworks.com/“在权限列表中,所以我不明白为什么会失败。我看到一些人提到内容脚本中不允许使用跨源XHR,但这是一个包含在背景页面中的脚本,而不是内容脚本,所以我不明白为什么会失败 注意
{
"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)开发 更新
我已经提交了这个文件,因为我认为这实际上是Chrome中的一个bug。但是,如果这个问题没有得到解决,我真的很感激任何一种解决方法,可以使这个问题得到解决。在URL的末尾添加*,它是基于通配符的
{
"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"
}
请参阅-我们的一些文档似乎暗示它在没有*的情况下可以工作,但不应该(请参阅“坏示例”)。。。。此外,省略用于工作的星号。(我有几个扩展,至少在使用早期版本的Chrome进行测试时,它们工作得很好,并且不包括星号)。XHR是从背景页面还是从内容脚本完成的?如果可能的话,您能上传一个显示此问题的最小示例(最好是未打包的扩展名)吗?它是一个背景页面,而不是一个内容脚本。您可以在链接上看到完整的源代码。您知道实际的http请求/响应是什么样的吗(可能通过使用Fiddler或WireShark)?我猜Chrome在http请求中包含了Origin头,这使得它成为一个跨域请求(),从而导致它失败。也许Chrome extensions将开始遵守同一来源政策?更新:不,看起来第三方Cookie被阻止了,mathworks愚蠢地在响应中设置了大量Cookie,当我真的没有理由使用cookies的时候,我也遇到了跨域请求和Chrome 14的问题,而Chrome 14以前是可以工作的,至少在Chrome 12上是可以工作的。