2010-10-22 19 views
9

Sto provando a bloccare un file di script dal caricamento su siti Web definiti dall'utente. Per bloccare un file di script sto usando beforeload event e event.preventDefault(); nello script di contenuto che funziona bene finché conosco già l'elenco dei siti web. Il mio problema è che non conosco l'elenco dei siti Web in anticipo, quindi per ottenere l'elenco dei siti Web sto inviando una richiesta alla pagina di sfondo, ma la risposta è asincrona e inutilizzabile.Passaggio sincrono dei messaggi nelle estensioni chrome?

C'è qualche sincrono messaggio che passa nelle estensioni di Chrome che forse non ho visto nei documenti di Google?

// my (simplified) code from content script: 
document.addEventListener("beforeload", function(event) 
{ 
    chrome.extension.sendRequest({fnc:"is_owner"}, function(response) 
    { 
    // asynchronous response is not usable because 
    // all scripts have already been loaded 
    if (response.is_owner) event.preventDefault(); 
    }); 
}, true); 
+1

Un altro [rapporto di errore] (https://code.google.com/p/chromium/issues/detail?id=135095&thanks=135095&ts=1340923674) dello stesso problema –

risposta

6

Purtroppo non c'è. C'è uno bug report aperto sulla mancanza di passaggio sincrono dei messaggi, forse se un numero sufficiente di persone lo farà, faranno qualcosa a riguardo.

+0

Grazie per il collegamento, l'ho fissato. –

+0

Il problema è ora chiuso come WontFix :( – cprcrack

1

È possibile utilizzare l'API del file HTML5 (navigator.webkitTemporaryStorage o il precedente deprecato window.webkitStorageInfo con l'opzione TEMPORARY) per memorizzare le impostazioni in un file. Questa parte è asincrona, ma puoi farlo dallo sfondo o dalla tua pagina delle opzioni o popup. Questa API può cambiare su di te dal momento che non è ancora standardizzata. Poiché si tratta di una memoria temporanea, potrebbe essere necessario eseguire la pagina di sfondo persistente per impedire a Chrome di eliminare il file.

Quindi dallo script di contenuto è possibile utilizzare XMLHttpRequest sincrono per ottenere il file da "filesystem:" + chrome.extension.getURL ("temporary /" + filename). Il prefisso "filesystem:" sull'URL è piuttosto importante.

La soluzione migliore consiste nell'utilizzare l'API chrome.storage (o localStorage) per le impostazioni e collegare l'evento onChanged da questo per aggiornare il file temporaneo. Se è necessario ricaricare la pagina dopo una modifica delle impostazioni, è necessario eseguirla nella richiamata dall'operazione di scrittura FileSystem in modo da sapere che lo script del contenuto può vedere la modifica.

Non richiede autorizzazioni speciali nel manifest. L'ho testato personalmente in chrome 35 ma so che ha funzionato anche nelle versioni precedenti. Non conosco il requisito della versione minima, tuttavia. Ricordo di aver visto una menzione di una regressione relativa al cambio di sicurezza in Chrome 33 in cui non funzionava, ma è stata risolta rapidamente.

Ho visto alcune altre soluzioni (ad esempio reindirizzamento a URI di blob o dati uri da onBeforeWebRequest) per ottenere le impostazioni negli script di contenuto prima degli script della pagina in esecuzione ma per quanto posso dire che sono stati tutti intenzionalmente rotto nelle versioni recenti di Chrome a causa di XSS generale e miglioramenti della sicurezza delle estensioni.

+0

in base alle tue conoscenze, è ancora una soluzione praticabile? –

Problemi correlati