私はGoogle Chrome Extensionをコーディングしていますが、ここでバックグラウンドスクリプトからアプリのアイコンを設定しています):
_try
{
objIcon = {
"19": "images/icon19.png",
"38": "images/icon38.png"
};
chrome.browserAction.setIcon({
path: objIcon,
tabId: nTabID
});
}
catch(e)
{
}
_
呼び出しをtry/catchブロックでラップしたことに注意してください。
それでも、コンソールログに次のメッセージが表示されることがあります。
BrowserAction.setIconの実行中のruntime.lastErrorがチェックされていません:IDが11618のタブがありません。
Chromeタブを閉じたり再読み込みしたりした場合にのみ表示されるため、このエラーをデバッグするのは困難です。追跡するための行番号や情報がありません。さらに、デバッガーで簡単に実行できます(つまり、エラーが発生した瞬間にブレークポイントを設定できませんが、chrome.browserAction.setIcon()
行にブレークポイントを設定すると、メッセージが表示されませんログはもうありません。)
だから私は誰かがこのエラーを修正する方法を提案できるかどうか知りたいですか?
[〜#〜] edit [〜#〜]:アップデートを投稿するだけです。私はまだこの問題を解決できません。以下の@abrahamによって提案された提案はある程度機能するアプローチを提供しますが、それはnotフェイルセーフです。たとえば、タブが閉じている状況で、タブがまだ閉じていない場合は成功する可能性がある彼の提案するchrome.browserAction.setIcon()
を呼び出すことができますが、コールバック関数内では、最終的にタブが閉じて、連続する呼び出しが発生する可能性があります同じタブIDを必要とする他のいくつかのAPIに対して、たとえばsetBadgeBackgroundColor()
でも同じ_No tab with id
_例外が発生することがあります。言い換えれば、ネイティブプログラミングを知っている人にとって、これは古典的な競合状態状況です。そして、明らかにJSはスレッド同期メソッドを提供していないので、それがChromeのバグかどうかはわかりません...
テスト中にこの動作を何度か目撃しました。私たちは非常に正確なタイミング状況について話しているので、それは頻繁には起こりませんが、それは起こります。したがって、誰かが解決策を見つけた場合は、以下に投稿してください。
コールバックを含めて chrome.runtime.lastError を確認します。
objIcon = {
"19": "images/icon19.png",
"38": "images/icon38.png"
};
function callback() {
if (chrome.runtime.lastError) {
console.log(chrome.runtime.lastError.message);
} else {
// Tab exists
}
}
chrome.browserAction.setIcon({
path: objIcon,
tabId: nTabID
}, callback);