9

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

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"]);

通話を同期する方法はありますか? または、他のオプションかもしれません。

4

2 に答える 2

13

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"]);
于 2014-02-26T21:43:42.797 に答える