我正在学习为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'”
根据我的理解,Google声明该策略是为了防止任意字符串被评估为可执行的逻辑块。但是我在我的对象之间传递实际函数,所以我不太清楚这里必须纠正什么?
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(); }
};
答案 0 :(得分:2)
我的同事解决了问题并对其进行了解释,所以现在我明白了你的意思。
我在setTimeout()定义中直接执行回调函数,因此setTimeout()接收回调结果(true)而不是回调本身。那将需要一个eval,从而触发Chrome安全策略。
callback()的执行必须包含在函数声明中。
IdentityObj.Process = function (params, callback) {
doSomeWork();
setTimeout(function(){callback(true)}, 1000); // break here
};