我在“权限”中有网站,但不断获得“来自Chrome-extension:// abc不允许使用Access-Control-Allow-Origin”。

时间:2012-01-13 13:35:23

标签: google-chrome google-chrome-extension xmlhttprequest

我已经开始了一个新的扩展,基于一个较旧的扩展,我之前已经写过,现在正常工作。对于谷歌浏览器扩展,执行xhr的方案非常正常:内容脚本调用chrome.extension.sendRequest(数据,回调),实际的跨站点请求在backround.html中完成。

另外,我确保将请求的站点添加到manifest.json的“permissions”部分。

然而,background.html的控制台显示:“......来自Control-Allow-Origin,不允许使用原始chrome-extension:// ..”

问题如下:除了“权限”中没有目标域(我实际上甚至在这里尝试过),可能导致此错误


以下是一些重要的代码段:

的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);

P.S。:忘了提及,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)

不知道这条消息的含义以及我的代码的哪一部分可能会导致它。这里提到的脚本不是我的。

2 个答案:

答案 0 :(得分:3)

这可能是由"<all_urls>"模式的某些奇怪现象引起的,也许会尝试将其更改为您要调用的特定网址:

请参阅: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/添加到清单中的权限列表中。

答案 1 :(得分:1)

上面的答案是错误的,我只想澄清未来的读者,因为我也有同样的问题。

这是因为服务器的Access-Control-Allow-Origin不允许Chrome://扩展类型的Origins。

每当您发送到服务器时,您都有一个原始标头。在Chrome扩展程序中,这是“Chrome-extension //:blarg blarg blarg”。

许多服务器都有“*”的“Access-Control-Allow-Origin”,因此在大多数情况下,api调用都会通过。

但是,如果Access-Control-Allow-Origin需要一个http地址或某个域,那么你可以做很多事情来使其工作。

它适用于内容脚本,因为你有url本身的来源,即“http:// blarg blarg blarg”。