2013-03-19 28 views
7

私はGoogle Chrome拡張機能を使用しています。これは、一部の送信要求をブロック/リダイレクトする必要があります。この目的のために、私はchrome.webRequest.onBeforeRequestリスナーを使用します。 リクエストをブロックするかどうかを決めるには、タブリクエストに関する情報が必要です。 chrome.tabs.get(integer tabId, function callback)を使用して取得できますが、コールバックは非同期です。つまり、値がonBeforeRequestリスナーから返された後にコールされる可能性があります。Google Chrome拡張機能の同期呼び出し

chrome.webRequest.onBeforeRequest.addListener(function(details){ 
chrome.tabs.get(details.tabId, function(tab){ 
    // get info from tab 
}); 
// based on info from tab return redirect or not 
}), { 
urls: ["<all_urls>"], 
types: ["main_frame"] 
}, ["blocking"]); 

呼び出しを同期する方法はありますか?あるいは、他の選択肢かもしれません。

+0

が今までこれを理解? –

答えて

11

Another answer on Stack Overflowは、リスナー機能のの外側にあるの外側にあるこの問題を完全に回避することを推奨しています。

例コード:

/* 
* -------------------------------------------------- 
* Keep list of tabs outside of request callback 
* -------------------------------------------------- 
*/ 
var tabs = {}; 

// Get all existing tabs 
chrome.tabs.query({}, function(results) { 
    results.forEach(function(tab) { 
     tabs[tab.id] = tab; 
    }); 
}); 

// Create tab event listeners 
function onUpdatedListener(tabId, changeInfo, tab) { 
    tabs[tab.id] = tab; 
} 
function onRemovedListener(tabId) { 
    delete tabs[tabId]; 
} 

// Subscribe to tab events 
chrome.tabs.onUpdated.addListener(onUpdatedListener); 
chrome.tabs.onRemoved.addListener(onRemovedListener); 

/* 
* -------------------------------------------------- 
* Request callback 
* -------------------------------------------------- 
*/ 
// Create request event listener 
function onBeforeRequestListener(details) { 
    // *** Remember that tabId can be set to -1 *** 
    var tab = tabs[details.tabId]; 

    // Respond to tab information 
} 

// Subscribe to request event 
chrome.webRequest.onBeforeRequest.addListener(onBeforeRequestListener, { 
    urls: ["<all_urls>"], 
    types: ["main_frame"] 
}, ["blocking"]); 
+0

乾杯。私はこれに恩恵を加えました。なぜなら、私はexecuteScriptに同様の問題があったため、これが道のりでした。 (私はrequestListenersのいくつかの再バインドも必要でしたが) –

+1

これはパフォーマンスにどのような影響を及ぼしますか?私はこのメソッドを使用することに切り替えましたが、それは私にとってはうまくいくものですが、多くのタブを持つユーザーのパフォーマンスに関する不安は感じられます。 – regularjoe

関連する問題