2013-10-14 11 views
9

Vorrei simulare l'effetto di window.location.reload(), ma solo per il "mondo isolato" in cui è in esecuzione lo script di contenuto. Cioè, rimuovere tutto il JS esistente, in particolare i callback e l'evento binding. C'è un bel modo per farlo?Ricarica di un ambiente di esecuzione script di contenuto estensioni di Chrome

Nota: chrome.runtime.reload() non funziona per questo; ha l'effetto di ricaricare l'estensione e lo script di sfondo, ma non ricarica gli script di contenuto esistenti finché l'utente non si aggiorna.

risposta

4

Per quanto posso dire, non esiste un modo automatico per reiniettare gli script di contenuto, ad esempio durante un aggiornamento di estensione. Quello che puoi fare è trovare tutte le schede il cui url corrisponde al modello che ti serve e reiniettare a livello di codice gli script del contenuto usando chrome.tabs.executeScript.

Si noti che questo metodo richiede l'aggiunta di un'autorizzazione per lo stesso pattern URL di quello utilizzato dallo script di contenuto.

manifest.json:

"content_scripts":  
[ 
    { 
     "matches": [ "http://*.google.com/*" ], 
     "js": [ "content_script.js" ] 
    } 
], 
"permissions":   
[ 
    "tabs", "http://*.google.com/*" 
] 

Background.js:

chrome.runtime.reload(); 
chrome.tabs.query({ url: "http://*.google.com/*" }, function(tabs) 
{ 
    for(var i = 0; i < tabs.length; i++) 
    { 
     chrome.tabs.executeScript(tabs[i].id, { file: "content_script.js" }, function() {}); 
    } 
}); 
+1

Il problema è che questo lascia il contesto esistente intatta. Se avvii un setInterval in un executeScript, verrà comunque eseguito dopo il prossimo executeScript. –

+0

Quando il secondo script di contenuto viene eseguito una seconda volta, si ha accesso alle variabili precedenti, quindi è possibile ripristinare tutto. –

+0

@Metoule Non è possibile accedere alle variabili precedenti quando si esegue l'iniezione dopo aver ricaricato l'estensione da 'chrome: // extension'. Hai provato questo? – vaughan

Problemi correlati