0

我有一个 chrome 扩展,它在扩展页面内的 iframe 中显示来自 Web 服务的 UI 作为它自己的 UI。我正在使用以下方法将一些内容脚本注入远程 UI:

"content_scripts": [
  {
    "matches" : [ "https://mywebservice.com/frontend/*" ] ,
    "js" : [ "frontend-page-contentscript.js" ],
    "all_frames" : true
  }
]

这是允许的,因为(也在 manifest.json 中):[编辑:事实证明不需要在 iframe 中运行内容脚本 - 但删除它不会使 AJAX 以我期望的方式工作]。

"sandbox" : {
  "pages" : [
    "cocoon_page_proxy.html"
  ]
}

但是,当我进行微不足道的 ajax 调用(不是来自内容脚本,来自 iframe)时:

$.get('asdf',function success(data) { console.log("Success"); },
             function error(xhr) { console.log("Error: "+xhr.responseText); });

我没有得到任何回应,它停止并获得“0”的状态。这(根据我的经验)通常是由于跨域权限问题,但它不应该是 - 它正在从主页所在的同一服务器请求另一个资源。

建议?

4

3 回答 3

0

叹息 - 结果是我的扩展中其他地方的错误,在 webrequest 重定向代码中。

于 2012-10-04T16:43:20.490 回答
0

假设我理解正确并且您正在将chrome-extension://URL 加载到框架中并尝试从那里 XHR 远程页面的内容,您需要请求该域的跨域权限

于 2012-10-04T10:56:49.967 回答
0

因此,您实际上可以使用 Chrome 中的 webRequest api 强制跨域 ajax。Access-Control-Allow-Origin您只需在HeadersReceived 上添加http 标头。

chrome.webRequest.onHeadersReceived.addListener(function onHeadersReceived(resp) {
  resp.responseHeaders.forEach(function forEachHeader(header, index) {
    if(header.name.toLowerCase() === "access-control-allow-origin") {
      resp.responseHeaders[index].value = "*";
    }
  });
  resp.responseHeaders[resp.responseHeaders.length] = {
    "name":"Access-Control-Allow-Origin",
    "value":"*"
  };
  return {responseHeaders: resp.responseHeaders};
}, {
  urls: [
  //chrome-extension://jkafskjifsf/cocoon_page_proxy.html
    chrome.extension.getURL('') + 'cocoon_page_proxy.html',
   '*://your.api.endpoint.domain.com/*'
  ] ,
  types: [
    'sub_frame'
  ]
}, ['blocking', 'responseHeaders']);

尝试将其添加到您的背景页面。如果您没有后台页面,请将其添加到您的 manifest.json 并创建关联文件:

"background": {
  "scripts": [ "background.js" ]
}

您还需要将这些项目添加到permissionsmanifest.json 文件中的现有列表中:

//"permissions": [
    "chrome-extension://<put_your_extension_id_here>/cocoon_page_proxy.html",
    "*://your.api.endpoint.domain.com/*",
    "webRequest",
    "webRequestBlocking"
//],

对于 URL,如*://your.api.endpoint.domain.com/*,添加您也需要发出 ajax 请求的任何 url。

请评论这是如何工作的,如果您遇到任何问题。

于 2012-10-05T04:33:27.657 回答