2013-03-19 10 views
7

Sto lavorando sull'estensione Google Chrome, che deve bloccare/reindirizzare alcune richieste in uscita. A tale scopo, utilizzo il listener chrome.webRequest.onBeforeRequest. Per decidere se bloccare o meno la richiesta, ho bisogno di alcune informazioni sulla richiesta di tab da cui viene inviata. Posso ottenerlo usando chrome.tabs.get(integer tabId, function callback), ma il callback è asincrono, il che significa che può essere chiamato dopo che il valore è stato restituito dal listener onBeforeRequest.Chiamata sincrona in Google Estensione 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"]); 

C'è un modo per sincronizzare la chiamata? O forse qualche altra opzione.

+0

mai questo numero? –

risposta

11

Another answer on Stack Overflow consiglia di tenere traccia delle schede all'esterno della della funzione listener, che evita completamente questo problema.

codice Esempio:

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

Cheers. Ho aggiunto una taglia su questo perché ho avuto un problema simile con executeScript, e questa era la strada da percorrere. (Anche se dovevo fare anche un po 'di rebinding di requestListeners) –

+1

Che effetto ha questo sulle prestazioni? Ho deciso di utilizzare questo metodo perché funziona "per me", ma ho una sensazione spiacevole dei problemi di prestazioni per gli utenti con molte schede. – regularjoe