0

我正在学习为 Google Chrome 开发浏览器操作扩展,并将 javascript 功能拆分为多个文件。在 popup.html 文件中,脚本资源的定义如下

<script src="js/Identity.js"></script>
<script src="js/View.js"></script>

View.js 需要调用从 Identity.js 暴露出来的对象的方法,并传递一个回调函数来通知该过程完成时。但是,Chrome 似乎会中断执行。

拒绝评估脚本,因为它违反了以下内容安全策略指令:“script-src 'self'”

据我了解,谷歌声明该政策是为了防止将任意字符串评估为可执行的逻辑块。但是我在我的对象之间传递实际函数,所以我不太确定这里必须纠正什么?

IdentityObj.Process = function (params, callback) {
  doSomeWork();
  setTimeout(callback(true), 1000); // break here
};

从 View 对象,一个例子是

View.loginClick = function(event) {
        event.preventDefault();
        this.loggingInState();

        var emailAddr = $('#emailAddr').val();
        var password = $('#password').val();
        IdentityObj.login(emailAddr, password, this.loginCallback.bind(this));
    };

View.loginCallback = function(success) {
        if (success) { this.usageState(); }
        else { this.errorState(); }
    };
4

1 回答 1

2

我的同事提出了这个问题并解释了它,所以现在我明白你指的是什么了。

我在 setTimeout() 定义中直接执行回调函数,所以 setTimeout() 接收到 callback(true) 的结果,而不是回调本身。这将需要一个 eval 并因此触发 Chrome 安全策略。

callback() 的执行必须包含在函数声明中。

IdentityObj.Process = function (params, callback) {
  doSomeWork();
  setTimeout(function(){callback(true)}, 1000); // break here
};
于 2012-09-26T02:10:10.310 回答