2013-03-19 16 views
7

Bazı giden istekleri engellemesi/yeniden yönlendirmesi gereken Google Chrome uzantısında çalışıyorum. Bu amaçla chrome.webRequest.onBeforeRequest dinleyiciyi kullanıyorum. Kararın engellenip engellenmeyeceğine karar vermek için, sekme isteği ile ilgili bazı bilgilere ihtiyacım var. chrome.tabs.get(integer tabId, function callback) kullanarak alabilirim, ancak geri arama eşzamansızdır, yani onBeforeRequest dinleyiciden değer döndükten sonra çağrılabilir.Google Chrome uzantısında senkronize çağrı

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

Aramayı senkronize etmenin bir yolu var mı? Ya da belki başka bir seçenek.

+0

hiç bu anlamaya? –

cevap

11

Another answer on Stack Overflow, bu işlevi tamamen ortadan kaldıran dış dinleyicisi işlevinizin dışında sekmelerini izlemenizi önerir.

örnek kod:

/* 
* -------------------------------------------------- 
* 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

Şerefe. Buna bir ödül ekledim, çünkü executeScript ile benzer bir sorun yaşadım ve işte bu yol buydu. (Yine de, istekListenlerinin bazılarının yeniden yüklenmesini yapmak zorunda kalmamıza rağmen) –

+1

Bunun performansa etkisi nedir? Bu yöntemi benim için 'sadece çalışıyor' olarak değiştirdim, ancak çok sayıda sekmesi olan kullanıcılar için performans sorunları hakkında huzursuz bir his var. – regularjoe