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

Gri*_*ung 1 javascript eval google-chrome-extension

我正在制作一个非常简单的chrome扩展程序,以随机更改c​​hromebook上的壁纸。但是我在加载Java脚本控制台时遇到了一个奇怪的错误:

拒绝将字符串评估为JavaScript,因为在以下内容安全策略指令中不允许使用'unsafe-eval'脚本源:“ script-src'self'blob:文件系统: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"
  ]
}
Run Code Online (Sandbox Code Playgroud)

这是我的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);
Run Code Online (Sandbox Code Playgroud)

看来它正在拒绝该setInterval()方法,但是那里没有eval甚至字符串。

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

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

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

Ber*_*rgi 5

setInterval,当传递非函数值时,将其作为代码字符串的第一个参数并eval对其进行处理。您正在传递的返回值xhr.send(),这的确不是函数。

通过使用解决

setInterval(function() { xhr.send(); }, interval);
Run Code Online (Sandbox Code Playgroud)

要么

setInterval(xhr.send.bind(xhr), interval);
Run Code Online (Sandbox Code Playgroud)

我想这也是您实际打算做的。