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'"

私が理解していることから、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(); }
    };
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 に答える