如何从content_script向外部站点发出请求

时间:2012-12-24 00:24:54

标签: javascript ajax google-chrome-extension same-origin-policy content-script

我正在尝试制作一个Chrome扩展程序,它会在我的Gmail中显示一个弹出窗口,其中包含来自我的外部服务器的一些信息,比如今天的天气。

我尝试了什么

  1. 我尝试在Chrome扩展程序中包含js,但是然后尝试对我的服务器进行AJAX调用违反了同源策略。所以这个选项不起作用。
  2. 然后我尝试将js文件保存在服务器上并在页面加载时加载它。
  3. 我的manifest.json看起来像这样:

    {
      "name": "cvnosnvsdionfois",
      "version": "0.1.0",
      "manifest_version": 2,
      "description": "sldnfksdngsdngods",
      "browser_action": {
        "default_icon": "images/icon.png"
      },
      "permissions": [
        "http://api.flickr.com/", "webRequest",
        "tabs", 
        "http://*localhost:8080*"
      ],
     "content_scripts": [
        {
          "matches": ["https://mail.google.com/*"],
          "js": ["http://localhost:8080/static/response.js"]
        }
      ]
    }
    

    我在其他地方读过内容脚本不能包含在外部URL中,因此我认为这不起作用。这里有什么正确的方法。如何在Gmail中运行一些可以从我的服务器请求信息的JavaScript代码?例如,Smartr如何做到这一点?

1 个答案:

答案 0 :(得分:1)

我不确定为什么Cross-Origin XMLHttpRequest不能正常工作,因为Extensions并不像普通网页那样有限,可以使用XMLHttpRequest对象从远程服务器发送和接收数据并且受限于same origin policy。扩展可以与其来源之外的远程服务器通信,只要它首先请求跨源权限。

参考文献:

示范

此示例代码使用背景页面为另一个域创建XHR。

的manifest.json

我确保清单具有所有可用权限,并且还注册了背景页。

{
  "name": "Demo",
  "description": "Sample Message Communication",
  "version": "1",
  "permissions": [
    "<all_urls>"
   ],
  "background": {
    "scripts": ["background.js"]
  },

  "manifest_version": 2
}

background.js

此示例代码请求一些随机的asp页面

function makeXHR() {

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function (data) {
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
                  console.log("Response is received");
            }
        } else {
            //callback(null);
        }
    }

    var url = 'http://www.w3schools.com/html/default.asp';
    xhr.open('GET', url, true);
    xhr.send();

}
document.addEventListener("DOMContentLoaded", makeXHR);