高阶函数导致chrome扩展中的不安全eval

时间:2016-03-04 04:45:20

标签: javascript google-chrome-extension eval

我正在制作一个非常简单的镀铬扩展程序来随机更改我的chromebook上的壁纸。但是我在加载它后在Javascript控制台中收到一个奇怪的错误:

  

拒绝将字符串评估为JavaScript,因为'unsafe-eval'不是以下内容安全策略指令中允许的脚本源:“script-src'self'blob:filesystem:chrome-extension-resource:”。 @ background.js:27

这是我的manifest.json:

{
  "manifest_version": 2,

  "name": "Abyss Wallpapers for Chrome OS",
  "description": "Sets the Chrome OS wallpaper to a random wallpaper from the
                      Wallpaper Abyss (wall.alphacoders.com), once a minute",
  "version": "1.0",
  "background":
  {
    "scripts":["background.js"]
  },
  "permissions": [
    "wallpaper",
    "https://wall.alphacoders.com/api2.0/",
    "background"
  ]
}

这是我的background.js:

var baseUrl = "https://wall.alphacoders.com/api2.0/get.php?"
var apiKey = "c160c64ef4c79e61e325ddf944183dfe"
var params = "auth=" + apiKey + "&method=random"
var interval = 30000;
var xhr = new XMLHttpRequest();
xhr.open("GET", baseUrl + params, true);
xhr.onreadystatechange = function()
{
  if (xhr.readyState == 4 && xhr.status == 200)
  {
    var data = xhr.responseText;
    if (data.success)
    {
      chrome.wallpaper.setWallpaper
      (
        {url:data.wallpapers[1].url_image,
        layout:"CENTER_CROPPED",
        filename:data.wallpapers[1].id + "." + data.wallpapers[1].file_type},
        function(thumbnail)
        {
          thumbnail = null;
        }
      )
    }
  }
}
setInterval(xhr.send(), interval);

它似乎拒绝了setInterval()方法,但是没有eval甚至是字符串。

编辑:所以我更改了setInterval()语句以反映Bergi的答案,现在后台脚本运行了大约一分钟,这意味着设置了间隔,但之后又出现了另一个错误:

  

Uncaught InvalidStateError:无法在'XMLHttpRequest'上执行'send':对象的状态必须是OPENED。(匿名函数)@ background.js:27

为什么在第5行中专门调用xhr.open()时,对象不会打开?

2 个答案:

答案 0 :(得分:4)

setInterval,在传递非函数值时,获取代码字符串的第一个参数,并eval。您正在传递xhr.send()的返回值,这确实不是函数。

使用

解决此问题
setInterval(function() { xhr.send(); }, interval);

setInterval(xhr.send.bind(xhr), interval);
我猜这也是你真正打算做的事情。

答案 1 :(得分:0)

创建和.send() XHR后,您只能.open()一次。

如果您需要间隔执行此操作,则需要每次都重新创建XHR。