Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Chrome扩展中禁止XHR,尽管添加了正确的权限?_Javascript_Google Chrome_Google Chrome Extension_Xmlhttprequest - Fatal编程技术网

Javascript 在Chrome扩展中禁止XHR,尽管添加了正确的权限?

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,但这是一个包含在背景页面中的脚本,而不是内容脚本,所以我不明白为什么会失败 注意

我目前正在为我的浏览器添加一个插件,遇到了一个奇怪的XHR问题(想知道Chrome最近是否有什么变化)

当扩展尝试从中获取API函数列表时,XHR将失败并显示“访问控制允许源”。我以前在我的一些其他扩展中看到过这种失败,但通常是由于忘记在清单中声明正确的权限。但是,我的清单包括“http://www.mathworks.com/“在权限列表中,所以我不明白为什么会失败。我看到一些人提到内容脚本中不允许使用跨源XHR,但这是一个包含在背景页面中的脚本,而不是内容脚本,所以我不明白为什么会失败

注意:我使用的是Chrome14(开发频道)。我很想知道这是最近Chrome14中出现的在早期Chrome版本中运行良好的东西,还是我只是在代码中做了一些愚蠢的事情。如果它在Chrome14中被破坏,任何关于解决方法的建议都将不胜感激

舱单:

{
    "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上是可以工作的。