1

GoogleClosureCompilerでchrome.webRequest.onBeforeRequest.addListenerコード行をコンパイルしているときに問題が発生しました。

サンプルhttps://developer.chrome.com/extensions/samples.html#12a7bf1490a26359eadf10917e37c5b9のCatBlock拡張機能からコード例を取得し、いくつかのコンパイラーパラメーターを追加しました。

// ==ClosureCompiler==
// @output_file_name extension.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// @externs_url http://closure-compiler.googlecode.com/git/contrib/externs/chrome_extensions.js
// ==/ClosureCompiler==

chrome.webRequest.onBeforeRequest.addListener(
function(info) {
    console.log("Cat intercepted: " + info.url);
    // Redirect the lolcal request to a random loldog URL.
    var i = Math.round(Math.random() * loldogs.length);
    return {redirectUrl: loldogs[i]};
},
// filters
{
    urls: ["https://i.chzbgr.com/*"],
    types: ["image"]
},
// extraInfoSpec
["blocking"]);

クロージャコンパイラは2つのJSC_TYPE_MISMATCH警告を発生させ、BlockingResponseタイプとRequestFilterタイプを必要とします。APIリファレンスhttps://developer.chrome.com/extensions/webRequest.htmlによると、どちらもオブジェクトですが、コンパイラが渡したオブジェクトを拒否するのはなぜですか?

chrome_extensions.jsを調べたところ、BlockingResponseタイプとRequestFilterタイプ用の独自のコンストラクターがありますが、ブラウザーにはありません。

また、このオブジェクトを変数に割り当て、注釈を使用して型を定義しようとしました。

/** @type {!BlockingResponse} response */
var response = {redirectUrl: loldogs[i]};

/** @type {!RequestFilter} filter */
var filter= {urls: ["https://i.chzbgr.com/*"], types: ["image"]};

これは役に立たず、適切な方法ではないようです。

誰かが私が間違っていることを説明できますか?

よろしくお願いします。

4

1 に答える 1

0

警告を削除するには、戻り値を型キャストする必要があります。

// ==ClosureCompiler==
// @output_file_name extension.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// @externs_url http://closure-compiler.googlecode.com/git/contrib/externs/chrome_extensions.js
// ==/ClosureCompiler==

chrome.webRequest.onBeforeRequest.addListener(
  function(info) {   
    console.log("Cat intercepted: " + info.url);
    // Redirect the lolcal request to a random loldog URL.
    var i = Math.round(Math.random() * loldogs.length);
    return /** @type {!BlockingResponse} */ ({redirectUrl: loldogs[i]});
},
// filters
/** @type {!RequestFilter} */ 
({
    urls: ["https://i.chzbgr.com/*"],
    types: ["image"]
}),
// extraInfoSpec
["blocking"]);

余分な括弧に注意してください

この使用法では、externが戻りタイプのを指定した方が良いでしょうが、BlockingResponse|Object.<string,*>そのためにclosure-compilerプロジェクトに問題を提出する必要があります。

于 2013-03-23T12:12:43.257 に答える